공유 라이브러리 마이너 버전 관리

공유 라이브러리 마이너 버전 관리

다음과 같은 간단한 프로그램이 있습니다 main.

#include <iostream>
#include "random.h"

int main()
{
        std::cout << "The program has started\n";
        return get_another_random_number();
}

해당 get_another_random_number()기능은 새 버전의 공유 라이브러리에 있지만 이전 버전만 설치되어 있습니다. 예를 들어 프로그램이 실행되기 시작하지만 나중에 조회가 실패하면 충돌이 발생합니다.

$ ./main
The program has started
./main: symbol lookup error: ./main: undefined symbol: _Z25get_another_random_numberv

예를 들어, librandom.so.1.3.1이라는 함수를 포함했지만 get_another_random_number()방금 main설치한 서버에서 이 함수를 실행한 경우 이런 일이 발생합니다 librandom.so.1.2.5. 라이브러리는 부 버전에서만 다릅니다. 이 버전은 1.3라이브러리 버전과 이전 버전과 호환되지만 추가 기능이 부족하기 때문입니다.1.21.2

내 예에서 실행하면 다음과 같은 결과를 readelf -d main | grep NEEDED얻습니다.

 0x0000000000000001 (NEEDED)             Shared library: [librandom.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

따라서 모든 것은 주 버전 번호에만 연결됩니다.

내 공유 라이브러리에 이것을 넣고 /usr/lib/심볼릭 링크를 추가했습니다.

lrwxrwxrwx 1 root root     23 Feb  7 14:25 /usr/lib/librandom.so -> /usr/lib/librandom.so.1
lrwxrwxrwx 1 root root     27 Feb  7 14:13 /usr/lib/librandom.so.1 -> /usr/lib/librandom.so.1.2.5
-rw-r--r-- 1 root root   7696 Feb  7 14:00 /usr/lib/librandom.so.1.2.5

라이브러리 관리자, 애플리케이션 개발자, 시스템 관리자 중 이 프로그램이 충돌하지 않도록 하는 책임은 누구에게 있습니까?

  • 설치 프로세스에서 main현재 설치된 라이브러리의 부 버전이 너무 낮다는 오류가 발생합니까?
  • 프로그램이 버전을 식별하고 부 버전이 충분한지 확인하기 위해 라이브러리의 특수 함수를 호출해야 합니까?
  • 프로그램 실행을 시작하기 전에 라이브러리 로더가 모든 기호를 확인해야 합니까?
  • 버전 번호를 잘못 이해했거나 마이너 버전을 확인하는 설정을 놓친 걸까요?

답변1

버전 번호를 오해한 것이 아닙니다. 이는 실제로 기호 조회가 자주 필요한 영역입니다.

이것이 누구의 책임인지에 관해서는 현대 시스템에서는 라이브러리가 아니라 응용 프로그램을 구축하는 사람에게 속한다고 말하고 싶습니다. 응용 프로그램을 ld -z now(적어도 GNU binutils에서) 연결하면 동적 링커는 시작 시 모든 기호를 확인합니다. 기호가 누락된 경우 조기에 실패합니다. 따라서 직접 수동 검사를 추가할 필요가 없습니다. LD_BIND_NOW=1환경으로 내보내어 프로그램을 링크한 후 이 동작을 활성화 할 수 있습니다 (null이 아닌 모든 값이 가능하며 이는 Linux에만 국한되지 않습니다).

이러한 문제는 일반적으로 패키지 관리 시스템에 의해 처리됩니다. 패키지 관리 시스템은 기호 버전 요구 사항을 설명하는 광범위한 메타데이터를 유지하고 적절한 버전 종속성을 생성합니다. 라이브러리 작성자도 상황을 개선하는 데 도움을 줄 수 있지만 이를 위해서는 상당한 노력이 필요할 수 있습니다. GNU libc의 특수 버전 기호( GLIBC_...오류 메시지에 자주 나타나는 기호) 및 버전이 지정된 기호의 포괄적인 처리를 참조하세요.

관련 정보