정적 라이브러리는 함께 보관 된 개체 파일의 목록 일뿐입니다.
정적 라이브러리에서 정의되지 않은 기호는 어떻게 해결됩니까?
정의되지 않은 기호가 없으므로 해결되지 않았습니다. 심볼은 링키지 단계에서만 정의되지 않은 것으로 간주되며 정적 라이브러리를 만들 때 연결이 이루어지지 않습니다.
정적 라이브러리와 바이너리를 연결할 때 정의되지 않은 기호가있을 수 있습니다. 이 경우 정적 라이브러리는 프로그램의 일부처럼 취급되므로 정적 라이브러리에서 사용되는 심볼에 대한 모든 참조는 빌드하는 프로그램의 범위에서 사용할 수 있어야합니다. 예를 들어, 프로그램 A
이 다른 라이브러리 D
의 심볼 C
을 사용하는 정적 라이브러리 B
과 연결되면 A
프로그램은 B
및 D
과 연결해야합니다.
는 따라 진 동적으로 정의되지 않은 심볼 네, 할 수
를로드 할 수 있습니다. 그러나 당신이 정말로 게으르고 역동적 인 해결책을 필요로하지 않는다면 그렇게하지 말아야합니다.
또는 기호가 컴파일시에 다른 정적 라이브러리 또는 오브젝트 파일에 의해
개체 파일뿐만 아니라 정적 라이브러리를 해결해야, 어떤 기호를 확인할 수 없습니다. 그것을하는 링커입니다.
컴파일러의 해결은 ...
컴파일러는 종속성을 해결하지 않습니다 수 있습니다. 이것은 링커의 일입니다. 종속성은 연계 시간에 또는 런타임 중에 동적 링커에 의해 해결 될 수 있습니다. 동적 라이브러리에 연결하여 (정적 라이브러리에 를 따라 응용 프로그램의)
종속성 ...
이
링커가 사용하는 정적 라이브러리를 이해할 수있는 것은있는 문자에 따라 달라집니다 동적 라이브러리에서 링크 할 수 있습니다.
만약 그렇다면 결과 바이너리로 정적으로 해결 된 코드 텍스트 또는 동적 참조가 존재합니까?
공유 라이브러리에 링크하면 해당 프로그램에서 정적으로 사용할 수있는 프로그램이 없습니다. 그것이 공유 라이브러리의 핵심입니다. 단, LTO 만 예외입니다. 당신이 연결하는 정적 라이브러리는 정적 라이브러리의 어떤 것도 동적으로 사용할 수없고, 컴파일되며, 사용되지 않는 심볼은 제거됩니다. 예를 들어
정적 라이브러리 L은 libc6.so에서의 malloc을 사용하며이를 응용 A. 윌 L에 의해 사용될 것이다 및 모두 동적 libc6.so에서의 malloc를 사용합니까? malloc()
의 정의는 어떤 이유로 정적 라이브러리와 컴파일러를 컴파일시 사용할 수있었습니다 않는
예, 단지 정적 라이브러리의 코드로
malloc()
의 몸을 인라인. 그러나
malloc()
으로는 발생하지 않습니다. 다른 기능들로 바꿀 수있었습니다.
'man gcc'를 실행하면'-static' 플래그가 보입니다. – Kevin