我在 .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
中,pushq
到 20
的参数如何在最终可执行文件中转换为 0x400578
?目标文件的哪个部分包含此信息?
最佳答案
您回答了自己的问题: After linking...
。
这是一篇很好的文章:
Linkers and Loaders
特别要注意有关“符号重定位”的部分:
汇编单个目标文件时,无法知道“afterjmp”的程序地址。只有当所有目标文件都组装成一个可执行镜像时,才能计算地址(相对于偏移量“0”)。这是链接器的工作之一:跟踪“符号引用”(如“afterjmp”),并计算机器地址(“符号重定位”)。
关于linux - ELF标签地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45157182/