web-dev-qa-db-ja.com

なぜ常にfpic(位置独立コード)を使用しないのですか?

this PICへの投稿を読みましたが、PICを使用するのは常に良いようです(exe/static/share llibraryの場合はいつでも)。

では、欠点は何ですか?
PICを使用しない場合の詳細な例はありますか?

18
Azil

リンクされた質問で受け入れられた答えは非常に単純であり、PICコードと非PICコードの間で異なる1つのこと、絶対的ではなく相対的なジャンプの生成のみをもたらします。

PICコードを作成する場合、位置に依存しないのはcodeだけでなく、データでもあります。また、相対オフセットを使用するだけですべてのコードまたはデータをアドレス指定できるわけではありません。ロード時(ライブラリ/プログラムがメモリにロードされるとき)または実行時に解決する必要があります。

また、相対アドレス指定を使用すると、CPUは、コンパイラによって行われるのではなく、相対オフセットを絶対アドレスに変換する必要があります。

仮想メモリを備えたシステムでは、コンパイラが一度だけ実行できる場合、これらの相対アドレス解決にロード時間または実行時間を費やす必要がないことがよくあります。

X86を含む一部のアーキテクチャでは、-fPIC生成多くデータのロード/ストア用のより悪いコード(つまり、関数呼び出し)。これはライブラリでは許容できますが、実行可能ファイルでは望ましくありません。

AMD64命令セット(および最近のgnu-x32 ABI)の主なセールスポイントの1つは、効率の問題を解決する「PC相対ロード/ストア」命令の追加でした。

強化されたシステムは通常do enable -fPIEアドレス空間配置のランダム化を可能にするため、すべての実行可能ファイルに対して。

4
o11c