【问题标题】:ELF relocate against local sectionELF 重新定位到本地部分
【发布时间】:2011-10-14 09:55:58
【问题描述】:

我正在尝试创建自己的 ELF .o 文件,我想在其中写出指向其他内存条的内存条。我不想给每个条带起一个名字,所以我只是跟踪它们相对于它们所在部分的开头的位置。

所以我以以下形式创建了一个重定位条目:

000000000a50 00090000000b R_X86_64_32S 0000000000000000 .section + a70

在 a50 处,我们使用 64 位全局指针引用 .section + a70 处的对象。该部分使用以下方式定义:

9: 0000000000000000 0 SECTION LOCAL DEFAULT 6

之前的输出来自 readelf,它实际上假装一切都很好......直到我通过 LD 拉出它,这只是段错误。

我发现,如果我使用 WEAK 类型,它可以工作......但它似乎使用它在所有链接的 .o 文件中找到的第一个部分符号作为在这种情况下所有重定位的目标。我真的希望它是本地的,所以应该是本地的。

到目前为止,我的替代方法是在每个具有此类对象的部分的开头创建一个 OBJECT 符号,但这似乎很愚蠢......我做错了什么,还是 LD 中存在错误?

【问题讨论】:

    标签: linker elf ld


    【解决方案1】:

    显然我在符号表的sh_info 字段中有一个off-by-1。我在 GOLD 的帮助下解决了这个问题,这不仅提供了段错误,还提供了更多信息:

    金:do_layout 中的内部错误,位于 ../../gold/object.cc:1493

    金:错误:外部符号中的 STB_LOCAL 符号无效 金:错误:不支持的符号绑定 0 金:错误:外部符号中的 STB_LOCAL 符号无效 金:错误:不支持的符号绑定 0 金:错误:test.o:''的多个定义 金:test.o:以前的定义在这里

    这帮助我确定我的本地符号最终出现在“外部符号”中(意思是在“第一个非本地符号的索引”之后,存储在 sh_info 中)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2010-11-23
      • 2011-12-17
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      相关资源
      最近更新 更多