GNU/Linux >> Linux の 問題 >  >> Linux

libstdc++ を静的にリンクする:落とし穴はありますか?

また、動的 glibc に依存していないことを確認する必要がある場合もあります。 09 を実行 生成された実行可能ファイルを調べて、動的な依存関係に注意してください (libc/libm/libpthread がよく疑われます)。

追加の演習では、この方法論を使用して一連の関連する C++11 の例を構築し、結果のバイナリを実際の 10.04 システムで実際に試します。ほとんどの場合、動的読み込みで変なことをしない限り、プログラムが動作するかクラッシュするかはすぐにわかります。


そのブログ投稿はかなり不正確です。

<ブロック引用>

私の知る限り、C++ ABI の変更は、GCC のすべてのメジャー リリースで導入されています (つまり、最初または 2 番目のバージョン番号コンポーネントが異なるもの)。

違います。 GCC 3.4 以降に導入された唯一の C++ ABI の変更は下位互換性があり、C++ ABI は 9 年近く安定しています。

<ブロック引用>

さらに悪いことに、ほとんどの主要な Linux ディストリビューションは GCC スナップショットを使用したり、GCC バージョンにパッチを適用したりするため、バイナリを配布するときにどの GCC バージョンを扱っているかを正確に知ることは事実上不可能です。

ディストリビューションのパッチが適用された GCC のバージョン間の違いはわずかであり、ABI の変更ではありません。 Fedora の 4.6.3 20120306 (Red Hat 4.6.3-2) は、アップストリームの FSF 4.6.x リリースと ABI 互換性があり、他のディストリビューションの 4.6.x とほぼ確実に互換性があります。

GNU/Linux では、GCC のランタイム ライブラリは ELF シンボル バージョン管理を使用するため、オブジェクトとライブラリに必要なシンボル バージョンを簡単に確認できます。 それらのシンボルを提供するもので動作します。パッチが適用されたバージョンがディストリビューションの別のバージョンとわずかに異なっていても問題ありません。

<ブロック引用>

ただし、これが機能する場合、C++ コード (または C++ ランタイム サポートを使用するコード) を動的にリンクすることはできません。

これも真実ではありません。

とはいえ、 26 に静的にリンクする は 1 つのオプションです。

ライブラリを動的にロードすると機能しない可能性がある理由 (30 を使用) ) 依存する libstdc++ シンボルは、(静的に) リンクしたときにアプリケーションで必要とされなかった可能性があるため、それらのシンボルは実行可能ファイルに存在しません。これは、共有ライブラリを 48 に動的にリンクすることで解決できます (依存している場合は、とにかくこれが正しいことです。) ELF シンボル挿入は、実行可能ファイルに存在するシンボルが共有ライブラリによって使用されることを意味しますが、実行可能ファイルに存在しないその他のシンボルは で見つかります。 57 にリンクしています。アプリケーションが 69 を使用していない場合 気にする必要はありません。

別のオプション (および私が好むオプション) は、新しい 71 をデプロイすることです アプリケーションと一緒に、デフォルトのシステム 88 の前にあることを確認してください 98 または 実行時の環境変数、または 105 の設定による リンク時の実行可能ファイルで。 113 を使用したい アプリケーションが動作するために正しく設定されている環境に依存しないためです。アプリケーションを 128 にリンクする場合 (シェルが 132 を展開しようとするのを防ぐために単一引用符に注意してください ) 実行可能ファイルには 145 が含まれます 158 の これは、動的リンカーに、実行可能ファイル自体と同じディレクトリで共有ライブラリを探すように指示します。新しい 164 を入れると 実行可能ファイルと同じディレクトリにあり、実行時に検出され、問題が解決されます。 (別のオプションは、実行可能ファイルを 177 に配置することです 185 の新しい libstdc++.so 195 でリンク または実行可能ファイルに相対的なその他の固定された場所で、RPATH を 200 に相対的に設定します。 )


Jonathan Wakely の優れた回答への 1 つの追加、dlopen() に問題がある理由:

GCC 5 の新しい例外処理プール (PR 64535 および PR 65434 を参照) により、libstdc++ に静的にリンクされているライブラリを dlopen および dlclose すると、毎回 (プール オブジェクトの) メモリ リークが発生します。したがって、dlopen を使用する可能性がある場合、libstdc++ を静的にリンクするのは非常に悪い考えのように思えます。これは、PR 65434 で言及されている良性のリークとは対照的に、実際のリークであることに注意してください。


Linux
  1. コマンドを任意の端末にパイプする方法は?

  2. Nativefier –任意のWebサイトを簡単にデスクトップアプリケーションにする

  3. ディストリビューション間で実行可能なバイナリ ファイルに違いはありますか?

  1. Linux 実行可能ファイルへのアイコンの埋め込み

  2. iconv UTF-8 への任意のエンコーディング

  3. フォルダーを実行可能にする必要があるのはなぜですか?

  1. ファイルを実行不可として設定するには?

  2. 須藤対ルート;実際の違いはありますか?

  3. bashで実行可能スクリプトを実行するときにドットスラッシュを回避する方法はありますか?