【问题标题】:ELF label addressELF 标签地址
【发布时间】:2017-12-22 18:07:16
【问题描述】:

我在 .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处的参数0x0pushq如何在最终可执行文件中转换为0x400578

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

【问题讨论】:

  • 目标文件(以及它包含的部分)不知道它将被放置在最终可执行文件中的什么位置。这是由链接器驱动的(默认情况下是内部链接器脚本)。如果您使用objdump -Dr filename.o,您可以看到重定位的位置。 00 00 00 00 是一个占位符,最终将由链接器填充(在这种情况下)
  • @MichaelPetch,谢谢,它有帮助。

标签: linux assembly x86 elf relocation


【解决方案1】:

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

这是一篇好文章:

Linkers and Loaders

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

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

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

【讨论】:

  • FWIW,他问在目标文件中哪里可以找到。好吧,我猜,目标文件确实有一个必须重新定位的地址列表。
  • @RudyVelthuis 是的,确实。
猜你喜欢
  • 2013-08-20
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多