我在 .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

在目标文件的字节 0x0 中,pushq20 的参数如何在最终可执行文件中转换为 0x400578

目标文件的哪个部分包含此信息?

最佳答案

您回答了自己的问题: After linking...

这是一篇很好的文章:

Linkers and Loaders

特别要注意有关“符号重定位”的部分:



汇编单个目标文件时,无法知道“afterjmp”的程序地址。只有当所有目标文件都组装成一个可执行镜像时,才能计算地址(相对于偏移量“0”)。这是链接器的工作之一:跟踪“符号引用”(如“afterjmp”),并计算机器地址(“符号重定位”)。

关于linux - ELF标签地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45157182/

10-14 17:06