【问题标题】:What does an ELF relocation in .bss, but relative to .bss, mean?.bss 中的 ELF 重定位(但相对于 .bss)是什么意思?
【发布时间】: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 文件会留下漏洞供链接器修补。当你把它链接进去时,问题就消失了吗?数字变得理智了吗?

标签: assembly linker elf


【解决方案1】:

您的 .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 部分开头的偏移量。

【讨论】:

  • 就是这样!我不小心把代码放在了.bss 部分!谢谢...这让我很困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2012-03-21
  • 2014-10-06
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多