.so: 需要找出在加载时执行的函数(或函数)。
.so: 需要找出在加载时执行的函数(或函数)。
在加载共享库时自动执行的函数
当加载或卸载共享库时,您可以使用GCC特定的属性语法来标记构造函数和析构函数:
__attribute__((constructor)) void init(void) { ... } __attribute__((destructor)) void fini(void) { ... }
文章"How exactly does __attribute__((constructor)) work?"也提到了.init/.fini。
现在,我有一个.so模块(一个共享对象库,没有源代码),我想知道在加载/卸载库时执行了哪个函数。我尝试了nm,但似乎这些属性在输出中没有显示。
那么,我如何知道在加载或卸载共享库时自动执行哪个函数?
在这段内容中,我们可以看到库中有一个名为.init_array
的部分,其中包含一个函数sub_F5C()
。根据内容中的描述,这个函数是在初始化时被调用的唯一函数。通过观察代码中的4个零字节,我们可以看出这实际上是一个零双字;+1
是ARM的一个特性,用于选择指令集。
根据这些信息,我们可以得出问题的原因是在加载库时无法确定哪些函数会被执行。解决这个问题的方法是查看库中特定的部分,如.init_array
,以找出在加载时将被执行的函数。
更多关于.init_array
和其他特殊部分的信息可以在这里找到:http://www.sco.com/developers/gabi/latest/ch4.sheader.html#special_sections