根据gcc ABI 政策,gcc 4.4.7 应该依赖于 libstdc++ 6.0.13。据我了解,编译器版本和 libstdc++ 版本紧密相关且无法互换,因此我惊讶地发现以下事实:
- CentOS 5.8 以某种方式设法拥有一个与 6.0.8 链接的 gcc44 软件包,显然是默认系统附带的(基于 gcc-4.1.2)
- 编译器目录(/usr/lib/gcc/x86_64-redhat-linux6E/4.4.7,我希望在其中找到 libstdc++-6.0.13)中的 libstdc++.so 不是任何类型的共享对象的链接,但是一个文本文件包含
INPUT ( -lstdc++_nonshared /usr/lib64/libstdc++.so.6 )
这里到底发生了什么魔法?
具体来说:
- 他们如何提供链接到旧版本 libstdc++ 的 gcc 4.4.7?我认为这是不可能的。
- 这个 stdc++_nonshared 库是什么?
- 我不知道 .so 文件可以包含该文本。谁解析它(我猜是动态链接器)以及它的规范和后果是什么?
- 这个魔法能走多远?我可以将 gcc4.7 与 libstdc++ 6.0.3 一起使用吗?兼容性范围是什么
答案1
如果我这样做,rpm -q --requires gcc44
我会看到以下内容:
libstdc++.so.6()(64bit)
libstdc++.so.6(CXXABI_1.3)(64bit)
libstdc++.so.6(GLIBCXX_3.4)(64bit)
因此 rpm 本身不存在对 6.0.13 的明确版本依赖性。
正如您所发现的,libstdc++.so.6属于libstdc++-4.1.2-53.el5
这个版本 4.1.2 在 RedHat 中没有真正的意义 - 它也将包含新版本的向后移植。
看这个:rpm -q libstdc++ --changelog|more
:
* Fri Mar 23 2012 Jakub Jelinek <[email protected]> 4.1.2-53.el5
- backport N2179 exception propagation support to improve
gcc44 as well as Developer Toolset (#806275)
显然 RedHat 正在积极修补这个版本,以便它与 gcc44 兼容。