... 링크 링커 (ld.so가되지 않음) 시간 모든 기호가 서로 연결되고있는 .o 인 파일이 만족하고 있는지 확인합니다에서
프로그램이 링크되는 라이브러리. 이러한 라이브러리 중 하나가 동적 라이브러리 인 경우 해당 라이브러리의 모든 심볼이 충족되는지 확인하기 위해 의존 라이브러리를 확인합니다 (-l
목록에 포함 할 필요 없음). 그리고 이것은 재귀 적으로 이것을 할 것입니다.
링크 시간에 제공된 -l
매개 변수를 통해 직접 실행 파일이 의존하는 라이브러리 만 실행 파일에 기록됩니다. 라이브러리 자체가 종속성을 선언 한 경우 링크가 -l
플래그로 지정되지 않은 한 해당 종속성은 실행 파일에 기록되지 않습니다.
링커를 실행하면 링크가 발생합니다. gcc의 경우 보통 gcc a.o b.o c.o -lm -o myprogram
과 비슷합니다. 이것은 일반적으로 컴파일 과정이 끝날 때 발생합니다. 커버 아래에는 일반적으로 ld
이라는 프로그램이 실행됩니다. 하지만 ld
은 ld.so
(런타임 로더)과 전혀 다릅니다. 그들은 다른 엔티티 임에도 불구하고 비슷한시기에 다른 일을하기 때문에 비슷하게 이름이 지정됩니다.
로드는 프로그램을 실행할 때 발생하는 단계입니다. 동적 라이브러리의 경우 로더는 정적 라이브러리를 사용하는 경우 링커가 수행 할 많은 작업을 수행합니다.
프로그램이 실행되면 ld.so (런타임 로더)는 실제로 실행 파일의 기호를 공유 라이브러리의 정의에 연결합니다. 해당 공유 라이브러리가 다른 공유 라이브러리 (라이브러리에 기록 된 사실)에 종속되어있는 경우 해당 라이브러리를로드하고 해당 라이브러리까지 연결합니다. 이 모든 작업이 끝난 후에도 아직 해결되지 않은 기호가 있으면 로더가 프로그램을 중단합니다.
그래서 실행 파일에는 어떤 동적 라이브러리가 직접 종속되어 있는지가 표시됩니다. 각 라이브러리는 자신이 직접 의존하는 동적 라이브러리를 말합니다. 로더 (ld.so)는이를 사용하여 심볼을 찾을 라이브러리를 결정합니다. 적절한 기호를 찾기 위해 '데이터베이스'에있는 임의의 다른 라이브러리를 검색하지 않습니다. 종속성 체인에있는 라이브러리에 있어야합니다.
이 질문은 혼란 스럽습니다. ld.so가 데이터베이스를 점검하기를 기대하는 것은 무엇입니까? – Omnifarious
@Omnifarious, 라이브러리 이름이 애플리케이션 바이너리에 임베딩되어 있다는 것을 알고 있기 때문에 제 질문은 다음과 같습니다. ** 로더 1 ** 이름 만 일치하는 라이브러리를 확인하거나 ** 모두 ** 찾을 수 있습니까? –
나는 그것이 당신이 묻고있는 것이라고 생각했습니다. 그리고 그 대답은 그리 단순하지 않습니다. 이름과 일치하는 라이브러리 만 검사합니다. 그러나 도서관 자체는 그 목록에 새로운 이름을 추가 할 수 있습니다. 각 라이브러리와 실행 파일에는 의존하는 라이브러리 이름의 목록이 들어 있습니다. – Omnifarious