【问题标题】:Gold linker: specify alignment of sections黄金链接器:指定部分的对齐方式
【发布时间】:2013-08-01 06:19:29
【问题描述】:

我想为某些部分指定对齐方式。对于ld 2.20.0,以下方法有效:

  • 创建一个仅包含应该对齐的部分的链接描述文件,例如:

    SECTIONS
    {
        .data ALIGN(0x40): { *(.data) }
    
        .text ALIGN(0x40): { *(.text) }
    
        .plt ALIGN(0x10): { *(.plt) }
    }
    
  • 然后链接:

    -rpath-link=/path/to/LinkerScript.ld /path/to/LinkerScript.ld
    

    例如将脚本包含在 rpath-link 中,并将其作为目标文件之一传递。


现在,当使用 gold 2.23.1 以相同方式链接时,脚本被拒绝并出现以下错误:

LinkerScript.ld: SECTIONS seen after other input files; try -T/--script

所以 gold 希望我指定一个完整的链接器脚本,但我只想更改几个属性。这可能吗?

我已经试过了:

  • 使用-T 选项传递脚本。这会产生一个无法启动的损坏的可执行文件。据我了解,这是因为-T 只接受完整的链接器脚本,而以上只是对现有脚本的“注释”。
  • 同样,将带有-T 选项的脚本传递给ld 2.20.0 时,由于某些部分未指定,因此无法链接。它不是我用例的“完整”链接器脚本。
  • 所以我尝试获取完整的链接器脚本。 ld --verbose 将打印默认链接描述文件。我不得不删除gold 无法理解的几个符号,之后使用-T/path/to/LinkerScript.ld 选项生成的可执行文件不再起作用。
  • 很遗憾,gold 没有显示其默认链接描述文件的选项(它不使用任何链接描述文件)。
  • 手册页没有指定如何使用参数更改上述情况的对齐方式。

任何帮助将不胜感激!

【问题讨论】:

    标签: c++ linux linker ld binutils


    【解决方案1】:

    我找到了解决我的问题的解决方案。

    • 数据和文本部分的对齐可以通过包含一个带有虚拟对齐的汇编文件来实现。部分的对齐方式将是任何地方指定的最大对齐方式,因此它至少会有这种对齐方式。

      示例文件 align.s(使用您的汇编程序编译并在您的链接中包含目标文件):

    .section .text .balign 0x40 .section .data .balign 0x40 。结尾
    • gold 链接器按 PLT 和 GOT 条目的大小(分别为 16 和 8 字节)对齐它们。这对我的用例来说已经足够了。

    【讨论】:

      猜你喜欢
      • 2016-11-27
      • 2015-08-17
      • 1970-01-01
      • 2015-09-07
      • 2014-03-31
      • 2014-07-08
      • 2018-06-14
      • 1970-01-01
      • 2017-12-12
      相关资源
      最近更新 更多