Linker ELF针对本地段重新定位

Linker ELF针对本地段重新定位,linker,elf,ld,Linker,Elf,Ld,我正在尝试创建我自己的ELF.o文件,我想在其中写出指向其他内存条的内存条。我不想给每一条都起一个名字,所以我只是跟踪它们相对于所处章节开头的位置 因此,我以以下形式创建了一个重新安置条目: 000000000 A50 00090000000b R_X86_64_32S 0000000000000000.节+a70 其中,在a50处,我们使用64位全局指针引用.section+a70处的对象。本节的定义如下: 9:0000000000000000节本地默认值6 前面的输出来自readelf,它实

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

因此,我以以下形式创建了一个重新安置条目:

000000000 A50 00090000000b R_X86_64_32S 0000000000000000.节+a70

其中,在a50处,我们使用64位全局指针引用.section+a70处的对象。本节的定义如下:

9:0000000000000000节本地默认值6

前面的输出来自readelf,它实际上假装一切正常。。。直到我把它通过LD,这就是故障

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


到目前为止,我还有另一种选择,就是在每一节的开头创建一个对象符号,它包含了这样的对象,但这看起来很愚蠢。。。我是做错了什么,还是LD中有错误?

显然,我在符号表的
sh_info
字段中有一个off-by-1。我在GOLD的帮助下找到了答案,它不仅提供了更多信息,还提供了:

gold: internal error in do_layout, at ../../gold/object.cc:1493 gold:do_布局中的内部错误,位于.././gold/object.cc:1493 或

gold:错误:外部符号中的STB_本地符号无效 金色:错误:不支持的符号绑定0 gold:错误:外部符号中的STB_本地符号无效 金色:错误:不支持的符号绑定0 gold:错误:测试。o:对“”的多个定义 gold:测试。o:此处先前的定义
这有助于我确定我的本地符号最终出现在“外部符号”(意思是在存储在
sh_info
中的“第一个非本地符号的索引”之后)

显然,我在符号表的
sh_info
字段中有一个off-by-1。我在GOLD的帮助下找到了答案,它不仅提供了更多信息,还提供了:

gold: internal error in do_layout, at ../../gold/object.cc:1493 gold:do_布局中的内部错误,位于.././gold/object.cc:1493 或

gold:错误:外部符号中的STB_本地符号无效 金色:错误:不支持的符号绑定0 gold:错误:外部符号中的STB_本地符号无效 金色:错误:不支持的符号绑定0 gold:错误:测试。o:对“”的多个定义 gold:测试。o:此处先前的定义 这有助于我确定我的本地符号最终位于“外部符号”中(意思是在存储在
sh_info
中的“第一个非本地符号的索引”之后)