Gcc 可以使用较新的(或两者都使用)libstdc++;在32位Centos 6上?

Gcc 可以使用较新的(或两者都使用)libstdc++;在32位Centos 6上?,gcc,libstdc++,Gcc,Libstdc++,我们的传统产品在32位Centos 6.6上发布,其中内置了gcc 4.4.7。然而,大型应用程序有时会因glibc崩溃而崩溃。使用GCC4.8重新编译,然后崩溃。然而,使用GCC4.9编译似乎可以解决问题:没有glibc损坏和AddressSanitarizer错误 问题是该应用程序现在需要libstdc++.so.6.0.20,并且不再适用于股票Centos 6libstdc++.so.6.0.13(GLIBCXX_blahblah未找到,等等) 那么最好的方法是什么 用新的替换库存/usr

我们的传统产品在32位Centos 6.6上发布,其中内置了gcc 4.4.7。然而,大型应用程序有时会因glibc崩溃而崩溃。使用GCC4.8重新编译,然后崩溃。然而,使用GCC4.9编译似乎可以解决问题:没有glibc损坏和AddressSanitarizer错误

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

那么最好的方法是什么

  • 用新的替换库存
    /usr/lib/libstdc++
  • 将新的
    libstdc++.so.6.0.20
    与我们的应用程序打包(在私有目录中),并修改
    /etc/ld.so.conf.d
    以在系统复制之前加载私有/新库
  • 在#1中,该文件属于另一个包,因此可能会再次被将来的某个更新覆盖。另外,如果更新了
    /usr/lib
    版本,现有的程序会崩溃吗?我读了很多关于ABI兼容性的文章,但这是一个复杂的主题


    感谢您的反馈。

    您的问题是与其他软件进行轻微的交互

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

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

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

    • 将您的libstdc++6.0.20静态链接到您的旧版产品或应用程序(您需要源代码,或者至少需要独立的对象文件,因此可能不可能)
    • 或者将libstdc++.so.6.0.20安装在特定目录中,如/usr/local/my-own version for my-app/lib,而不是使用ld.so.conf发布此目录,请使用:
      • 一个LD_LIBRARY_PATHenv var设置为/usr/local/my-own version for my-app/lib:$LD_LIBRARY_PATH,在启动应用程序之前:
      • 或者将LD_PRELOADenv变量设置为: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