在加载共享库时自动执行的函数中,我们读到:
要在加载或卸载共享库时执行函数,可以使用特定于GCC的属性语法标记构造函数和析构函数:
__attribute__((constructor)) void init(void) { ... } __attribute__((destructor)) void fini(void) { ... }
文章__attribute __((构造函数))如何工作? 还提到了.init/.fini
。
现在,我有一个.so
模块(一个共享的对象库,没有源),我想知道哪些函数是在库加载/卸载时执行的。 我尝试nm
,但它看起来像这些属性不显示在输出中。
那么, 如何知道在共享库加载或卸载时哪些函数会自动执行?
我仍然没有一般的答案,但这是我发现的:
该库有部分.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功能来选择指令集。
更多关于.init_array
和其他特殊部分