无法在二进制文件中找到.dtors和.ctors

我正在读“黑客”这本书。 在书中有一节解释了.dtors.ctors

我正在尝试重现本书的一个练习,但在我的可执行文件中,我没有这一部分。 起初我认为问题是我正在编译64位,但现在我正在编译32位和.dtors.ctors仍未出现在节表中。 这是代码:

 #include  #include  static void miConstructor(void) __attribute__ ((constructor)); static void miDestructor(void) __attribute__ ((destructor)); int main(void) { printf("En main() \n"); return 0; } void miConstructor(void) { printf("En el constructor\n"); } void miDestructor(void) { printf("En el destructor\n"); } 

我正在编译:

  gcc -m32 -o a.out dtors_example.c 

这是nm的输出:

 080495f0 d _DYNAMIC 080496e4 d _GLOBAL_OFFSET_TABLE_ 080484dc R _IO_stdin_used w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable w _Jv_RegisterClasses 080485d8 r __FRAME_END__ 080495ec d __JCR_END__ 080495ec d __JCR_LIST__ 08049704 D __TMC_END__ 08049704 A __bss_start 080496fc D __data_start 080483c0 t __do_global_dtors_aux 080495e4 t __do_global_dtors_aux_fini_array_entry 08049700 D __dso_handle 080495dc t __frame_dummy_init_array_entry w __gmon_start__ 080484ba T __i686.get_pc_thunk.bx 080495e4 t __init_array_end 080495dc t __init_array_start 08048450 T __libc_csu_fini 08048460 T __libc_csu_init U __libc_start_main@@GLIBC_2.0 08049704 A _edata 08049708 A _end 080484c0 T _fini 080484d8 R _fp_hw 080482b8 T _init 08048320 T _start 08049704 b completed.5730 080496fc W data_start 08048350 t deregister_tm_clones 080483e0 t frame_dummy 0804840c T main 08048428 t miConstructor 0804843c t miDestructor U puts@@GLIBC_2.0 08048380 t register_tm_clones 

objdump的输出既不显示.dtors也不显示.ctors

也许__init_array_end__init_array_start__do_global_dtors_aux这些部分与.ctors.dtors的行为有关?

问题可能是gcc。 在gcc 4.7版本下可以生成.ctors部分,但是gcc 4.7使用.init_array而不是.ctors。 您可以通过执行下面列出的命令来确认这一点。 objdump -dr -j .ctors a.out.if没有找到任何部分,尝试objdump -dr -j .init_array a.out或者你可以这样做readelf -S a.out列出所有部分。 然后你会找到.ctors或(和).init_array。

使用带有-x选项的objdump命令可以查看完整的可用标头信息,符号表和重定位条目。

 objdump -x ./yourcommand