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

2024-03-20

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

我正在尝试重现本书的练习之一,但在我的可执行文件中没有这一部分。起初我以为问题是我正在编译 64 位,但现在我正在编译 32 位并且.dtors and .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 or .ctors

也许是这些部分__init_array_end, __init_array_start or __do_global_dtors_aux与行为有关.ctors and .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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在二进制文件中找到 .dtors 和 .ctors 的相关文章

随机推荐

  • 酿造服务。无法启动服务。得到“引导失败:5:输入/输出错误”

    running brew services start mongodb community产生 Bootstrap failed 5 Input output error Error Failure while executing bin
  • int(x[base]) 如何工作?

    以下代码的输出是 int 12 5 O P 7 int 0 5 O P 0 int 10 2 O P 2 我无法理解这一点 Python 文档中说 base 部分是可选的 即它可能需要一个或两个参数 第一个参数必须是一个在引号内具有 int
  • 在 Dockercontainer 中安装 MariaDB - 需要 MariaDB Connector/C >= 3.2.4,发现版本 3.1.16

    我尝试构建以下 Dockerfile FROM python 3 10 ENV TZ Europa Berlin install google chrome RUN wget q O https dl ssl google com linu
  • ng-change 不适用于 ng-select

    我正在使用一个由以下内容填充的选择框ng options 不幸的是 我无法得到我的ng change要调用的函数 这是我的小提琴 http jsfiddle net MTfRD 1097 这是我的js var myApp angular m
  • 什么是最好的 UTF [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Spring Boot 和 Netflix Zuul 的简单反向代理

    我正在寻找使用 Spring Boot 实现一个简单的反向代理 即 轻松添加路线 能够在每个路由的基础上添加自定义身份验证 根据需要添加其他标头 我查看了提供的设施 EnableZuulProxy注释 但它似乎太重量级了 因为我不想使用 E
  • html 表格中的等高缩放单元格

    当我进行此设计时 我在使用 HTML 表格时遇到了一些问题 左侧单元格是 rowspan 2 单元格 右侧两个单元格使用 height 50 属性 以下是预期的行为 Equal height cell 1 Scaling height ce
  • 为什么我的视图右上角有一个“加号”图标?

    我正在尝试为我的应用程序实现拖放功能LazyHGridview 当我尝试将视图放到另一个视图上时 视图的右上角会显示一个绿色圆圈内的 加号 图标 struct TestView View var d GridData Binding var
  • clrscr() 无法在 VC++(VS 2008) 中工作......?

    在 VS 2008 中 我在 VC 中创建了一个空项目 并添加了一个源文件作为 include
  • iOS 共享扩展不适用于图像网址

    我有一个使用这些规则的共享扩展
  • 什么时候应该使用布尔值而不是布尔值? [复制]

    这个问题在这里已经有答案了 什么时候应该使用布尔值而不是布尔值 我的意思是 为什么我想在应该包含 true 或 false 的变量中包含一个空值 大多数人 一个自发的答案是 如果该值未知 即 如果我们不知道该值是真还是假 但从编程的角度来看
  • 简单的域名正则表达式

    如何确保域名符合这 3 个简单标准 以 com net 结尾 不得以 http 或 https http www 或 https www 我已经设法理解了正则表达式的这一部分 它与第一个标准相对应 com net 但我不知道如何实现另外两个
  • 如何“执行”make文件

    我尝试在 code blocks 中使用 make 文件 但我做错了 我安装了包含编译器的版本 http sourceforge net projects codeblocks files Binaries 10 05 Windows co
  • Stripe 支付:来源与令牌/卡?

    我正在努力使用 stripe 设置定期付款 我正在使用react stripe elements来收集卡片信息 看起来有两种方法可以保存卡片供以后使用 this props stripe createToken this props str
  • 这个 gcc/clang 过去一指针比较行为符合还是非标准?

    尽管 C 标准明确认识到这样一种可能性 即指向 刚刚过去 一个对象的地址可能会偶然与指向 指向 另一个不相关对象的地址进行比较 但 gcc 和 clang 似乎都在假设没有指针的情况下进行操作观察到的指向刚刚经过一个对象的对象可能指向另一个
  • 在匿名块内显示选择结果

    我正在尝试调试过程中的 SELECT 并且我正在尝试使用匿名块 我希望 SQL Developer 只返回最后一个 SELECT 语句 但我收到错误 ORA 06550 line 21 column 5 PLS 00428 an INTO
  • 如何在 Dart 中创建私有变量?

    我想创建一个私有变量 但我不能 这是我的代码 void main var b new B b testB class A int private 0 testA print int value private private 5 class
  • Spritekit 动画没有改变

    我的游戏中有一个虚拟控制板 如果我点击并按住方向按钮之一 播放器就会朝正确的方向移动并显示正确的图像和动画 但是 如果我将手指从一个控件滑动到另一个控件 例如从右到下 播放器会向下移动 但图像和动画不会改变 直到我抬起手指 下面是我处理触摸
  • Logback:用 ******** 和最后两位数字替换 10 位数字

    我在我的模式 logback xml 中使用以下内容来替换日志中的 10 位数字 replace msg d 10 这种方法的一个问题是 它还匹配 11 位数字的前 10 位数字 有没有办法精确匹配10位数字 现在更大的问题是我需要显示这个
  • 无法在二进制文件中找到 .dtors 和 .ctors

    我正在读 黑客 剥削的艺术 一书 书中有一节解释了使用 dtors and ctors 我正在尝试重现本书的练习之一 但在我的可执行文件中没有这一部分 起初我以为问题是我正在编译 64 位 但现在我正在编译 32 位并且 dtors and