2

OSX 10.5 の GCC で -fPIC オプションがデフォルトでオンになっているのはなぜですか? 結局のところ、生成されるコードが大きくて遅いのではないでしょうか?

4

1 に答える 1

4

プログラムに多数の非常に小さな関数があり、そのすべてがグローバル変数または静的変数、または object-c を使用していない限り、パフォーマンスの低下やサイズの違いは目立ちません。PIC は、スタックを使用して既にアクセスされているため、自動ローカル変数には使用されません。それを必要とする関数では、セットアップに必要な命令は 4 つだけで、関数内のコードと比較してそれほど多くはありません。PIC を使用した各アクセスは、PIC を使用しないアクセスよりも 1 バイト長いだけなので、やはり大きな違いはありません。

64 ビット用にビルドしている場合、PIC はおそらく小さくなり、パフォーマンスの違いはほとんどありません。x86-64 アーキテクチャでは、新しい命令相対アドレッシングが追加されました。これは、PIC のセットアップが不要であることを意味します。この新しいアドレス指定モードは、SIB バイトが使用されないため、実際には、命令で絶対アドレスをエンコードするよりも 1 バイト短くなります。

最後に、PIC を使用すると、コードがより安全になります。コードを毎回同じ場所にロードする必要がある場合、誰かが重要な関数とデータの場所を見つけて、実行時に問題を引き起こす可能性があります。ただし、OS が別のアドレスでコードをロードすることを選択できる場合、問題を引き起こそうとする人は、プログラムが実行されるたびに関数とデータ構造がどこにあるかを見つけなければなりません。

于 2011-09-07T02:49:37.903 に答える