ELF在.bss中的重新定位是什么,但相对于.bss,是什么意思?

Ale*_*x D 2 assembly linker elf

我正在编写一些自定义的ELF二进制后处理代码,它可以处理.o文件.部分处理包括对二进制数据执行重定位.输入文件由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
Run Code Online (Sandbox Code Playgroud)

...然后:

.bss
anotherbuffer:
.space 4
Run Code Online (Sandbox Code Playgroud)

这就是上面你可以看到的补偿来自.)

Ros*_*dge 6

看起来你的.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.
Run Code Online (Sandbox Code Playgroud)

但是,我可以通过引用.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
Run Code Online (Sandbox Code Playgroud)

事实上,0000010b示例输出中的偏移量甚至没有告诉我您不小心将代码放在.bss部分中.

重新安置是您所期望的.它们与.bss相关,它们是针对本地符号.bss应用的,其值是此文件中.bss部分的起始地址.使用R_386_32重定位类型时,符号的值将添加到存储在重定位目标("addend")的值中.因为在这种情况下,重定位的目标是在没有任何内容(.bss)的部分中,所以加数的值是0.如果它是具有内容的部分(例如.text或.data),则重定位的目标将包含目标文件中.bss部分开头的偏移量.