我在.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
?
目标文件的哪个部分包含此信息?
答案 0 :(得分:4)
您回答了自己的问题:After linking...
。
这是一篇好文章:
请特别注意关于&#34;符号重定位&#34;:
的部分重新定位。编译器和汇编器为每个编译器生成目标代码 输入模块,起始地址为零。搬迁是 将加载地址分配给程序的不同部分的过程 通过将相同类型的所有部分合并为一个部分。代码 和数据部分也进行了调整,以便它们指向正确的 运行时地址。
没有办法知道&#34; afterjmp&#34;的节目地址。组装单个目标文件时。仅当所有目标文件被组装成可执行图像时,才能计算地址(相对于偏移量&#34; 0&#34;)。这是链接器的一个工作:跟踪&#34;符号引用&#34; (例如&#34; afterjmp&#34;),并计算机器地址(&#34;符号重定位&#34;)。