Linux에서 실행 가능한 ELF 파일은 무엇입니까?
- 정적 링커
- 동적 링커
- 짐을 싣는 사람
- 동적 로더?
이것들 중 무엇이라고 불리는가?
- 통과
execve()
- 통과
dlopen()
?
execve()
실행 파일 호출 dlopen()
의 닭과 달걀 문제를 해결하기 위해 OR에서 어떻게 호출할 수 있습니까 ?execve()
dlopen()
감사해요.
답변1
사용하고 계신 것 같아요제프 다아시 정의:
- 정적 링크에는 컴파일 타임에 기호를 확인하는 작업이 포함되고, 동적 링크에는 런타임에 기호를 확인하는 작업이 포함됩니다.
- 정적 로딩에는 로드 시 실행 파일과 라이브러리 매핑이 포함되고, 동적 로딩에는 프로세스가 시작된 후 라이브러리 매핑이 포함됩니다.
모든 것을 분리하려고 노력하는 것은 실제로 의미가 없습니다. 대신 다음과 같은 기능 쌍을 고려해야 합니다.
- 정적 로딩, 정적 링크: 링커는
/usr/bin/ld
일반적으로 정적 라이브러리(.a
)와 함께 사용됩니다. 로더는 커널입니다. - 정적 로딩, 동적 링크: 링커는
/usr/bin/ld
다시 사용되지만 공유 라이브러리(.so
)에서는 로더가 바이너리 파일의 해석기입니다.예를 들어/lib64/ld-linux-x86-64.so.2
(/lib/x86_64-linux-gnu/ld-2.24.so
현재에 매핑됨) 64비트 x86의 Debian 9에서는 커널에 의해 자체적으로 로드되고 기본 실행 파일도 로드됩니다. - 동적 로딩, 정적 링크: 내가 아는 한 이것은 Linux에서는 사용되지 않습니다.
- 동적 로딩, 동적 링크: 로더는 라이브러리입니다. 예를 들어
libdl
링커는 라이브러리와 호출 프로그램으로 구분됩니다libdl
.
아마도 이 마지막 점에 대해서는 좀 더 설명이 필요할 것입니다. 프로그램이 libdl
로드 라이브러리를 사용할 때 다음을 호출합니다.dlopen
, 명명된 라이브러리와 프로세스에서 아직 사용할 수 없는 모든 종속성을 로드하고 명명된 라이브러리를 해당 종속성과 연결합니다. 그래서 libdl
로딩(필요한 라이브러리)과 링크(호출 프로그램이 아닌 라이브러리만)가 수행됩니다. 호출 프로그램이 명명된 라이브러리의 기호를 사용해야 할 경우 다음을 호출합니다.dlsym
요청된 기호를 찾을 수 있으면 해당 기호의 주소를 반환합니다. 따라서 호출 프로그램은 부분 연결을 수행합니다.
execve
아니면 닭이 먼저냐 달걀이 먼저냐는 문제의 여지가 없습니다 dlopen
. 프로그램은 (대부분의 프로그램이 실제로 사용하는 래퍼가 포함되어 있음) 및 기호(엄격히 말하면 앞서 언급한 래퍼)에 대한 execve
적절한 참조를 사용하여 컴파일 됩니다. 이러한 참조는 컴파일 시(정적 링커의 경우) 또는 로드 시(동적 링커의 경우) 해결됩니다. 그 후에는 기호를 사용할 수 있고 프로그램을 호출할 수 있습니다. 사용할 프로그램은 적절하게 참조됩니다. 편집을 위해 인용했습니다. 동적 링커 자체는 정적 바이너리이므로 커널은 동적 링커의 도움 없이 이를 로드할 수 있습니다. 이 주제에 대한 자세한 내용은 다음에서 확인할 수 있습니다.libc
execve
execve
dlopen
dlopen
libdl
dlopen
프로그램 작동 방식그리고프로그램 실행 방법: ELF 바이너리.
(모든 동적 경우에는링크, 지연 바인딩이 활성화된 경우 연결은 로드 시가 아닌 즉시 발생할 수 있습니다. )