Linux は、ELF を実行するときにロード アドレスとエントリ ポイントをどのように決定するのでしょうか?

Linux は、ELF を実行するときにロード アドレスとエントリ ポイントをどのように決定するのでしょうか?

Linux は ELF をロードするとexecve()、その ELF をプロセスのメモリ空間にマップし、エントリ ポイントからコードの実行を開始します。しかし、カーネルはどのようにして ELF のロード アドレスとエントリ ポイントを決定するのでしょうか。

.p_vaddrASLR が無効になっている場合は、各 PT_LOAD セグメントのを検索し、 .e_entryELF ヘッダーをエントリ ポイントとして使用します。

しかし、ASLR が有効になっている場合はどうなるでしょうか? カーネルは上記のすべてにランダムなシフトを追加するだけで、相対的な位置は維持するのでしょうか?

ELF の内容はカーネルの動作に影響しますか? たとえば、.p_vaddrPT_LOAD セグメントの最小値がゼロかゼロ以外か? たとえば.e_type、ELF ヘッダーが ET_DYN か ET_EXEC か?

特に x86_64 について話しています。

関連情報