コードをどのように変更しますか?関数呼び出し?
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
と互換性がない可能性があることに注意してください