関数呼び出しなど、コードはどのように変更されますか?
ベストアンサー1
PIEはサポートしますアドレス空間レイアウトランダム化 (ASLR)実行可能ファイル内。
PIE モードが作成される前には、プログラムの実行可能ファイルをメモリ内のランダムなアドレスに配置することはできず、位置独立コード (PIC) ダイナミック ライブラリのみをランダムなオフセットに再配置することができました。これは、PIC がダイナミック ライブラリに対して行う動作とほぼ同じですが、違いは、プロシージャ リンク テーブル (PLT) が作成されず、代わりに PC 相対の再配置が使用されることです。
gcc/リンカーで PIE サポートを有効にすると、プログラム本体が位置独立コードとしてコンパイルおよびリンクされます。動的リンカーは、動的ライブラリと同様に、プログラム モジュールに対して完全な再配置処理を実行します。グローバル データの使用はすべて、グローバル オフセット テーブル (GOT) 経由のアクセスに変換され、GOT の再配置が追加されます。
PIEは次のようによく説明されている。このOpenBSD PIEプレゼンテーション。
機能の変更が表示されますこのスライドでは(PIE 対 PIC)。
x86 pic と pie
ローカルグローバル変数と関数はパイで最適化されます
外部グローバル変数と関数はpicと同じです
そしてこのスライド(PIE と旧スタイルのリンク)
x86 pie vs no-flags (修正済み)
ローカルグローバル変数と関数は固定変数と似ている
外部グローバル変数と関数はpicと同じです
PIEは互換性がない可能性があるので注意してください-static