Как Linux определяет адрес загрузки и точку входа при запуске ELF?

Как Linux определяет адрес загрузки и точку входа при запуске ELF?

Когда linux execve()запускает ELF, он mmap этого ELF в пространство памяти процесса и начинает выполнять код из точки входа. Но как ядро ​​определяет адрес загрузки и точку входа ELF?

Если ASLR отключен, он ищет .p_vaddrкаждый сегмент PT_LOAD и использует .e_entryзаголовок ELF в качестве точки входа.

А если ASLR включен? Ядро просто добавит случайный сдвиг ко всем вышеперечисленным, но сохранит их относительное положение?

Будет ли содержимое ELF влиять на поведение ядра? Например, если наименьший .p_vaddrсегмент PT_LOAD равен нулю или не равен нулю? Например, .e_typeзаголовок ELF — ET_DYN или ET_EXEC?

Я говорю особенно о x86_64.

Связанный контент