我可以在init和ctors中看到函数

时间:2017-05-11 02:39:49

标签: c gcc loader elf

我对前面关于.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文件中看到带有构造函数属性的函数吗?

  1. 如果我不使用构造函数属性,只需使用“Wl,-init,hello_init”编译它。当我使用objdump或readelf来转储so文件时,我仍然无法在.init部分看到hello_init的代码。这个标志真的把功能代码放到.init部分吗?若有,我有什么方法可以使用objdump或readelf来观察它?
  2. 我的.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没有放置那些函数指针?

0 个答案:

没有答案