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

标签 c constructor destructor objdump nm

我正在阅读《黑客,剥削的艺术》一书。书中有一节解释了.dtors.ctors的使用。

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

#include <stdio.h>
#include <stdlib.h>

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。如果找不到任何部分,请尝试 objdump -dr -j .init_array a.out 或者您可以执行 readelf -S a.out 以列出所有部分。然后你会找到 .ctors 或(和).init_array

关于在二进制文件中找不到 .dtors 和 .ctors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16569495/

相关文章:

c++ - 为什么在我的析构函数中抛出时总是得到 "terminate called after throwing an instance of..."?

c++ - 调用析构函数的顺序和要点

c - 将数组从 perl 传输到 c

c - 从 STDIN 读取,鸡计划

c++ - 在模板类的复制构造函数中使用默认值时出错

c++ - 我可以显式调用类的构造函数和析构函数吗?

c++ - 我必须在自己的析构函数中手动重置 shared_ptr 吗?

c - 我怎样才能构建这棵树?

c - 在c中递归地从链表中删除元素时的无限链接循环

C++私有(private)构造类