web-dev-qa-db-ja.com

gccおよびldの位置に依存しない実行可能ファイルの-fPIEオプションとは何ですか?

コードをどのように変更しますか?関数呼び出し?

61
osgx

PIEは、実行可能ファイルで アドレス空間レイアウトランダム化(ASLR) をサポートします。

PIEモードが作成される前は、プログラムの実行可能ファイルをメモリ内のランダムアドレスに配置できず、位置独立コード(PIC)ダイナミックライブラリのみをランダムオフセットに再配置できました。 PICがダイナミックライブラリに対して行うのと非常によく似ています。違いは、プロシージャリンケージテーブル(PLT)が作成されず、代わりにPC相対再配置が使用されることです。

Gcc/linkersでPIEサポートを有効にすると、プログラムの本体がコンパイルされ、位置に依存しないコードとしてリンクされます。動的リンカは、動的ライブラリと同様に、プログラムモジュールで完全な再配置処理を行います。グローバルデータの使用はすべて、グローバルオフセットテーブル(GOT)を介したアクセスに変換され、GOT再配置が追加されます。

PIEは このOpenBSD PIEプレゼンテーション で詳しく説明されています。

機能への変更が表示されます このスライド (PIE vs PIC)。

x86 pic vs pie

ローカルのグローバル変数と関数はパイで最適化されます

外部グローバル変数と関数はpicと同じです

および このスライド (PIE vs古いスタイルのリンク)

x86パイとフラグなし(修正済み)

ローカルのグローバル変数と関数は固定に似ています

外部グローバル変数と関数はpicと同じです

PIEは-staticと互換性がない可能性があることに注意してください

71
osgx