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