私は最近受け取った:
...共有オブジェクトを作成する場合、「ローカルシンボル」に対するR_X86_64_32の再配置は使用できません。-fPICで再コンパイルします
プログラムを共有ライブラリとしてコンパイルしようとしたときにエラーが発生しました。
現在、これに対する解決策はそれほど難しくありません(-fPICを使用してすべての依存関係を再コンパイルします)が、いくつかの調査の結果、この問題はx86-64プラットフォームでのみ発生することがわかりました。32ビットでも、位置に依存するコードは動的ローダーによって再配置できます。
私が見つけた最良の答えは次のとおりです。
x86は、.textの再配置をサポートしています(これは、位置に依存するコードがある場合に発生します)。このサポートにはコストがかかります。つまり、そのような再配置を含むすべてのページは、共有ライブラリにある場合でも基本的に非共有になり、共有ライブラリの概念そのものが台無しになります。したがって、amd64ではこれを禁止することにしました(さらに、すべての.text再配置のサイズは「word32」であるため、値に32ビット以上が必要な場合は問題が発生します)
しかし、これは十分ではありません。再配置が共有ライブラリの概念を台無しにする場合、なぜそれを32ビットプラットフォームで実行できるのでしょうか。また、64ビットをサポートするためにELF形式に変更を加える必要がある場合、対応するためにすべてのフィールドのサイズが大きくならないのはなぜですか?
これはマイナーな点かもしれませんが、a)問題のコードは科学的なコードであり、パフォーマンスに影響を与える必要がないのは良いことであり、b)この情報は最初の場所!
[編集:'答え'
@awoodlandsの回答はおそらく最良の「文字通りの回答」であり、@servnはいくつかの良い情報を追加しました。
さまざまなタイプの再配置について詳しく調べるための検索で、これと最終的にはx86_64 ABIリファレンス(68ページを参照)を見つけました]