使用ld合并节

时间:2015-04-17 14:02:43

标签: c++ linker ld sections

我想将多个.o文件合并到一个.o文件中,同时合并一些部分。

如果我执行

ld -r first.o second.o -o result.o

然后它正确合并目标文件,但我还需要合并各种.text部分。当您链接共享对象时,ld中的默认链接描述文件可以使用此部分合并功能,但是在使用-r时我没有设法强制使用自定义链接描述文件。 ld似乎忽略了我尝试的任何脚本。我试图修改默认的链接描述文件并用这个

替换.text部分块
.text           :
{
    *(.text.unlikely .text.*_unlikely)
    *(.text.exit .text.exit.*)
    *(.text.startup .text.startup.*)
    *(.text.hot .text.hot.*)
    *(.text .stub .text.* .gnu.linkonce.t.*)
    /* .gnu.warning sections are handled specially by elf32.em.  */
    *(.gnu.warning)
} =0x90909090

如何合并目标文件,同时使用ld?

合并.text部分

1 个答案:

答案 0 :(得分:0)

  

但不合并目标文件的所有.text *部分,例如.text.text._ZN13somenamespace3FooD1Ev

.text._ZN13somenamespace3FooD1Ev的存在可能意味着您正在使用-ffunction-sections进行编译,实际上默认的链接描述文件不会合并这些部分:如果您希望将它们组合在一起,则不应使用{{ 1}}首先!

也就是说,以下内容可以帮助我将所有 -ffunction-sections部分结合起来:

.text

注意:ld -r -o t.o t1.o t2.o --verbose > /tmp/script 链接的链接描述文件与正常的链接描述文件不同(这似乎是您修改过的)。

编辑/ tmp / script删除非脚本部分,并更改:

ld -r

对此:

  .text         0 :
  {
    *(.text .stub)
    /* .gnu.warning sections are handled specially by elf32.em.  */
    *(.gnu.warning)
  }

最后,

  .text         0 :
  {
    *(.text .stub .text.*)
    /* .gnu.warning sections are handled specially by elf32.em.  */
    *(.gnu.warning)
  }

让我ld -r -o t.o t1.o t2.o -T /tmp/script 合并了所有t.o个部分。