Linux は ELF をロードするとexecve()
、その ELF をプロセスのメモリ空間にマップし、エントリ ポイントからコードの実行を開始します。しかし、カーネルはどのようにして ELF のロード アドレスとエントリ ポイントを決定するのでしょうか。
.p_vaddr
ASLR が無効になっている場合は、各 PT_LOAD セグメントのを検索し、 .e_entry
ELF ヘッダーをエントリ ポイントとして使用します。
しかし、ASLR が有効になっている場合はどうなるでしょうか? カーネルは上記のすべてにランダムなシフトを追加するだけで、相対的な位置は維持するのでしょうか?
ELF の内容はカーネルの動作に影響しますか? たとえば、.p_vaddr
PT_LOAD セグメントの最小値がゼロかゼロ以外か? たとえば.e_type
、ELF ヘッダーが ET_DYN か ET_EXEC か?
特に x86_64 について話しています。