쉘에서 로더가 fork(), exec() 시퀀스 ELF를 읽고 사용하는 위치를 아는 사람이 있습니까? Linux를 예로 사용할 수 있습니다.
내가 이 질문을 하는 이유는 내가 이해한 바에 따르면 ELF에는 메모리 세그먼트와 레이아웃에 대한 정보가 있기 때문입니다. 이 ELF 정보가 어디에, 어떻게 활용되는지 궁금합니다.
EXECVE(2)의 업데이트:
실행 파일이 공유 라이브러리 루트를 포함하는 a.out 동적으로 링크된 바이너리 실행 파일인 경우 실행 시작 시 Linux 동적 링커 ld.so(8)가 호출되어 필요한 공유 개체를 메모리에 배치하고 실행 파일을 배치합니다. 그들에게.
실행 파일이 동적으로 링크된 ELF 실행 파일인 경우 PT_INTERP 섹션에 지정된 인터프리터는 필요한 공유 객체를 로드하는 데 사용됩니다. glibc와 연결된 바이너리의 경우 이 인터프리터는 일반적으로 /lib/ld-linux.so.2입니다(ld-linux.so(8) 참조).
LD.SO(8)에서 우리는 다음을 알고 있습니다:
ld.so 프로그램은 오래 전에 사용된 바이너리 형식인 a.out 바이너리 파일을 처리합니다. 프로그램 ld-linux.so*(libc5의 경우 /lib/ld-linux.so.1, glibc2의 경우 /lib/ld-linux.so.2)는 최신 ELF 형식의 바이너리를 처리합니다.
링커 편집기가 ELF 헤더, 프로그램 헤더 및 섹션 헤더(표시된 대로)의 정보를 사용하여 프로그램 파일의 원본 프로그램 데이터를 프로세스의 주소 공간으로 복사하는 방법에 대한 정보가 여전히 부족합니다. 이 주소 공간은 정적 데이터와 텍스트 세그먼트로 구성됩니다. 그런 다음 SP 및 PC 호출 프로그램 파일 텍스트 진입점을 설정하는 작업이 있습니다.
내가 이해한 바로는 exec()는 프로그램 중단(프로세스에 할당된 메모리의 최상위)을 정적 데이터와 텍스트 세그먼트 크기의 합으로 설정한 다음 해당 세그먼트를 프로그램 중단 아래의 프로그램 주소 공간에 복사합니다.