2011-08-16 5 views
2

OSX 10.5上のGCCは、デフォルトで-fPICオプションがオンになっているのはなぜですか? Afterallは、より大きく、より遅いコードを生成しないのですか?OSXのGCCのPIC

答えて

4

プログラムに非常に小さな関数がたくさんある場合(グローバル変数または静的変数を使用する場合、またはobjective-cの場合、パフォーマンスの低下またはサイズの差は目立たない) PICは、スタックを使用して既にアクセスされているため、自動ローカル変数には使用されません。それを必要とする機能では、セットアップでは4つの命令しか必要としません。これは機能のコードとあまり比較されません。 PICを使用する各アクセスは、それがない場合のアクセスより1バイトだけ長いので、あまり差はありません。

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

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

関連する問題