C++ 将部分与ld合并

C++ 将部分与ld合并,c++,linker,ld,sections,C++,Linker,Ld,Sections,我想将多个.o文件合并到一个.o文件中,同时合并一些部分 如果我执行 ld -r first.o second.o -o result.o 然后它会正确地合并对象文件,但我还需要合并不同的.text部分。当您链接共享对象时,ld中的默认链接器脚本可以使用此节合并功能,但在使用-r时,我没有强制使用自定义链接器脚本。ld似乎忽略了我尝试过的任何脚本。我试图修改默认链接器脚本,并用以下内容替换.text节块 .text : { *(.text.unlikely .tex

我想将多个.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节的同时合并对象文件

但不合并对象文件的所有.text*部分,如
.text
.text.\u ZN13somenamespace3FooD1Ev

.text.\u ZN13somenamespace3FooD1Ev
的存在可能意味着您正在使用
-fffunction节进行编译,而且默认链接器脚本将不会合并这些节:如果您希望合并这些节,您首先不应该使用
-fffunction节

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

ld -r -o t.o t1.o t2.o --verbose > /tmp/script
注意:
ld-r
link的链接器脚本不同于普通的链接器脚本(您似乎已经修改了它)

编辑/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
节合并。

你是如何得出
ld-r
没有合并
节的结论的(可能是错误的)?另外,您在什么平台上使用了哪个版本的
ld
?我使用以下ld版本:GNU-ld(GNU-Binutils)2.20.0.20100122-0.7.9。也尝试了更新的版本,结果相同。我不是说ld不合并不同对象文件的
.text
部分,而是不合并对象文件的所有
.text*
部分,比如
.text
.text.\u ZN13somenamespace3FooD1Ev
.text.\u ZN13somenamespace3FooD0Ev
,等等,
.text.\u ZNSt8\u Rb\u treeIPN13某些名称空间3 bares2\u St9\u identitys2\u ENS1\u 6不存在seis2\u EE8\u擦除树节点2\u E
等。编译时我不使用
-f函数节
选项。大多数函数进入
.text
部分,但一些虚拟函数和模板函数有自己的部分。我试图找到一个gcc选项来禁用此行为,但失败了。你的建议基本上和我的实验是一样的。无论如何,我尝试了一下您的版本(仅添加
.text.*
),但它不起作用。