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