可以在 32 位 Centos 6 上使用更新的(或两者)libstdc++ 吗?

Ok to use newer (or both) libstdc++ on 32-bit Centos 6?

我们的旧产品在 32 位 Centos 6.6 上发布,内置了 gcc 4.4.7。但是,大型应用程序有时会因 glibc 损坏而崩溃。使用 gcc 4.8 和 AddressSanitizer finds "global-buffer-overflow" 重新编译然后崩溃。但是,使用 gcc 4.9 编译似乎可以解决问题:没有 glibc 损坏,也没有 AddressSanitizer 错误。

问题是该应用程序现在需要 libstdc++.so.6.0.20 并且不再适用于现有的 Centos 6 libstdc++.so.6.0.13GLIBCXX_blahblah 未找到,等等)

那么最好的方法是什么?

  1. 用新的替换库存 /usr/lib/libstdc++
  2. 将新的 libstdc++.so.6.0.20 与我们的应用程序打包(在私有目录中)并修改 /etc/ld.so.conf.d 以在系统复制之前加载 private/new 库。

在 #1 中,该文件属于另一个包,因此可能会再次被未来的更新覆盖。另外,如果更新 /usr/lib 版本,现有程序是否会中断?我读了很多关于 ABI 兼容性的文章,但这是一个复杂的主题。

感谢您的反馈。

您的问题是与其他软件的交互很少。

因此,避免替换库的库存版本。

此外,还可能与其他软件使用/etc/ld.so.conf.

进行交互

因此,避免与其他软件交互的最佳方法是:

  • 要么静态地link你的libstdc++ 6.0.20到你的遗留产品或应用程序(你需要源代码,或者至少是独立的对象文件,来做到这一点, 所以这可能是不可能的);
  • 或在特定目录中安装 libstdc++.so.6.0.20,如 /usr/local/my-own-version-for-my-app/lib,而不是使用 ld.so.conf 发布此目录,使用:
    • a LD_LIBRARY_PATH env var 设置为 /usr/local/my-own-version-for-my-app/lib:$LD_LIBRARY_PATH,就在启动您的应用之前:
    • 或这样设置 LD_PRELOAD 环境变量:LD_PRELOAD=/usr/local/my-own-version-for-my-app/lib/libstdc++.so.6.0.20,就在之前启动您的应用程序。

这意味着写作:

% export LD_LIBRARY_PATH=/usr/local/my-own-version-for-my-app/lib:$LD_LIBRARY_PATH
% ./launch_my_app

或:

% export LD_PRELOAD=/usr/local/my-own-version-for-my-app/lib/libstdc++.so.6.0.20
% ./launch_my_app