.bss 中的 ELF 重定位(但相对于 .bss)是什么意思?
What does an ELF relocation in .bss, but relative to .bss, mean?
我正在编写一些适用于 .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 部分中似乎有引用这些变量的代码或数据。仅使用您的示例代码创建一个程序集文件不会重现问题:
$ 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 重定位类型,符号的值被添加到重定位目标("addend")中存储的值。因为在这种情况下,重定位的目标位于没有任何内容 (.bss) 的部分中,所以加数的值为 0。如果它是一个包含内容(例如 .text 或 .data)的部分,则重定位的目标将包含从目标文件中 .bss 部分开始的偏移量。
我正在编写一些适用于 .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 部分中似乎有引用这些变量的代码或数据。仅使用您的示例代码创建一个程序集文件不会重现问题:
$ 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 重定位类型,符号的值被添加到重定位目标("addend")中存储的值。因为在这种情况下,重定位的目标位于没有任何内容 (.bss) 的部分中,所以加数的值为 0。如果它是一个包含内容(例如 .text 或 .data)的部分,则重定位的目标将包含从目标文件中 .bss 部分开始的偏移量。