C 如何链接到包含main的对象?

C 如何链接到包含main的对象?,c,gcc,linker,clang,ld,C,Gcc,Linker,Clang,Ld,我想将带有main()的对象文件(.o文件)链接到另一个也有main()的对象文件 我想忽略第二个文件中的main(),但使用第二个.o文件中的main()。有没有办法做到这一点?谢谢。GNU链接器有一个选项——允许多定义。当使用该定义时,ld将忽略任何重复的定义,仅使用每个符号遇到的第一个定义。这当然适用于所有符号的定义,而不仅仅是main。要通过gcc驱动程序使用它,您可以使用gcc的-Wl,选项: gcc -o myprog -Wl,--allow-multiple-definition

我想将带有
main()
的对象文件(
.o
文件)链接到另一个也有
main()
的对象文件


我想忽略第二个文件中的
main()
,但使用第二个
.o
文件中的
main()
。有没有办法做到这一点?谢谢。

GNU链接器有一个选项
——允许多定义。当使用该定义时,
ld
将忽略任何重复的定义,仅使用每个符号遇到的第一个定义。这当然适用于所有符号的定义,而不仅仅是
main
。要通过
gcc
驱动程序使用它,您可以使用
gcc
-Wl,
选项:

gcc -o myprog -Wl,--allow-multiple-definition main.o second.o

假设这两个对象文件是
a.o
b.o
。这两个文件都有
main()
,但您只想使用
a.o
中的
main()

首先,您必须找到函数的确切名称(这是必要的,以防名称混乱或
\uu
前置)

运行-

objdump -t | grep "main"
这将显示包含单词
main
的符号。选择适当的函数名。 现在我们将其重命名为其他名称-

objcopy --redefine-sym main=some_rubbish_name_not_anywhere b.o
(将main替换为在上述命令中获得的任何符号名称)

现在,您可以像往常一样链接对象文件了-

clang a.o b.o -o program
另一种方法是从
b.o
中完全去除
main
符号(如@ChrisBodd在评论中所建议的)——


谢谢它应该是定义而不是定义。是的,@user1424739,很抱歉造成混淆。有没有办法从
.o
文件中删除函数?您可以使用
--strip symbol=main
简单地删除主符号,而不是重命名它。这不会重新调用函数,只是引用它的符号
-N main
是相同的(短选项而不是长选项)@user1424739无法“删除”整个函数。因为有时链接器甚至不知道函数的实际结束位置。但正如chrisdd所建议的,您可以只剥离符号名称,它不会干扰您的链接。@chrisdd我同意,剥离也可以。唯一的区别是,如果重命名,则从
b.o
main
的引用(如果有)仍将链接到
b.o
中的版本,如果删除,则将指向
a.o
中的版本。我认为这取决于OP的用例。但我认为它们是你建议的意思。
objcopy --strip-symbol=main b.o