1. ホーム
  2. gcc

[解決済み] gccやldで位置非依存の実行ファイルを作成するための-fPIEオプションとは何ですか?

2022-03-11 16:42:49

質問

関数の呼び出しなど、コードはどのように変わるのでしょうか?

どのように解決するのですか?

PIEは、以下をサポートします。 アドレス空間レイアウトランダム化 (ASLR) を実行ファイルに追加しました。

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

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

PIEは、以下のサイトで詳しく説明されています。 このOpenBSDのPIEに関するプレゼンテーション .

機能の変更点を表示 このスライドでは (PIEとPICの比較)。

x86 ピックとパイの比較

ローカル・グローバル変数と関数はパイで最適化される

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

であり このスライド (PIEと旧来のリンクの比較)

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

ローカル・グローバル変数と関数はfixedと同様

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

ただし、PIE は -static