如何 link 到其中包含 main 的对象?

How to link to an object with main in it?

我想 link 一个带有 main() 的目标文件(.o 文件)到另一个也有 main().[=17 的目标文件=]

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

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

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

假设两个目标文件是a.ob.o。这两个文件都有 main() 但您只想使用 a.o.

中的 main()

首先你必须找到函数的确切名称(这是必要的,以防出现名称重整或 _ 前缀)。

运行 -

objdump -t | grep "main"

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

objcopy --redefine-sym main=some_rubbish_name_not_anywhere b.o

(将 main 替换为您在上述命令中获得的任何符号名称)

现在您可以像往常一样 link 您的目标文件 -

clang a.o b.o -o program

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

objcopy --strip-symbol=main b.o