CentOS 5.8 与 gcc 4.4.7 链接到 libstdc++ 6.0.8。这怎么可能?

CentOS 5.8 与 gcc 4.4.7 链接到 libstdc++ 6.0.8。这怎么可能?

根据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 兼容。

相关内容