.init_array
时间: 2023-06-24 09:07:37 浏览: 99
`.init_array` 是一个特殊的节(section),用于存储在程序启动时需要执行的全局构造函数(constructor)的地址列表。在程序启动时,操作系统会将该节中列出的所有函数的地址依次调用,以完成全局变量的初始化和其他一些需要在程序启动时完成的操作。这个过程是由 C 运行时库启动代码实现的。
`.init_array` 节通常由编译器自动生成,并在可执行文件的链接阶段被链接器放置在适当的位置。在 Linux 系统中,`.init_array` 节通常位于可执行文件的 `.init` 节之后,`.fini_array` 节之前。
相关问题
如何查看so文件.init_array
在Linux系统中,可以使用objdump命令来查看.so文件的.init_array段。
具体步骤如下:
1. 打开终端,进入.so文件所在的目录。
2. 输入以下命令,查看.so文件的.init_array段的地址:
```
objdump -x your_library.so | grep .init_array
```
3. 输出结果中的地址就是.init_array段的地址,例如:
```
0000000000003f38 l O .init_array 0000000000000008 your_library_init
```
其中,0000000000003f38就是.init_array段的地址。
4. 输入以下命令,查看.init_array段的内容:
```
objdump -s -j .init_array your_library.so
```
5. 输出结果即可查看.init_array段的内容。
#define NSD_INIT(fn) __attribute__((section(".init_array"))) typeof(fn) *__##fn = fn这个宏的作用
这个宏的作用是将函数 fn 加入到 .init_array 段中。.init_array 是一个特殊的段,其中包含了需要在程序启动时执行的函数指针列表。当程序启动时,操作系统会遍历这个列表,依次调用其中的函数。这个宏的实现依赖于 GCC 编译器的特性,__attribute__((section(".init_array"))) 用来指定函数所在的段。同时,为了避免函数名冲突,宏会生成一个以 __ 开头的新名字。