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

时间:2012-03-17 17:13:21

标签: linker-scripts

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

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

这两个标签是.text.rodata部分的边界,但我不知道如果未在链接描述文件中使用它们,为什么会有人定义这两个?

2 个答案:

答案 0 :(得分:2)

它们未在链接描述文件中使用,但它们被声明为外部变量并在gcc库中使用。拿出来,这就是:

.../gcc/config/arm/unwind-arm.c:614: undefined reference to `__exidx_start'
.../gcc/config/arm/unwind-arm.c:614: undefined reference to `__exidx_end'

答案 1 :(得分:2)

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

对于.ARM.exidx*-符号所包围的条目,它们形成了一个异常处理索引表,该表是C ++ ARM Exception Handling ABI (in sect. 4.4.1)的一部分。

相关问题