Gold链接器:指定节的对齐方式

时间:2013-07-31 15:57:45

标签: c++ linux linker ld binutils

我想为某些部分指定对齐方式。对于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
    

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


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

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

所以黄金要我指定一个完整的链接描述文件,但是我只想更改一些属性。这可能吗?

我已经尝试过了:

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

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

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

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

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

    .section .text
    .balign 0x40

    .section .data
    .balign 0x40

    .end
  • 黄金链接器按照大小(分别为16和8字节)对齐PLT和GOT条目。这对我的用例就足够了。