2011-07-27 34 views
1

我试图创建我自己的ELF .o文件,我想在其中写出指向其他内存条的内存条。我不想让每个条的名字,所以我就跟踪他们的相对位置,以他们在节开始ELF relocate against local section

所以我创建的形式搬迁进入:

000000000a50 00090000000b R_X86_64_32S 0000000000000000 .section + a70

其中,在a50处,我们使用64位全局指针指向.section + a70处的对象。该部分是用定义:

9: 0000000000000000 0 SECTION LOCAL DEFAULT 6

前面的输出是readelf,它实际上假装一切都很好......直到我拉这个通过LD,刚刚出现segfaults。

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

我到目前为止的选择是在每个部分的开头都创建一个OBJECT符号,但这只是看起来很愚蠢......我做错了什么,或者LD中存在错误?

回答

1

显然我在符号表的sh_info字段中有一个off-1。我理解了它与黄金的帮助下,这是一个比较翔实的不仅仅是段错误,但也给:

 

    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中)