ld 如何处理两次提供的代码(在源文件和库中)?

how does ld deal with code that is supplied twice (in a source file and in a library)?

假设我们调用

gcc -Dmyflag -lmylib mycode.c

其中 mylib 包含所有 mycode,但编译时没有 -Dmyflag。因此,在 mycode 中实现的所有函数和其他实体都可以以两个版本提供给加载程序。根据经验,我发现使用了 mycode 中的版本。我可以依靠它吗? mycode 会一直覆盖 mylib 吗?

Empirically, I find that the version from mycode is taken.

阅读this explanation of how linker works with archive libraries, and possibly this one

Can I rely on that?

你应该依赖于了解它是如何工作的。

如果您理解参考链接中的 material,您会发现将 main 添加到 libmylib.a 会反转答案(如果 mycode.c 还包含 main,你会得到重复的符号定义错误。

如果你使用的是动态库libmylib.so,规则不同,库总是会输给主二进制,虽然有很多复杂的地方,比如LD_PRELOAD,链接-Bsymbolic 和其他人的图书馆。

简而言之,您应该根本不这样做。