2011-06-11 4 views
3

링커가 컴파일시 최소 작업 만 수행합니다 (예 : ). 은 프로그램에 필요한 라이브러리 루틴과 인덱스 이름 또는 개의 루틴 번호를 기록합니다 ( 라이브러리에 있음). (source) 런타임시 로더가 라이브러리를 찾는 방법에 대한 질문입니다.

은 그래서 ld.so는 데이터베이스, 응용 프로그램 자체 자체에 의해 기록 만에 모든 라이브러리를 확인하지 않습니다 의미, 그 gcc -lxxx로 지정 만은, 말을하는 것입니다.

이것은 내가 알기 전까지 ld.so이 데이터베이스의 모든 라이브러리를 하나씩 검사한다는 이전의 지식과 모순됩니다.

정확히 어떤 경우입니까? 나는이 질문에 대답에 자상을 만들 것입니다

+0

이 질문은 혼란 스럽습니다. ld.so가 데이터베이스를 점검하기를 기대하는 것은 무엇입니까? – Omnifarious

+0

@Omnifarious, 라이브러리 이름이 애플리케이션 바이너리에 임베딩되어 있다는 것을 알고 있기 때문에 제 질문은 다음과 같습니다. ** 로더 1 ** 이름 만 일치하는 라이브러리를 확인하거나 ** 모두 ** 찾을 수 있습니까? –

+0

나는 그것이 당신이 묻고있는 것이라고 생각했습니다. 그리고 그 대답은 그리 단순하지 않습니다. 이름과 일치하는 라이브러리 만 검사합니다. 그러나 도서관 자체는 그 목록에 새로운 이름을 추가 할 수 있습니다. 각 라이브러리와 실행 파일에는 의존하는 라이브러리 이름의 목록이 들어 있습니다. – Omnifarious

답변

4

... 링크 링커 (ld.so가되지 않음) 시간 모든 기호가 서로 연결되고있는 .o 인 파일이 만족하고 있는지 확인합니다에서

프로그램이 링크되는 라이브러리. 이러한 라이브러리 중 하나가 동적 라이브러리 인 경우 해당 라이브러리의 모든 심볼이 충족되는지 확인하기 위해 의존 라이브러리를 확인합니다 (-l 목록에 포함 할 필요 없음). 그리고 이것은 재귀 적으로 이것을 할 것입니다.

링크 시간에 제공된 -l 매개 변수를 통해 직접 실행 파일이 의존하는 라이브러리 만 실행 파일에 기록됩니다. 라이브러리 자체가 종속성을 선언 한 경우 링크가 -l 플래그로 지정되지 않은 한 해당 종속성은 실행 파일에 기록되지 않습니다.

링커를 실행하면 링크가 발생합니다. gcc의 경우 보통 gcc a.o b.o c.o -lm -o myprogram과 비슷합니다. 이것은 일반적으로 컴파일 과정이 끝날 때 발생합니다. 커버 아래에는 일반적으로 ld이라는 프로그램이 실행됩니다. 하지만 ldld.so (런타임 로더)과 전혀 다릅니다. 그들은 다른 엔티티 임에도 불구하고 비슷한시기에 다른 일을하기 때문에 비슷하게 이름이 지정됩니다.

로드는 프로그램을 실행할 때 발생하는 단계입니다. 동적 라이브러리의 경우 로더는 정적 라이브러리를 사용하는 경우 링커가 수행 할 많은 작업을 수행합니다.

프로그램이 실행되면 ld.so (런타임 로더)는 실제로 실행 파일의 기호를 공유 라이브러리의 정의에 연결합니다. 해당 공유 라이브러리가 다른 공유 라이브러리 (라이브러리에 기록 된 사실)에 종속되어있는 경우 해당 라이브러리를로드하고 해당 라이브러리까지 연결합니다. 이 모든 작업이 끝난 후에도 아직 해결되지 않은 기호가 있으면 로더가 프로그램을 중단합니다.

그래서 실행 파일에는 어떤 동적 라이브러리가 직접 종속되어 있는지가 표시됩니다. 각 라이브러리는 자신이 직접 의존하는 동적 라이브러리를 말합니다. 로더 (ld.so)는이를 사용하여 심볼을 찾을 라이브러리를 결정합니다. 적절한 기호를 찾기 위해 '데이터베이스'에있는 임의의 다른 라이브러리를 검색하지 않습니다. 종속성 체인에있는 라이브러리에 있어야합니다.

+0

@ 좋은 일이지만, 이것은 런타임에 의심을 드러내지 만 링크 시간에 대한 의심을 당신의 말로 소개했다.'컴파일/링크시 링커 (ld.so가 아님)는 모든 기호가 .o 함께 연결되는 파일은 프로그램이 연결되는 라이브러리에 의해 충족됩니다. '제 2 단락에서 나에게 모호한 소리가납니다. –

+0

@Je Rog : 명확히하려고했습니다. 나는 당신이 '연결'과 '로딩'의 구별에 혼란 스럽다고 생각합니다. '연결'은 컴파일 타임에 실행 파일을 생성 할 때 발생합니다. '로딩'은 프로그램을 실행할 때마다 발생합니다. 'ld.so'는 링커가 아니라 로더입니다. 동적 라이브러리는 프로그램이 실행될 때 로더가 끝내는 컴파일 타임에 링커가 할 일이 많기 때문에 이상합니다. 이것은 링커와 로더의 구분을 다소 어둡게 만든다. – Omnifarious

+0

@ Omnifarious, 나는이 발언의 정확성에 의문을 제기한다.'만약 어떤 라이브러리가 동적 라이브러리라면, 그 라이브러리에있는 모든 심볼이 만족하는지 확인하지 않을 것이다. ' –

관련 문제