2015-04-17 86 views
1

我想将多个.o文件合并为一个.o文件,同时合并一些部分。用ld合并部分

如果我执行

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

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

.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 

.text段块如何合并的目标文件同时还采用LD合并.text段?

+0

你是如何得出(可能不正确)的结论:'ld -r' * * not * merge'.text' sections?另外,你在哪个平台上使用了哪个版本的'ld'? –

+0

我使用以下ld版本:GNU ld(GNU Binutils)2.20.0.20100122-0.7.9。尝试更新的版本以及相同的结果。 我不是在谈论ld没有合并不同目标文件的'.text'部分,而是不合并目标文件的_all_'.text *'部分,比如'.text','.text._ZN13somenamespace3FooD1Ev' ,'.text._ZN13somenamespace3FooD0Ev','.text._ZNSt8_Rb_treeIPN13somenamespace3BarES2_St9_IdentityIS2_ENS1_6isLessESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_E'等。 –

回答

0

但不合并的目标文件的所有的.text *节,像.text.text._ZN13somenamespace3FooD1Ev

.text._ZN13somenamespace3FooD1Ev的存在可能意味着你与-ffunction-sections编译,而事实上默认的链接脚本不会结合这些部分:如果你想要他们合并,你不应该在第一时间使用-ffunction-sections

这就是说,下面的工作对我来说,所有.text部分结合:

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

注:ld -r链接链接脚本是正常的链接脚本不同(这是你出现什么已修改)。

编辑的/ tmp /脚本删除非脚本部分,也改变:

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

+0

编译时不使用-ffunction-sections选项。大部分函数都进入'.text'部分,但是一些虚函数和模板函数有它们自己的部分。我试图找到一个禁用此行为但失败的gcc选项。 您的建议基本上与我正在试验的相同。无论如何,我尝试了一下你的版本(只添加'.text。*'),但它不起作用。 –