.eh_frame 和 .eh_frame_hdr 部分究竟存储了啥?

Posted

技术标签:

【中文标题】.eh_frame 和 .eh_frame_hdr 部分究竟存储了啥?【英文标题】:What do the .eh_frame and .eh_frame_hdr sections store, exactly?.eh_frame 和 .eh_frame_hdr 部分究竟存储了什么? 【发布时间】:2012-12-15 00:01:26 【问题描述】:

我知道,在使用支持异常的语言(例如 C++)时,必须向运行时环境提供附加信息,以描述在处理异常期间必须展开的调用帧。此信息包含在目标文件的特殊部分中,例如 .eh_frame.eh_frame_hdr

但是,这些部分中存储了什么样的数据结构?我的意思是,可以使用任何 C 结构来读取它们吗?它们与 GNU 汇编代码中的.cfi 语句(例如.cfi_startproc.cfi_endproc.cfi_offset.cfi_def_cfa_offset.cfi_personality.cfi_lsda)有什么关系吗?如果他们这样做,这些条款中的每一个在这些部分中导致什么? .eh_frame_hdr 部分与 .eh_frame 部分有什么关系?

我希望尽可能多地使用 C 结构进行解释。谢谢。

【问题讨论】:

【参考方案1】:

请看cfi-directives

它应该涵盖大部分相关部分的历史和理论。

关于eh_frame,它包含异常展开和源语言信息。本节中的每个条目都由单个 CFI(调用帧信息)表示

见,eh_frame in linuxfoundation

eh_frame_hdr,由 c++ 运行时代码用于访问 eh_frame。也就是说,它包含指针和二分查找表,可以有效地从 eh_frame 中检索信息。

现在,如果您想了解如何阅读/编写这些部分,那么我建议您查看以下链接器代码。

(寻找EhFrame.cpp, EhFrameHdr.cpp and EhFrameReader.cpp)

祝你好运!!

【讨论】:

mozilla 博客链接不见了。 在网络档案中找到这个:web.archive.org/web/20130111101034/http://blog.mozilla.org/…

以上是关于.eh_frame 和 .eh_frame_hdr 部分究竟存储了啥?的主要内容,如果未能解决你的问题,请参考以下文章

/tmp/ccQ0q0g5.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' collect2: ld returne

查看ELF信息

查看ELF信息

查看ELF信息

导出内联声明的类函数

CFI Directives调用栈信息指令