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

时间:2017-08-21 02:24:14

标签: gcc libstdc++

我们的传统产品在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.13(找不到GLIBCXX_blahblah等)

那么最好的方法是什么?

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

    感谢您的反馈。

1 个答案:

答案 0 :(得分:1)

您的问题是与其他软件进行微小的互动。

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

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

因此,避免与其他sotfware进行任何互动的最佳方法是:

  • 静态链接您的libstdc ++ 6.0.20到您的旧产品或应用程序(您需要源代码,或至少需要独立的对象文件)才能执行此操作,因此可能无法实现;
  • 或在特定目录中安装libstdc ++。so.6.0.20,例如/ usr / local / my-own-version-for-my-app / lib,而不是使用ld.so.conf发布此目录,使用 :
    • LD_LIBRARY_PATH env var设置为/ usr / local / my-own-version-for-my-app / lib:$ LD_LIBRARY_PATH,就在启动应用程序之前:
    • 或以这种方式设置 LD_PRELOAD env var: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