在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
,但看起来输出中没有显示这些属性。
那么, 如何知道在加载或卸载共享库时自动执行哪些功能?
答案 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功能。