ELF标签地址

时间:2017-07-18 03:51:27

标签: linux assembly x86 elf

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

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

1 个答案:

答案 0 :(得分:4)

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

这是一篇好文章:

Linkers and Loaders

请特别注意关于&#34;符号重定位&#34;:

的部分
  

重新定位。编译器和汇编器为每个编译器生成目标代码   输入模块,起始地址为零。搬迁是   将加载地址分配给程序的不同部分的过程   通过将相同类型的所有部分合并为一个部分。代码   和数据部分也进行了调整,以便它们指向正确的   运行时地址。

没有办法知道&#34; afterjmp&#34;的节目地址。组装单个目标文件时。仅当所有目标文件被组装成可执行图像时,才能计算地址(相对于偏移量&#34; 0&#34;)。这是链接器的一个工作:跟踪&#34;符号引用&#34; (例如&#34; afterjmp&#34;),并计算机器地址(&#34;符号重定位&#34;)。