我们希望创建一个共享库 (.so) 以针对所有发行版,包括旧发行版。该代码是用 C++ 编写的,并使用 C++11 功能,因此编译器必须至少为 gcc 4.7。
我们注意到,如果我们在安装了 gcc 4.7.2 的 Linux 机器(例如 Ubuntu 12.10)上编译代码,那么生成的 .so 具有“版本 1 (GNU/Linux)”,而在较旧的操作系统(例如 CentOS 5.6)上版本是“版本 1 (SYSV)”——GNU/Linux 较新版本的库不能在较旧的操作系统上使用。
因此,我们尝试了在 CentOS 5.6 机器上安装 gcc 4.7 的方法,用这个编译器编译我们的代码,并与 libstdc++ (-static-libstdc++) 静态链接 – 这生成了一个可在我们发现的每个 Linux 上使用的 .so。
这对于 32 位来说效果很好。然而,当我们在 64 位操作系统 (CentOS) 上采用相同的方法时,这会失败,并出现错误,即我们尝试链接到的现有 libstdc++.a 是在没有 –fPIC 的情况下编译的。
因此,我们尝试使用“–with-pic”选项编译 gcc 4.7.2 源代码,但无法链接到新的 libstdc++.a – 错误是:
/opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: /usr/local/lib/libFoo.so: 找不到符号 _ZNSs7_M_copyEPcPKcm@GLIBCXX_3 的版本节点。 4
/opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:无法设置动态部分大小:错误值
collect2:错误:ld 返回 1 退出状态
我们在 google 上搜索到,使用 –fPIC 编译 libstdc++ 可能会出现问题,但为什么它适用于 32 位操作系统而不适用于 64 位操作系统呢?是否有另一种建议的方法来为所有 Linux 发行版创建一个 .so ?
我在以下位置回答了这个问题https://gcc.gnu.org/ml/libstdc++/2014-05/msg00107.html https://gcc.gnu.org/ml/libstdc++/2014-05/msg00107.html
这看起来像https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54482 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54482所以可能会在 GCC 4.7.3 中修复(但我不确定)
...
x86 和 x86_64 的 PIC 实现方式不同,因为 64 位模式
对其有内置支持。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)