링크 라이브러리(libz.so.1.2.7)가 필요한 "alpha"라는 바이너리 실행 파일이 있습니다. 이 파일은 다음 위치에 있습니다./home/username/myproduct/lib/libz.so.1.2.7
다음 명령을 실행하여 바이너리 실행 파일을 생성하기 전에 터미널 인스턴스로 내보냈습니다.
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
이제 동일한 라이브러리가 필요하지만 다른 버전(예: 에서 사용 가능한 libz.so.1.2.8)이 필요한 다른 애플리케이션 "bravo"를 생성하면
/lib/x86_64-linux-gnu/libz.so.1.2.8
시스템에서 다음 오류가 발생합니다.
version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)
설정을 해제하면 LD_LIBRARY_PATH
"bravo"가 정상적으로 시작됩니다. 위의 동작은 LD_LIBRARY_PATH
정의된 디렉터리 경로보다 링크된 라이브러리가 우선적으로 검색되므로 위의 오류가 발생하기 때문이라는 것을 알고 있습니다 . /etc/ld.so.conf
라이브러리의 첫 번째 인스턴스가 다른 버전인 경우 UNIX/LINUX 개발자가 계층 구조를 기반으로 다른 디렉터리에 연결된 라이브러리를 검색하도록 운영 체제를 설계하지 않은 이유가 궁금합니다.
간단히 말해서 UNIX/LINUX 시스템은 필요한 라이브러리를 찾을 때까지 일련의 디렉토리를 탐색합니다. 그런데 버전에 관계없이 라이브러리의 첫 번째 인스턴스를 수락하는 대신 예상 버전을 찾을 때까지 동일한 작업을 수행하지 않는 이유는 무엇입니까?
답변1
그런데 버전에 관계없이 라이브러리의 첫 번째 인스턴스를 수락하는 대신 예상 버전을 찾을 때까지 동일한 작업을 수행하지 않는 이유는 무엇입니까?
아는 한 그렇습니다. zlib.so.1.2.7
둘 다 zlib.so.1.2.8
soname을 가지고 있으므로 zlib.so.1
귀하 alpha
와 bravo
바이너리는 그것이 필요하다고 말합니다 zlib.so.1
. 동적 로더는 찾은 첫 번째 일치 라이브러리를 로드합니다. 버전 1.2.8이 bravo
필요한 추가 기호를 제공한다는 사실을 인식하지 못합니다. (이것이 배포판이 zlib1g (>= 1.2.8)
for 와 같은 추가 종속성 정보를 지정하기 위해 노력하는 이유입니다 bravo
.)
이 문제는 수정하기 쉽다고 생각할 수도 있지만 그렇지 않습니다. 특히 바이너리와 라이브러리는 필요한 라이브러리와 별도로 필요한 기호를 나열하므로 로더는 지정된 라이브러리가 필요한 모든 기호를 제공하는지 여부를 확인할 수 없습니다. 모든 것은 그것으로부터 얻어져야 합니다. 기호는 다양한 방식으로 제공될 수 있으며 기호와 이를 제공하는 라이브러리 간의 링크를 도입하면 기존 바이너리가 손상될 수 있습니다. 기호 삽입은 또한 재미를 더하고 일을 복잡하게 만듭니다(보안에 민감한 개발자를 미치게 만듭니다).
.gnu.version_r
일부 라이브러리는 제공된 라이브러리에 대한 링크와 함께 궁극적으로 에 저장되는 버전 정보를 제공하는데 , 이는 여기서 도움이 될 수 있지만 libz
이는 그중 하나가 아닙니다.
(soname을 고려하면 alpha
바이너리가 zlib.so.1.2.8
.