유닉스 / 리눅스 시스템이 링크 된 라이브러리의 필요한 버전을 찾을 때까지 디렉토리를 통과하지 않는 이유는 무엇입니까? 다른 응용 프로그램 “bravo”를 생성

“alpha”라는 바이너리 실행 파일이 있는데 링크 된 라이브러리 (libz.so.1.2.7)가 필요합니다. /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 개발자가 계층 구조에 따라 다른 디렉토리에서 링크 된 라이브러리를 검색하도록 OS를 설계하지 않은 이유가 궁금합니다.

간단히 말해, UNIX / LINUX 시스템은 필요한 라이브러리를 찾을 때까지 일련의 디렉토리를 통과합니다. 그러나 버전에 관계없이 라이브러리의 첫 번째 인스턴스를 수락하는 대신 예상 버전을 찾을 때까지 왜 그렇게하지 않습니까?



답변

그러나 버전에 관계없이 라이브러리의 첫 번째 인스턴스를 수락하는 대신 예상 버전을 찾을 때까지 왜 그렇게하지 않습니까?

알고있는 한 그렇게합니다. zlib.so.1.2.7그리고 zlib.so.1.2.8모두의 불리는이 zlib.so.1당신의 있도록, alpha그리고 bravo바이너리들이 필요하다고 zlib.so.1. 동적 로더는 찾은 첫 번째 일치 라이브러리를로드합니다. 버전 1.2.8은 필요한 추가 기호를 제공한다는 것을 모릅니다 bravo. (이 때문에 배포판이와 같은 추가 종속성 정보를 지정하는 데 어려움을 겪는 이유 zlib1g (>= 1.2.8)입니다 bravo.)

이 문제를 쉽게 해결할 수 있다고 생각할 수도 있지만 바이너리와 라이브러리가 필요한 라이브러리와 별도로 필요한 기호를 나열하기 때문에 로더가 주어진 라이브러리가 모든 기호를 제공하는지 확인할 수는 없습니다. 그것으로부터 필요합니다. 심볼은 다양한 방식으로 제공 될 수 있으며 심볼과이를 제공하는 라이브러리 사이에 링크를 도입하면 기존 바이너리가 손상 될 수 있습니다. 또한 복잡한 것을위한 기호 삽입 기능이 추가되었습니다 (보안에 민감한 개발자가 머리카락을 찢어 버리게 함).

일부 라이브러리는에 제공되는 버전 정보를 .gnu.version_r제공하며 제공 라이브러리에 대한 링크가 여기에 도움이되지만 libz그 중 하나는 아닙니다.

(sonames을 부여하면 alpha바이너리가 제대로 작동 할 것으로 기대합니다 zlib.so.1.2.8.)


답변