[关闭]
@ltlovezh 2020-08-28T14:50:42.000000Z 字数 1096 阅读 1100

so相关

C++


Android7.0开始限制了APP动态加载so的能力:只能加载NDK公开的library,未公开的library,Android系统并不保证所有版本之间的兼容性,所以使用非公开API的APP可能在某个系统版本是好的,但是其他一些版本会Crash。

这将影响System.loadLibrary和dlopen,加载私有库,都会失败。

针对libstagefright_soft_aacenc.so、libstagefright_soft_aacdec.so、libstagefright_soft_avcenc.so、libstagefright_soft_avcdec.so等私有的软件加解密库。

在Android7.0以下,都可以通过dlopen加载到,但是Android7.0及以上都是无法加载到。

NDK Apps Linking to Platform Libraries
fake-dlopen

so依赖关系

  1. aarch64-linux-android-readelf -dW libMyLibrary.so

android-classyshark

ELF

elf视图

左边是ELF的链接视图,可以理解为是.o目标代码文件或者链接后的.so(共享库)的内容布局。右边是ELF的执行视图,可以理解为可执行文件的内容布局。
注意目标代码文件的内容是由section组成的,而可执行文件的内容是由segment组成的。

链接器把ELF文件看成是Section的集合,而加载器把ELF文件看成是Segment的集合。

链接视图:
静态链接器(即编译后参与生成最终ELF过程的链接器,如ld )会以链接视图解析ELF。编译时生成的 .o(目标文件)以及链接后的 .so (共享库)均可通过链接视图解析,链接视图可以没有段表(如目标文件不会有段表)。
执行视图:
动态链接器(即加载器,如x86架构 linux下的 /lib/ld-linux.so.2或者安卓系统下的 /system/linker均为动态链接器)会以执行视图解析ELF并动态链接,执行视图可以没有节表。

找出一个Section
先找到section header,然后根据其中的section地址偏移和size,读出section内容。

参考文章

  1. 计算机那些事(4)——ELF文件结构
  2. ELF文件解析(一):Segment和Section
  3. ELF文件解析(二):ELF header详解
  4. ELF格式探析之三:sections
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注