它应该将 hello world 字符串的地址移动到 rsi寄存器中,rsi寄存器被传递给 write 系统调用。
但是等等! 编译器怎么可能知道当程序加载时 "Hello world!"将在内存中的哪个位置?
嗯,它不能,特别是在我们链接了一大堆 .o文件和多个 .data部分之后。
只有链接器可以做到这一点,因为只有他将拥有所有这些目标文件。
所以编译器只是:
将占位符值 0x0放在已编译的输出上
给链接器提供一些额外的信息,说明如何用好的地址修改已编译的代码
这个“额外信息”包含在目标文件的 .rela.text部分中
2) . rel.text
.rela.text代表“重新定位. text 部分”。
使用重定位一词是因为链接器必须将地址从对象重定位到可执行文件中。
我们可以用以下方法拆卸 .rela.text部分:
readelf -r hello_world.o
其中包括:
Relocation section '.rela.text' at offset 0x340 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
00000000000c 000200000001 R_X86_64_64 0000000000000000 .data + 0