我在.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
的pushq
参数0x0
如何在最终的可执行文件中被转换为0x400578
?
目标文件的哪一部分包含这些信息?
你回答了你自己的问题: After linking...
。
这里有一篇很好的文章:
连接器和装载机
尤其要注意“符号重定位”一节:
搬迁。 编译器和汇编程序为起始地址为零的每个输入模块生成目标代码。 重新定位是通过将同一类型的所有部分合并为一个部分来将加载地址分配给程序的不同部分的过程。 代码和数据部分也进行了调整,以便指向正确的运行时地址。
当单个目标文件被组装时,没有办法知道“afterjmp”的程序地址。 只有当所有的目标文件被组装成可执行的图像时,才能计算地址(相对于偏移“0”)。 这是链接器的工作之一:跟踪“符号引用”(如“afterjmp”),并计算机器地址(“符号重定位”)。