我正在编写一些适用于.o
文件的自定义ELF二进制后处理代码。部分处理包括对二进制数据执行重定位。输入文件由GNU汇编器根据我自己的汇编代码生成。
看看GNU汇编程序生成的这些疯狂的重定位:
Relocation section '.rel.bss' at offset 0x3b8 contains 2 entries:
Offset Info Type Sym.Value Sym. Name
0000010b 00000301 R_386_32 00000000 .bss
00000110 00000301 R_386_32 00000000 .bss
首先,在.bss
中重新定位数据没有任何意义。根据定义,.bss
中的数据全为零,无法调整为其他内容。
其次,相对于自己部分的基地址重新定位值没有任何意义。那将是一个无操作。
那是什么给了??这些重新安置应该是什么意思?
(进入这个二进制文件的asm代码包含类似的内容:
.bss
keybuffer:
.space 256
......以后:
.bss
anotherbuffer:
.space 4
这就是上面你可以看到的补偿来自。)
答案 0 :(得分:5)
看起来你的.bss部分中有代码或数据引用了这些变量。仅使用示例代码创建一个程序集文件并不能重现问题:
$ cat t115.a
.bss
keybuffer:
.space 256
.bss
anotherbuffer:
.space 4
$ as --32 t115.a
$ readelf -r a.out
There are no relocations in this file.
但是,我可以通过引用.bss部分中的符号来重现该问题:
$ cat t115a.s
.bss
keybuffer:
.space 256
.bss
mov $keybuffer, %eax
.long anotherbuffer
.bss
anotherbuffer:
.space 4
$ as --32 t115a.s
$ readelf -r a.out
Relocation section '.rel.bss' at offset 0xe0 contains 2 entries:
Offset Info Type Sym.Value Sym. Name
00000101 00000301 R_386_32 00000000 .bss
00000105 00000301 R_386_32 00000000 .bss
您的示例输出中的偏移量0000010b
甚至没有告诉我您不小心将代码放入.bss部分。
重新安置是您所期望的。它们与.bss相关,它们不是应用于本地符号.bss,其值是此文件中.bss部分的起始地址。使用R_386_32重定位类型时,符号的值将添加到存储在重定位目标中的值("加数")。因为在这种情况下,重定位的目标是在没有任何内容(.bss)的部分中,所以加数的值是0.如果它是具有内容的部分(例如.text或.data),则重定位的目标将包含目标文件中.bss部分开头的偏移量。