常に実行可能ファイルに直接リンクされているいくつかのオブジェクト ファイルに、スレッド ローカル変数を追加しています。これらのオブジェクトは、共有ライブラリ内に含まれることはありません (これは近い将来にも当てはまると考えて間違いありません)。これは、これらのオブジェクトに -fPIC フラグが必要ないことを意味しますよね?
私たちのコードベースには、デフォルトですべてのオブジェクトの -fPIC フラグがあります。これらの多くは共有ライブラリに含まれているため、-fPIC の使用は理にかなっています。ただし、このフラグを使用すると、新しいスレッド ローカル変数のデバッグで問題が発生します。これは、 -fPIC を使用してスレッド ローカル変数をステップ オーバーしているときに GDB がクラッシュするためです。新しいスレッド ローカル変数を使用してこれらのいくつかのオブジェクト ファイルから -fPIC を削除すると、適切にデバッグできます。
非 PIC オブジェクトと PIC オブジェクトを実行可能ファイルに混在させても問題ないという正式な声明は見つかりません。これまでの私のテストでは問題ないことが示されていますが、コーシャとは感じられず、共有ライブラリのケースにより、オンラインでの議論は一般的に「PIC と非 PIC を混在させないでください」です。
この場合、非 PIC オブジェクトを PIC オブジェクトとライブラリで構築された実行可能ファイルにリンクしても安全ですか? これが安全であるというGCCドキュメントからの正式な声明があるかもしれませんが、私はそれを見つけることができません.
編集: このバグを回避するために gcc にバイナリ パッチを適用することは、短期的な解決策ではありません。Linux でコンパイラを切り替えることは、可能な解決策ではありません。