は、私が最近受け取っ:共有オブジェクトを作るときなぜFPICは64にしていない32ビットプラットフォーム上で絶対に必要なのですか?
...ローカルシンボル」 `に対する移転R_X86_64_32を使用することはできません。 -fPICで再コンパイルします。
共有ライブラリとしてプログラムをコンパイルしようとしているときにエラーが発生しました。
今、これを解決するには、(-fPICを持つすべての依存関係を再コンパイル)それほど難しくありませんが、いくつかの研究の後に、この問題は、x86-64のプラットフォーム上でのみ存在することが判明しました。 32ビットでは、位置依存コードは動的ローダによって再配置されます。
私は見つけることができる最高のanswerは次のとおりです。
のx86は、.textの再配置のためのサポート(あなたは 位置dependendコードを持っているときに何が起こるかである)があります。このサポートは、このような再配置を含むすべての ページがそれ が、それによって共有 LIBSの概念そのものを損なう、共有ライブラリに座っていても、基本的には非共有になっつまりこと、コストがかかります。
しかし、私はこの非常に十分なを見つけることができません。そこで私たちはAMD64でこれを禁止することを決定した(値が32ビット以上を必要とする場合、すべての.text再配置情報のみ サイズ「word32」を持っているので、それに加えて、 問題を作成します) 。再配置によって共有ライブラリの概念が損なわれる場合は、なぜ32ビットプラットフォームで実行できるのでしょうか? 64ビットをサポートするために、ELF形式に行うことが必要な変更があった場合は、すべてのフィールドのサイズは増加しなかった理由も、その後に対応するには?
これはマイナーポイントかもしれませんが、問題のコードは科学的なコードであり、パフォーマンスヒットをするのがうれしくありません。b)この情報は不可能でした最初に見つけてください!
[編集: '回答'
@awoodlands answerはaddedいくつかの良い情報@servn、おそらく最高の 'リテラルの答え' です。私はthis、最終的にx86_64 ABI referenceを発見した再配置のさまざまなタイプについての詳細を見つけるための検索で
(68ページを参照してください) ]
私はあなたの質問への答えを知らないが、あなたはそれを認識する必要があり ' x86-64(x86-32と比較して)では、より多くのレジスタ、PC相対アドレッシング、およびPICを考慮して設計されたABIを備えているため、-fPICのパフォーマンスが低下します。私はそれが*行ったと言うつもりはないが、それを測定すると、あなたはうれしく驚くかもしれない。 – zwol
それはコンセンサス、確かに大きな利便性のためにパフォーマンスの小さなペナルティと思われる。私はそれを自分で試してみる必要があります。 –
主な質問はもちろん、なぜコンパイラに「必須オプション」があるのかです。 「あなたは魔法の言葉を言っていませんでした」とは、むしろ幼稚なゲームです。 – MSalters