2つのファイルを使用して、1つはgcc
でコンパイルおよびリンクされ、もう1つはnasm
およびld
で手動でコンパイルおよびリンクされます
これら2つのことの違いは何ですか? _readelf -h
_で確認できます
DYN (Shared object file)
EXEC (Executable file)
これらは Wikipediaに_ET_DYN
_および_ET_EXEC
_ として文書化されています。これら2つの間の実際的な違いは何ですか?
これは、Position Independent Executable(PIE)と関係があるようです。 GCCがデフォルトで実行可能ファイルをコンパイルすると、それらはPIEになり、ELFヘッダーの出力フラグがET_DYN
に変更されます。
あなたはPIE実行可能ファイルの生成を無効にすることができます
gcc -no-pie
このチェックが表示される場合、デフォルトのオプションgccがgcc -v
で構成されていると、--enable-default-pie
のようなものが表示されます。
回答のインスピレーション StackOverflowでのこの投稿による 。私はそれをもっと遊んで、ここでさらに説明するつもりです。
Linuxカーネル/ダイナミックローダーでのET_EXECとET_DYNの主な効果は、実行可能ファイルをランダムなメモリロケーションに配置できるかどうか、ASLRを使用できないかどうかを通知することです。
結論として、共有ライブラリとまったく同じようにランダム化できるため、PIE実行可能ファイルはDYNです。
私はこれをより詳細に調査しました: