【问题标题】:Where is the relocation information in the ELF format?ELF格式的重定位信息在哪里?
【发布时间】:2014-07-01 12:58:44
【问题描述】:

在加载器部分引用“链接器和加载器”

"加载时重定位远比链接时重定位简单, 因为整个程序被重新定位为一个单元。 [...] 将程序读入内存后,加载器查询 目标文件中的重定位项并修复内存 项目指向的位置”

也许我误解了这一点,这仅在某些体系结构中,但我的问题是:在 ELF 格式中,哪些项目在加载时需要重定位?我如何查询这份清单?

【问题讨论】:

    标签: linux linker elf


    【解决方案1】:

    可在 ELF 文件的特殊重定位部分中找到重定位。您可以使用readelf --sections 命令找出可执行文件或共享库中有哪些部分,而REL 类型的部分包含重定位指令。这些重定位部分的内容可以使用readelf --relocs 显示。例如:

    $ readelf --relocs /bin/ls
    
    Relocation section '.rela.dyn' at offset 0x16c8 contains 5 entries:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    00000061afd8  000c00000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
    00000061b540  006d00000005 R_X86_64_COPY     000000000061b540 optind + 0
    00000061b548  006e00000005 R_X86_64_COPY     000000000061b548 optarg + 0
    00000061b550  006a00000005 R_X86_64_COPY     000000000061b550 stderr + 0
    00000061b560  006600000005 R_X86_64_COPY     000000000061b560 stdout + 0
    
    Relocation section '.rela.plt' at offset 0x1740 contains 99 entries:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    00000061b000  000100000007 R_X86_64_JUMP_SLO 0000000000000000 strcoll + 0
    00000061b008  000200000007 R_X86_64_JUMP_SLO 0000000000000000 mktime + 0
    ...
    

    .rela.dyn 部分包含对程序代码中代码或数据符号的引用,这些引用必须在加载时重新定位,而.rela.plt 主要包含用于调用共享对象中的函数的跳转槽。请注意,通常只有共享对象被编译为与位置无关的代码,而通常的可执行文件不是。这是因为 PIC 代码比非 PIC 代码慢一些。

    【讨论】:

      猜你喜欢
      • 2014-12-21
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2015-07-13
      • 2013-10-04
      相关资源
      最近更新 更多