ELF를 실행할 때 Linux는 로드 주소와 진입점을 어떻게 결정합니까?

ELF를 실행할 때 Linux는 로드 주소와 진입점을 어떻게 결정합니까?

ELF를 리눅스에서 사용하면 execve()해당 ELF를 프로세스의 메모리 공간에 mmap하고 진입점에서 코드 실행을 시작합니다. 하지만 커널은 ELF의 로드 주소와 진입점을 어떻게 결정합니까?

.p_vaddrASLR이 비활성화된 경우 각 PT_LOAD 세그먼트를 조회 하고 .e_entryELF 헤더를 진입점으로 사용합니다.

하지만 ASLR이 활성화되면 어떻게 될까요? 커널은 단순히 위의 모든 항목에 무작위 이동을 추가하지만 상대 위치는 유지합니까?

ELF의 내용이 커널 동작에 영향을 줍니까? PT_LOAD 세그먼트의 최소값이 .p_vaddr0이거나 0이 아닌 경우처럼요? ELF 헤더 처럼 .e_typeET_DYN 또는 ET_EXEC가 있나요?

특히 x86_64에 대해 이야기하고 있습니다.

관련 정보