'__exidx_start'和'__exidx_end'他们做了什么?

71G*_*1GA 7 linker-scripts

您好我有一个链接器脚本,我在其中找到了这个代码" __exidx_start = .;",它将标签值设置为位置计数器" ." 的值.此标签不在同一链接描述文件中的任何位置使用.

在第一个下方有一个类似的标签定义了几行,它的定义方式与" __exidx_end = .;" 相同.

这两个标签是边界.text.rodata部分,但我不知道为什么有人会定义这两个,如果他们没有在链接器脚本中使用?

And*_* D. 5

这些符号由 GCC 中的调用链展开机制在内部使用,该机制在异常处理阶段进行控制。例如,在unwind-arm-common.inc:104中有一个例子, 其中异常处理表的边界是作为指向这些符号的指针获得的。

至于.ARM.exidx*符号括起来的 -entries,它们形成一个异常处理索引表,它是C++的ARM 异常处理 ABI(第 4.4.1 节)的一部分。


2020 年 5 月 20 日更新

回答@pixelou 的问题:
这些部分与调试无关,但构成了异常展开机制的基础。剥离这些*.exidx*部分会导致无法清理混乱,迫使程序abort(完全失败)而不是准确处理堆栈上的无效状态。如果没有这些展开信息,程序的行为就像是用-fno-exceptionsoption构建的。