this PICへの投稿を読みましたが、PICを使用するのは常に良いようです(exe/static/share llibraryの場合はいつでも)。
では、欠点は何ですか?
PICを使用しない場合の詳細な例はありますか?
リンクされた質問で受け入れられた答えは非常に単純であり、PICコードと非PICコードの間で異なる1つのこと、絶対的ではなく相対的なジャンプの生成のみをもたらします。
PICコードを作成する場合、位置に依存しないのはcodeだけでなく、データでもあります。また、相対オフセットを使用するだけですべてのコードまたはデータをアドレス指定できるわけではありません。ロード時(ライブラリ/プログラムがメモリにロードされるとき)または実行時に解決する必要があります。
また、相対アドレス指定を使用すると、CPUは、コンパイラによって行われるのではなく、相対オフセットを絶対アドレスに変換する必要があります。
仮想メモリを備えたシステムでは、コンパイラが一度だけ実行できる場合、これらの相対アドレス解決にロード時間または実行時間を費やす必要がないことがよくあります。
X86を含む一部のアーキテクチャでは、-fPIC
生成多くデータのロード/ストア用のより悪いコード(つまり、関数呼び出し)。これはライブラリでは許容できますが、実行可能ファイルでは望ましくありません。
AMD64命令セット(および最近のgnu-x32 ABI)の主なセールスポイントの1つは、効率の問題を解決する「PC相対ロード/ストア」命令の追加でした。
強化されたシステムは通常do enable -fPIE
アドレス空間配置のランダム化を可能にするため、すべての実行可能ファイルに対して。