gpt4 book ai didi

c++ - 与ld合并节

转载 作者:行者123 更新时间:2023-12-01 14:30:19 25 4
gpt4 key购买 nike

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

最佳答案

but not merging all .text* sections of the object files, like .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 / 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部分。

关于c++ - 与ld合并节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29701441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com