ELF 标签地址

4

我在.s文件中有以下代码:

pushq $afterjmp
    nop
afterjmp:
    movl %eax, %edx

它的目标文件包含以下内容:

20: 68 00 00 00 00          pushq  $0x0
25: 90                      nop
0000000000000026 <afterjmp>:
26: 89 c2                   mov    %eax,%edx

连接后,它变成了:
400572: 68 78 05 40 00          pushq  $0x400578
400577: 90                      nop
400578: 89 c2                   mov    %eax,%edx

在可执行文件中,如何将对象文件的第20个字节处的参数0x0转换为最终执行文件中的0x400578

对象文件的哪个部分包含这些信息?


3
目标文件(及其包含的段)不知道它将放置在最终可执行文件中的位置。这由链接器(默认情况下是内部链接器脚本)控制。如果使用objdump -Dr filename.o,您可以看到重新定位将发生在哪里。00 00 00 00是一个占位符,最终将由链接器(在此情况下)填充。 - Michael Petch
@MichaelPetch,谢谢,这很有帮助。 - Ujjwal Rajput
1个回答

6
你回答了自己的问题:连接后...
这里有一篇好文章: 链接器和加载器 特别是要注意“符号重定位”这一部分:
重新定位。编译器和汇编器为每个输入模块生成对象代码,并从零开始分配起始地址。重新定位是将同一类型的所有部分合并成一个部分并为程序的不同部分分配装载地址的过程。代码和数据部分也会被调整,使它们指向正确的运行时地址。
在单个目标文件被组装时,无法知道“afterjmp”的程序地址。只有将所有目标文件组装成可执行映像后,才能计算相对于偏移量“0”的地址。这是链接器的工作之一:跟踪“符号引用”(如“afterjmp”),并计算机器地址(“符号重定位”)。

1
就此而言,他问在目标文件中可以找到这个东西。嗯,目标文件确实有一份必须重新定位的地址列表,我想。 - Rudy Velthuis
@RudyVelthuis 是的,确实。 - fuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接