예를 들어, sqlite3을 업그레이드하고 싶다고 가정해 보겠습니다. 내 (apt-get) 업데이트 및 업그레이드 버전은 3.7.13입니다. 최신 버전은 3.7.14입니다. 소스에서 최신 버전을 설치하면 이 컴퓨터의 기존 소프트웨어가 손상되지 않는다는 것을 알 수 있습니까? 다른 소프트웨어에 의존하는 소프트웨어 목록이 있습니까?
sqlite3에는 꼭 필요한 것은 아니지만 일반적으로 알고 싶습니다.
저는 데비안 wheeze를 실행하고 있습니다.
답변1
바이너리 호환성 - ABI 및 API
업데이트가 컴퓨터의 기존 소프트웨어를 손상시킬 수도 있고 손상시키지 않을 수도 있는 이유를 이해하려면 라이브러리에 대한 모호한 아이디어가 있어야 합니다.ABI모래API에스. 바라보다이 관련 질문StackOverflow에 대해 자세히 알아보세요.
공유 라이브러리 버전 제어
소프트웨어는 일반적으로 최소한 주 버전 번호와 부 버전 번호가 함께 제공됩니다. 일반적으로 ABI 비호환성은 주요 버전 번호 변경 시 도입되어야 한다는 내용을 읽었습니다. 따라서 마이너 버전 간에 업그레이드하는 경우 일반적으로 이전 버전보다는 최신 버전을 설치하는 것이 안전합니다.
설치된 공유 라이브러리에는 파일 이름에 버전 번호가 추가되어야 합니다. 이는 일반적으로 다음과 같습니다.풀어 주다버전 번호. 소스 코드가 빌드되면 이 공유 라이브러리에 의존하는 다른 애플리케이션이 링크됩니다. 결과 바이너리는 동적 링커를 사용하여 해당 라이브러리로 식별되는 올바른 공유 라이브러리를 찾아야 합니다.기본버전 번호. (사용하는 링커에 따라 다를 수 있으며, ld
마이너 버전을 지정할 수 있는 옵션이 있을 수도 있습니다.)
libsqlite3
libsqlite3-0(3.7.13-1)을 예로 들면 공유 라이브러리 파일과 해당 라이브러리를 가리키는 두 개의 기호 링크가 있습니다.
> ls -l /usr/lib/x86_64-linux-gnu/libsqlite3.so*
lrwxrwxrwx 1 root root 19 Jun 14 14:05 /usr/lib/x86_64-linux-gnu/libsqlite3.so -> libsqlite3.so.0.8.6
lrwxrwxrwx 1 root root 19 Jun 14 14:05 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 -> libsqlite3.so.0.8.6
-rw-r--r-- 1 root root 692984 Jun 14 14:05 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6
그렇다면 라이브러리나 실행 파일이 링크되어 있는지, 그리고 어떤 버전에 의존하는지 어떻게 알 수 있을까요?
Linux에서는 다음을 사용합니다.
`ldd <filename>`
OS X의 경우:
`otool -L <filename>`
예를 들어 Python의 sqlite 모듈을 실행하는 데 필요한 libsqlite3 버전을 살펴보겠습니다.
> ldd /usr/lib/python2.7/lib-dynload/_sqlite3.so | grep sqlite
libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007fe32872c000)
따라서 전체 이름과 번호가 지정된 공유 라이브러리가 아닌 주요 버전 번호가 지정된 심볼릭 링크만 필요합니다. 그런 다음 업데이트하면 새 공유 라이브러리를 가리키도록 libsqlite3.so[.0] 심볼릭 링크만 업데이트해야 합니다.
소스에서 최첨단 libsqlite를 빌드하면 동일한 주요 버전 번호를 가진 공유 라이브러리가 생성될 것입니다. 그렇지 않은 경우 언제든지 심볼릭 링크를 덮어쓰고 원하는 버전을 가리키고 테스트한 후 필요한 경우 시스템 패키지로 되돌릴 수 있습니다.
자격
데비안을 사용할 때 "libsqlite3-0(267)에 의존하는 패키지"를 볼 수 있다는 점도 언급하고 싶었습니다 aptitude
(다른 패키지에서도 마찬가지입니다). 물론 소스에서 많은 애플리케이션을 컴파일하고 dpkg
이를 알리지 않으면 이 목록이 완전하지 않을 수 있습니다.