Когда 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.