我们的传统产品在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
等)
那么最好的方法是什么?
/usr/lib/libstdc++
替换为新库存?libstdc++.so.6.0.20
打包到我们的应用程序(在私人目录中)并修改/etc/ld.so.conf.d
以在系统复制之前加载私有/新库。在#1中,该文件由另一个包拥有,因此可能会再次被某个未来更新覆盖。此外,如果/usr/lib
版本更新,现有程序是否会中断?我读了很多关于ABI兼容性的内容,但这是一个复杂的主题。
感谢您的反馈。
答案 0 :(得分:1)
您的问题是与其他软件进行微小的互动。
因此,请避免更换库的库存版本。
此外,还可能使用/etc/ld.so.conf与其他软件进行拦截。
因此,避免与其他sotfware进行任何互动的最佳方法是:
这意味着写作:
% 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