_start 진입점(커널, ld-linux.so 등)에는 무엇이 필요합니까?

_start 진입점(커널, ld-linux.so 등)에는 무엇이 필요합니까?

_start나는 ELF 실행 파일이 실행을 시작하려면 가시적인 서브루틴을 가져야 한다는 것을 알고 있습니다 . 그러나 내가 아는 한 커널은 실제로 ld-linux.so(또는 다른 인터프리터)를 호출하고 실행을 넘겨줍니다. 그래서 내 질문은 다음과 같습니다.

  1. _start진입점은 누가 지시하는가 ?
  2. 커널은 어떻게 "호출"됩니까 ld-linux.so? 안정적인 API가 있나요? _start말하자면 기능?

보너스 질문: 얼핏 보면 Glibc libdlld-linux.soGlibc는 둘 다 동일한 코드 기반의 일부이며 (서로의 비공개 인터페이스를 사용하여) 밀접하게 얽혀 있습니다. 이는 등을 libdl구현하기 위해 사용자 정의 동등한 라이브러리를 작성하는 것이 불가능하다는 것을 의미합니까 dlopen? C가 아닌 시스템 언어에서는 종속성이 없고 파일을 libc로드할 수 있는 *.so바이너리를 생성하는 것이 불가능합니까?

답변1

진입점은 일반적으로 _start실행 파일에 연결된 C 런타임 어셈블리 루틴에서 이름이 지정되고 정의됩니다. 이 짧은 코드 조각은 스택을 설정하고 C++ 생성자를 호출하고 마지막 으로 main. e_entry이 값은 _start링커가 가리키도록 설정됩니다.

검사 실행 파일을 사용하여 이를 확인할 수 있습니다 readelf -a progfile.

동적 링커가 먼저 로드되고 시작되고 프로그램에 필요한 공유 라이브러리를 로드하고 연결하는 역할을 담당하기 때문에 동적 링크는 상황을 좀 더 복잡하게 만듭니다. 동적 링커는 실행 파일에도 지정됩니다("프로그램 인터프리터"라고 함).

Lwn.net에는 두 부분으로 구성된 훌륭한 기사가 있습니다.프로그램 작동 방식(두 번째 부분), 이 주제에 대해 더 자세히 알고 싶다면 해당 책을 읽어 보시기 바랍니다.

관련 정보