2015-04-17 87 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。*'),但它不起作用。 –