Linux에서 정적 라이브러리와 공유 라이브러리의 생성과 사용을 이해하려고 합니다.도서관 안내. 링크에 내가 혼란스러워하는 두 문장이 있습니다.
- 정적 라이브러리를 사용하면 사용자는 코드를 다시 컴파일하지 않고도 프로그램에 연결할 수 있으므로 재컴파일 시간이 절약됩니다.
- 정적 라이브러리는 프로그래머가 자신의 라이브러리에 링크할 수 있도록 허용하지만 라이브러리 소스 코드를 제공하고 싶지 않은 개발자에게 유용한 경우가 많습니다.
1 관련: 정적 라이브러리는 실행 파일의 일부로 끝나는 반면, 공유 라이브러리는 독립적으로 유지되며 실행 파일이 실행되기 시작할 때만 로드됩니다. 그러나 두 라이브러리 모두 새 응용 프로그램에서 라이브러리를 사용하려고 할 때 다시 컴파일할 필요가 없다는 이점이 있습니까? 라이브러리 자체가 변경되지 않는다고 가정할 때? 이것이 사실이라면 왜 이 진술은 공유 라이브러리에 비해 정적 라이브러리의 장점이 있다는 인상을 주나요?
2에 관해서: 다시 말하지만, 이것은 공유 라이브러리에도 적용되지 않습니까? 공유 라이브러리는 아키텍처별 형식의 PIC로 생성되지만 객체 파일도 사용합니다. 그렇다면 이 경우에는 소스코드가 공유되나요?
답변1
나는 도서관에 대한 외부 지식을 가정하지 않고 제시된 순서대로 안내서를 이해해야한다고 생각합니다. 따라서2장, "정적 라이브러리", 비교에는 공유 라이브러리가 포함되지 않으며 아직 도입되지 않았습니다.
따라서 두 발췌문 모두 소스 코드와의 비교일 뿐입니다. 소스 코드를 제공하는 것에 비해 정적 라이브러리를 구축하면 소스 코드를 다시 컴파일하거나 제공하지 않고도 컴파일된 개체를 재사용할 수 있습니다.
답변2
발췌 내용이 불분명합니다.
정적 라이브러리는 실행 파일의 일부가 되며 해당 실행 파일 외부에서는 사용할 수 없습니다. 바라보다 man ld
. 이는 외부 기능과 동일하게 처리됩니다. 정적으로 연결된 실행 파일은 동적으로 연결된 실행 파일보다 크지만 완전합니다. 자급자족합니다.
동적 링크 라이브러리를 사용할 때 프로그램은 라이브러리 이름을 제공합니다. 필수 버전 등 man elf readelf
프로그램이 로드되면 ld.so
(참조 ) man ld.so
동적 링크 라이브러리가 작업의 메모리에 매핑되고(참조 man mmap
) 프로그램이 라이브러리에 액세스할 수 있도록 간접 호출 테이블이 설정됩니다. 동적 링크 라이브러리를 사용하면 시스템이 모든 작업 간에 RAM의 라이브러리 복사본을 공유할 수 있습니다. 동적 라이브러리를 사용하면 실행 파일이 더 작아지고 라이브러리 업데이트가 시스템 관리자에게 위임됩니다. 그러나 필요한 라이브러리와 버전을 사용할 수 없는 경우 실행 시 라이브러리 확인이 실패할 수 있습니다. 그것들은 완전하지도 않고 자급자족하지도 않습니다.