Linux .因此:需要找出加载时执行的函数

Linux .因此:需要找出加载时执行的函数,linux,gcc,android-ndk,shared-libraries,posix,Linux,Gcc,Android Ndk,Shared Libraries,Posix,在这本书中,我们读到: 要在加载或卸载共享库时执行函数,可以使用GCC特定的属性语法标记构造函数和析构函数: 本文还提到了.init/.fini 现在,我有一个.so模块(一个共享对象库,没有源代码),我想知道加载/卸载库时执行哪些函数。我尝试了nm,但输出中似乎没有显示这些属性 因此,如何知道在加载或卸载共享库时自动执行哪些函数?我仍然没有一般的案例答案,但我发现: 该库有.init\u数组和.fini\u数组两个部分。(没有.init或.ctors,只有YMMV。) 因此,看起来sub_F5

在这本书中,我们读到:

要在加载或卸载共享库时执行函数,可以使用GCC特定的属性语法标记构造函数和析构函数:

本文还提到了
.init/.fini

现在,我有一个
.so
模块(一个共享对象库,没有源代码),我想知道加载/卸载库时执行哪些函数。我尝试了
nm
,但输出中似乎没有显示这些属性


因此,如何知道在加载或卸载共享库时自动执行哪些函数?

我仍然没有一般的案例答案,但我发现:

该库有
.init\u数组
.fini\u数组
两个部分。(没有
.init
.ctors
,只有YMMV。)

因此,看起来
sub_F5C()
是初始化时唯一调用的函数。末尾的4个零字节实际上是一个零dword+1是用于选择指令集的ARM功能


您需要拆分节并将其反汇编。快速方法:使用构造函数/析构函数创建一个最小的dll,并使用命令nm--dynamic test.lib.so获得一个符号列表。查看
objdump--disassemble all--section=.ctors lib.so
。它应该包含加载共享库时执行的函数的地址。如果库是
dlopen
-ed插件,则加载应用程序有自己的约定,并将使用
dlsym
__attribute__((constructor)) void init(void) { ... }
__attribute__((destructor))  void fini(void) { ... }
; Segment type: Pure data
            AREA .init_array, DATA
            DCD sub_F5C+1
            DCB    0
            DCB    0
            DCB    0
            DCB    0
.init_array   ends