为什么GCC编译的C程序需要.eh_frame部分?

2023-11-21

测试在 32 位 x86 Linux 上进行gcc 4.6.3

使用时gcc编译一个C程序和使用readelf要检查部分信息, 我可以看到.eh_frame部分和.eh_frame_hdr里面的部分。

例如,这是二进制程序的部分信息Perlbench.

readelf -S perlbench

There are 28 section headers, starting at offset 0x102e48:

Section Headers:
[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
[ 0]                   NULL            00000000 000000 000000 00      0   0  0
[ 1] .interp           PROGBITS        08048154 000154 000013 00   A  0   0  1
[ 2] .note.ABI-tag     NOTE            08048168 000168 000020 00   A  0   0  4
[ 3] .note.gnu.build-i NOTE            08048188 000188 000024 00   A  0   0  4
[ 4] .gnu.hash         GNU_HASH        080481ac 0001ac 000044 04   A  5   0  4
[ 5] .dynsym           DYNSYM          080481f0 0001f0 0007b0 10   A  6   1  4
[ 6] .dynstr           STRTAB          080489a0 0009a0 0003d6 00   A  0   0  1
[ 7] .gnu.version      VERSYM          08048d76 000d76 0000f6 02   A  5   0  2
[ 8] .gnu.version_r    VERNEED         08048e6c 000e6c 0000a0 00   A  6   2  4
[ 9] .rel.dyn          REL             08048f0c 000f0c 000028 08   A  5   0  4
[10] .rel.plt          REL             08048f34 000f34 000388 08   A  5  12  4
[11] .init             PROGBITS        080492bc 0012bc 00002e 00  AX  0   0  4
[12] .plt              PROGBITS        080492f0 0012f0 000720 04  AX  0   0 16
[13] .text             PROGBITS        08049a10 001a10 0cf86c 00  AX  0   0 16
[14] .fini             PROGBITS        0811927c 0d127c 00001a 00  AX  0   0  4
[15] .rodata           PROGBITS        081192a0 0d12a0 017960 00   A  0   0 32
[16] .eh_frame_hdr     PROGBITS        08130c00 0e8c00 003604 00   A  0   0  4
[17] .eh_frame         PROGBITS        08134204 0ec204 01377c 00   A  0   0  4
[18] .ctors            PROGBITS        08148f0c 0fff0c 000008 00  WA  0   0  4
[19] .dtors            PROGBITS        08148f14 0fff14 000008 00  WA  0   0  4
[20] .jcr              PROGBITS        08148f1c 0fff1c 000004 00  WA  0   0  4
[21] .dynamic          DYNAMIC         08148f20 0fff20 0000d0 08  WA  6   0  4
[22] .got              PROGBITS        08148ff0 0ffff0 000004 04  WA  0   0  4
[23] .got.plt          PROGBITS        08148ff4 0ffff4 0001d0 04  WA  0   0  4
[24] .data             PROGBITS        081491e0 1001e0 002b50 00  WA  0   0 32
[25] .bss              NOBITS          0814bd40 102d30 002b60 00  WA  0   0 32
[26] .comment          PROGBITS        00000000 102d30 00002a 01  MS  0   0  1
[27] .shstrtab         STRTAB          00000000 102d5a 0000ec 00      0   0  1

根据我的理解,这两个部分用于处理异常,它生成描述如何展开堆栈的表。

但它是为了C++程序,他们使用eh_frame and gcc_exception_table部分来管理异常,那么为什么编译器将eh_frame and eh_frame_hdr里面的部分ELF编译自C程序?


首先,最初的原因很大程度上是政治性的——添加基于 DWARF 的展开的人们(.eh_frame)希望它成为一个始终存在的功能,因此它可以用于实现除 C++ 异常之外的各种内容,包括:

  • backtrace()
  • __attribute__((__cleanup__(f)))
  • __builtin_return_address(n), for n>0
  • pthread_cleanup_push,实施方式为__attribute__((__cleanup__(f)))
  • ...

但是,如果您不需要这些东西,.eh_frame大约增加 15-30%.text大小没有任何好处。您可以禁用生成.eh_frame with -fno-asynchronous-unwind-tables对于单个翻译单元,这基本上消除了大小成本,尽管您仍然有一些剩余的crtbegin.o等你cannot剥掉它们strip稍后指挥;自从.eh_frame是存在于程序的已加载部分中的一个部分(这就是重点),剥离它会以在运行时破坏它的方式修改二进制文件。看https://sourceware.org/bugzilla/show_bug.cgi?id=14037举个例子来说明事情是如何崩溃的。

请注意,DWARF 表也用于调试,但为此目的,它们不需要位于程序的可加载部分。使用-fno-asynchronous-unwind-tables不会破坏调试,因为只要-g也传递给编译器,表仍然生成;它们只是存储在二进制文件的一个单独的、不可加载的、可剥离的部分中,.debug_frame.

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

为什么GCC编译的C程序需要.eh_frame部分? 的相关文章

随机推荐

  • 如何在数据框中添加一列来说明每行来自哪个工作表名称? Python

    我正在使用一个有五张纸的数据框 我想使用其中的四张 所以我可以将其加载到 df pd read excel xls sheet name a b c d 但现在我想添加一列来说明每行所在的工作表 但我不知道如何执行此操作 我尝试过这样的事情
  • Google-api-php 刷新令牌返回 invalid_grant

    我几乎搜索了谷歌第一页的所有结果 但似乎找不到答案 我正在使用 Google API 的刷新令牌并接收 Error refreshing the OAuth2 token message error invalid grant 我在做什么
  • 日期格式转换javascript

    我正在尝试使用 javascript 将 2013 年 7 月 24 日 转换为 DD MM YYYY 但我不断收到错误消息 我在用new Date July 24 2013 format DD MM YYYY 我缺少什么 Date对象没有
  • Python3.4 错误 - 无法启用可执行堆栈,因为共享对象需要:无效参数

    我一直在尝试安装OpenCV在 Windows 上的 Bash Linux 的 Windows 子系统 wsl 环境中 事实证明这非常困难 我想我已经非常接近了 但是进入 python 后 import cv2给出以下错误 ImportEr
  • 在文档 (.docx) 的特定位置添加图像?

    我使用 Python docx 生成 Microsoft Word 文档 用户希望当他写下这样的内容时 大家早上好 这是我的 profile img s 你喜欢吗 在 HTML 字段中 我创建一个 Word 文档 并从数据库中恢复用户的图片
  • 按值对数组进行排序并存储在变量中

    array array 5 4 6 8 5 3 4 6 1 我想排序 array like asort确实如此 但问题是asort是一个函数 它的乘积不能存储在变量中 我怎样才能做这样的事情 array array 5 4 6 8 5 3
  • 如何在 TextView 中的每个单词上使用 onTouchListeners?

    我想将 onTouchListeners 分配给 TextView 中的每个单词 不是链接到互联网上的某些内容 而是为了继续应用程序内的游戏逻辑 此时我的游戏的一般操作是查看 TextView 触摸一个单词 如果它是您获胜的目标单词 否则根
  • 如何从类函数内部访问对象属性[重复]

    这个问题在这里已经有答案了 我的 Javascript 类之一有时需要用 Json 更新 我一直在做一个函数 在给定一个 id 的情况下更新数据数组 但现在我想把它做得更封装 函数更新 在类内部 我做了什么 function File da
  • Angular 2 使用 FormBuilder 访问嵌套 FormArray

    首先 我刚刚从 Angular 2 开始 我正在尝试构建一个嵌套表单并验证它 这是我的 ts 文件的一部分 ngOnInit this myForm this formBuilder group projects this formBuil
  • JavaScript 的正则表达式表示法有什么问题?

    我正在读道格拉斯 克罗克福德的网页 JavaScript 世界上最容易被误解的编程语言 我不禁注意到 在 设计错误 下 他提到了 文字正则表达式的符号 他到底在说什么 JavaScript 的正则表达式表示法有什么问题 为什么 可能与它迫使
  • 将取消引用的智能指针的地址传递给需要原始指针的函数

    假设我正在使用需要使用原始指针的库或框架 使用拥有一些数据的智能指针 然后将取消引用的智能指针的地址传递给需要原始指针的函数 这是有效的做法吗 是的 这是有效的做法 这std智能指针有一个get 成员函数正是为了这个目的 一般来说 当您通过
  • UDF 中的 COLLATE 未按预期工作

    我有一个带有文本字段的表格 我想选择文本全部大写的行 该代码按其应有的方式工作 并返回ABC SELECT txt FROM SELECT ABC AS txt UNION SELECT cdf t WHERE txt COLLATE SQ
  • 只保留字符串中的前 n 个字符?

    JavaScript 有没有办法删除字符串的末尾 我只需要保留字符串的前 8 个字符并删除其余的 const result Hiya how are you substring 0 8 console log result console
  • 在 C++ 中,有什么理由用 for(;condition;) 替换 while(condition) 吗?

    好像 while condition do stuff 完全等价于 for condition do stuff 有什么理由使用后者而不是前者 没有good据我所知原因 您使用不增加任何内容的 for 循环故意误导人们 Update 根据O
  • ASP.NET MVC 4.5.2 连接到 IdentityServer4

    我有一个在 ASP NET MVC 4 5 2 上运行的网站 我有一个 IdentityServer4 服务器正在运行 但是当我尝试对其进行身份验证时 我得到 invalid request 对于 ASP NET Core MVC文档 ha
  • 图像未在 React 中加载

    无法显示图像 出现未找到错误 但我已经提供了它的完整路径 我不知道我哪里错了 class App extends React Component render return div h1 hello h1 img src home priy
  • 我应该在配置文件之外使用 env() 吗?

    我偶然发现了这个https laravel com docs 5 4 configuration configuration caching在文档中 这让我有点困惑 当我想要一个环境变量时 我使用 env 函数返回我想要的内容 根据上面的链
  • postgres 上慢速选择不同查询

    我在一个基本上收集日志信息的表上经常执行以下两个查询 两者都从大量行中选择不同的值 但其中的不同值少于 10 个 我分析了该页面完成的两个 不同 查询 marchena gt explain select distinct auditrec
  • 如何将月份格式化为 mmm 格式?

    我正在尝试使用 VBA 在 Excel 中格式化日期 即当前月份mmm格式 不知何故 我得到的是上个月 而不是当前月份 我查了一下 我的电脑月份是二月 但我得到的是一月 这是我的代码 Cells 1 2 Format month Date
  • 为什么GCC编译的C程序需要.eh_frame部分?

    测试在 32 位 x86 Linux 上进行gcc 4 6 3 使用时gcc编译一个C程序和使用readelf要检查部分信息 我可以看到 eh frame部分和 eh frame hdr里面的部分 例如 这是二进制程序的部分信息Perlbe