我正在尝试创建自己的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文件中找到的第一个部分符号作为所有重定位的目标。我真的希望它是本地的,所以应该是LOCAL。
我到目前为止的替代方案是在每个具有此类对象的部分的开头创建一个OBJECT符号,但这看起来很傻......我做错了什么,或者LD中有错误?
答案 0 :(得分:1)
显然,我在符号表的sh_info
字段中有一个off-by-1。我在GOLD的帮助下想出来了,不仅仅是分段,而且还给予了更多的信息:
gold: internal error in do_layout, at ../../gold/object.cc:1493
或
gold: error: invalid STB_LOCAL symbol in external symbols gold: error: unsupported symbol binding 0 gold: error: invalid STB_LOCAL symbol in external symbols gold: error: unsupported symbol binding 0 gold: error: test.o: multiple definition of '' gold: test.o: previous definition here
这帮助我确定我的本地符号最终出现在“外部符号”中(意思是“第一个非本地符号的索引”之后,存储在sh_info
中)