web-dev-qa-db-ja.com

「LSB実行可能ファイル」(ET_EXEC)と「LSB共有オブジェクト」(ET_DYN)の違いは何ですか?

2つのファイルを使用して、1つはgccでコンパイルおよびリンクされ、もう1つはnasmおよびldで手動でコンパイルおよびリンクされます

  • ELF 32ビットLSB共有オブジェクト...
  • ELF 32ビットLSB実行可能ファイル...

これら2つのことの違いは何ですか? _readelf -h_で確認できます

  • タイプ:DYN (Shared object file)
  • タイプ:EXEC (Executable file)

これらは Wikipediaに_ET_DYN_および_ET_EXEC_ として文書化されています。これら2つの間の実際的な違いは何ですか?

5
Evan Carroll

これは、Position Independent Executable(PIE)と関係があるようです。 GCCがデフォルトで実行可能ファイルをコンパイルすると、それらはPIEになり、ELFヘッダーの出力フラグがET_DYNに変更されます。

あなたはPIE実行可能ファイルの生成を無効にすることができます

  • gcc -no-pie

このチェックが表示される場合、デフォルトのオプションgccがgcc -vで構成されていると、--enable-default-pieのようなものが表示されます。

回答のインスピレーション StackOverflowでのこの投稿による私はそれをもっと遊んで、ここでさらに説明するつもりです。

2
Evan Carroll

Linuxカーネル/ダイナミックローダーでのET_EXECとET_DYNの主な効果は、実行可能ファイルをランダムなメモリロケーションに配置できるかどうか、ASLRを使用できないかどうかを通知することです。

結論として、共有ライブラリとまったく同じようにランダム化できるため、PIE実行可能ファイルはDYNです。

私はこれをより詳細に調査しました: