我想将具有.o
的目标文件(main()
文件)链接到也具有main()
的另一个目标文件。
我想忽略第二个文件中的main()
,但使用第二个main()
文件中的.o
。有办法吗?谢谢。
答案 0 :(得分:1)
在GNU接头具有一个选项--allow-multiple-definition
。时使用,ld
忽略任何重复定义,仅使用它遇到对于每个符号的第一个。当然,这适用于所有符号的定义,而不仅仅是main
。要通过gcc
驱动程序使用它,可以使用gcc
的{{1}}选项:
-Wl,
答案 1 :(得分:1)
假设两个目标文件是a.o
和b.o
。这两个文件都有main()
,但您只想使用main()
中的a.o
。
首先,您必须找到函数的确切名称(在名称修改或使用_
的情况下,这是必需的)。
运行-
objdump -t | grep "main"
这将显示其中带有单词main
的符号。选择适当的函数名称。
现在,我们将其重命名为
objcopy --redefine-sym main=some_rubbish_name_not_anywhere b.o
(将main替换为您在上述命令中获得的任何符号名称)
现在,您可以像平常一样链接目标文件-
clang a.o b.o -o program
另一种方法是从main
中完全删除b.o
符号(如@ChrisBodd在评论中所建议)-
objcopy --strip-symbol=main b.o