我对前面关于.init的讨论感到有些困惑 https://groups.google.com/forum/#!topic/gnu.gcc.help/Fit5UOU9UNs 因为,从互联网上我可以得到的所有讨论都表明:
使用“extern int hello_init()属性((构造函数));”不会将代码添加到.init部分,而是将其放入.ctors中的函数数组中,对吗?但是如果我编译示例代码:
#include <stdio.h>
extern int hello_init() __attribute__ ((constructor));
int hello_init()
{
printf("init hello\n");
return 0;
}
&LT;&LT;&LT;&LT;&LT; 如果我用“gcc -fPIC -shared -o libender.so test.c”编译它,使用objdump -x或-d 我看不到.ctors部分,我甚至无法在包含.init部分的文件中看到对__do_global_ctors_aux的任何调用。最新版本的GCC是否改变了它的行为?无论如何我可以从ELF文件中看到带有构造函数属性的函数吗?
我的.init节转储总是这样(无论使用Wl编译,-init还是使用构造函数属性):
反汇编部分.init:
00000000000005d0 <_init>:
5d0: 48 83 ec 08 sub $0x8,%rsp
5d4: 48 8b 05 05 0a 20 00 mov 0x200a05(%rip),%rax # 200fe0 <_DYNAMIC+0x1c8>
5db: 48 85 c0 test %rax,%rax
5de: 74 05 je 5e5 <_init+0x15>
5e0: e8 2b 00 00 00 callq 610 <__gmon_start__@plt>
5e5: 48 83 c4 08 add $0x8,%rsp
5e9: c3 retq
如果我在C文件中使用该属性并使用Wl编译,则init。我确实看到hello_init在main之前调用了两次。但是,我如何在ELF文件中观察它们,GCC没有放置那些函数指针?