_start
나는 ELF 실행 파일이 실행을 시작하려면 가시적인 서브루틴을 가져야 한다는 것을 알고 있습니다 . 그러나 내가 아는 한 커널은 실제로 ld-linux.so
(또는 다른 인터프리터)를 호출하고 실행을 넘겨줍니다. 그래서 내 질문은 다음과 같습니다.
_start
진입점은 누가 지시하는가 ?- 커널은 어떻게 "호출"됩니까
ld-linux.so
? 안정적인 API가 있나요?_start
말하자면 기능?
보너스 질문: 얼핏 보면 Glibc libdl
와 ld-linux.so
Glibc는 둘 다 동일한 코드 기반의 일부이며 (서로의 비공개 인터페이스를 사용하여) 밀접하게 얽혀 있습니다. 이는 등을 libdl
구현하기 위해 사용자 정의 동등한 라이브러리를 작성하는 것이 불가능하다는 것을 의미합니까 dlopen
? C가 아닌 시스템 언어에서는 종속성이 없고 파일을 libc
로드할 수 있는 *.so
바이너리를 생성하는 것이 불가능합니까?
답변1
진입점은 일반적으로 _start
실행 파일에 연결된 C 런타임 어셈블리 루틴에서 이름이 지정되고 정의됩니다. 이 짧은 코드 조각은 스택을 설정하고 C++ 생성자를 호출하고 마지막 으로 main
. e_entry
이 값은 _start
링커가 가리키도록 설정됩니다.
검사 실행 파일을 사용하여 이를 확인할 수 있습니다 readelf -a progfile
.
동적 링커가 먼저 로드되고 시작되고 프로그램에 필요한 공유 라이브러리를 로드하고 연결하는 역할을 담당하기 때문에 동적 링크는 상황을 좀 더 복잡하게 만듭니다. 동적 링커는 실행 파일에도 지정됩니다("프로그램 인터프리터"라고 함).
Lwn.net에는 두 부분으로 구성된 훌륭한 기사가 있습니다.프로그램 작동 방식(두 번째 부분), 이 주제에 대해 더 자세히 알고 싶다면 해당 책을 읽어 보시기 바랍니다.