【问题标题】:Merge sections with ld使用 ld 合并部分
【发布时间】:2015-04-17 14:02:42
【问题描述】:

我想将多个 .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 部分?

【问题讨论】:

  • 您是如何得出ld -r 合并.text 部分的(可能不正确的)结论?另外,您在哪个平台上使用了哪个版本的ld
  • 我使用以下 ld 版本:GNU ld (GNU Binutils) 2.20.0.20100122-0.7.9。也尝试了较新的版本,结果相同。我不是在谈论 ld 不合并不同目标文件的 .text 部分,而是不合并目标文件的 all .text* 部分,例如 .text.text._ZN13somenamespace3FooD1Ev、@ 987654330@、.text._ZNSt8_Rb_treeIPN13somenamespace3BarES2_St9_IdentityIS2_ENS1_6isLessESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E

标签: c++ linker ld sections


【解决方案1】:

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

.text._ZN13somenamespace3FooD1Ev 的存在很可能意味着您正在使用 -ffunction-sections 进行编译,并且实际上默认链接描述文件不会合并这些部分:如果您希望将它们合并,您不应该在第一个使用 -ffunction-sections地点!

也就是说,以下内容对我有用,可以合并 all .text 部分:

ld -r -o t.o t1.o t2.o --verbose > /tmp/script

注意:ld -r 链接的链接描述文件不同于普通链接描述文件(您似乎已修改)。

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

  .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 合并所有.text 部分。

【讨论】:

  • 编译时我不使用-ffunction-sections 选项。大多数函数进入.text 部分,但一些虚拟和模板函数有自己的部分。我试图找到一个禁用此行为但失败的 gcc 选项。您的建议与我尝试的基本相同。无论如何,我尝试了您的版本(仅添加 .text.*),但它不起作用。
猜你喜欢
  • 2013-11-20
  • 1970-01-01
  • 2011-02-10
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2020-11-03
相关资源
最近更新 更多