
2つのファイルを使用すると、1つはコンパイルされリンクされ、もうgcc
1つは手動で使用されますnasm
。ld
- ELF 32ビットLSB共有オブジェクト...
- ELF 32ビットLSB実行可能ファイル...
これら2つの違いは何ですか?私が見るreadelf -h
ことができるもの
- タイプ:
DYN (Shared object file)
- タイプ:
EXEC (Executable file)
以下でこの履歴を見ることができます。ET_DYN
次のためのウィキペディアET_EXEC
。 2つの間の実質的な違いは何ですか?
答え1
これは場所に依存しない実行可能ファイル(PIE)に関連しているようです。 GCCはデフォルトで実行可能ファイルをコンパイルするときにPIEにし、ELFヘッダの出力フラグをET_DYN
。
以下を使用して、PIE実行可能ファイルの作成を無効にできます。
gcc -no-pie
この内容が表示されたら、gcc設定のデフォルトオプションを確認すると、次のgcc -v
内容が表示されます--enable-default-pie
。
以下からインスピレーションを受けた回答StackOverflowのこの提出を通じて。ここではもう少し活用してさらに説明します。
答え2
Linuxカーネル/ダイナミックローダでET_EXECとET_DYNの主な役割は、ASLRを使用して実行可能ファイルを任意のメモリ位置に配置できるかどうかを知らせるようです。
結論として、PIE実行可能ファイルは共有ライブラリのようにランダムに指定できるため、DYNです。
私はこれをさらに詳しく調べて、次のようになります。
- 関連Linuxカーネル5.0コードへのポインタ:Linuxバイナリが場所に依存しないコードでコンパイルされたかどうかをテストする方法は?
- PIE ASLRを直接観察する方法を示します。https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031#51308031