如何链接到带有主体的对象?

时间:2019-01-30 22:32:42

标签: c gcc linker clang ld

我想将具有.o的目标文件(main()文件)链接到也具有main()的另一个目标文件。

我想忽略第二个文件中的main(),但使用第二个main()文件中的.o。有办法吗?谢谢。

2 个答案:

答案 0 :(得分:1)

在GNU接头具有一个选项--allow-multiple-definition。时使用,ld忽略任何重复定义,仅使用它遇到对于每个符号的第一个。当然,这适用于所有符号的定义,而不仅仅是main。要通过gcc驱动程序使用它,可以使用gcc的{​​{1}}选项:

-Wl,

答案 1 :(得分:1)

假设两个目标文件是a.ob.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