【发布时间】:2016-05-05 16:43:33
【问题描述】:
我正在编写一些适用于 .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
这就是您在上面看到的偏移量的来源。)
【问题讨论】:
-
如果我错了,请纠正我,加载程序分配的 BSS 部分不是和其他部分一样吗?只是它在目标文件中不占用空间。 BSS 部分中的数据也可以像 DATA 部分一样被覆盖,对吧?如果是这样,为什么不应该搬迁?我不是 GAS 输出的专家,但它的哪一部分表明“重新定位相对于他们自己部分的基地址的值”?
-
@MargaretBloom,由于 BSS 部分在目标文件中不占用空间,它不能包含任何指针,所以没有理由应用重定位(= 调整二进制指针的值数据)给它。在上面的
readelf -r输出中,您可以看到BSS 存在重定位,并且BSS 中的(不存在的)指针相对于重定位的“符号值”是BSS 的字节0 = BSS 的基地址。 -
@AlexD:你不会在不转到
.text部分的情况下编写代码吗? -
根据定义.bss中的数据初始化为零,然后在运行时读/写,因此可以调整。了解 .o 文件会留下漏洞供链接器修补。当你把它链接进去时,问题就消失了吗?数字变得理智了吗?