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
和其他人的图书馆。
简而言之,您应该根本不这样做。
假设我们调用
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
和其他人的图书馆。
简而言之,您应该根本不这样做。