.so:需要找出加载时执行的功能

时间:2014-08-19 12:13:47

标签: linux gcc android-ndk shared-libraries posix

Automatically executed functions when loading shared libraries中我们读到了:

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

__attribute__((constructor)) void init(void) { ... }
__attribute__((destructor))  void fini(void) { ... }

文章How exactly does __attribute__((constructor)) work?也提到.init/.fini

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

那么, 如何知道在加载或卸载共享库时自动执行哪些功能?

1 个答案:

答案 0 :(得分:0)

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

该库包含.init_array.fini_array个部分。 (没有.init.ctors,但YMMV。)

; Segment type: Pure data
            AREA .init_array, DATA
            DCD sub_F5C+1
            DCB    0
            DCB    0
            DCB    0
            DCB    0
.init_array   ends

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

More about .init_array and other special sections