2017-08-21 4 views
1

従来の製品は、gcc 4.4.7が組み込まれている32ビットCentos 6.6に搭載​​されていますが、glibcの破損によって大きなアプリケーションがクラッシュすることがあります。 gcc 4.8とAddressSanitizer finds "global-buffer-overflow"で再コンパイルし、クラッシュします。しかし、gcc 4.9でコンパイルすると、glibcの破損やAddressSanitizerエラーがなくなります。32ビットのCentos 6で新しい(または両方の)libstdC++を使用するには?

問題はアプリが今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を修正して、システムコピーの前にプライベート/新規ライブラリを読み込みます。

#1では、このファイルは別のパッケージによって所有されているため、今後のアップデートによっても上書きされる可能性があります。また、/usr/libのバージョンが更新された場合、既存のプログラムは中断されますか?私はABIとの互換性について多くのことを読んでいますが、それは複雑なテーマです。

ご意見ありがとうございます。

答えて

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でこのディレクトリを公開する代わりに、使用:
    • は/ usr/local/MY-自身-バージョンのため、私のアプリ/ libのにLD_LIBRARY_PATHのenv VARセット:ちょうどあなたのアプリを起動する前の$ 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 
+0

偉大な提案を。ありがとう! – Danny

関連する問題