정의되지 않은 버전의 라이브러리에 대한 연결은 언제 올바른 선택입니까?

정의되지 않은 버전의 라이브러리에 대한 연결은 언제 올바른 선택입니까?

strace프로그램에 지정되지 않은 일부 라이브러리 버전이 필요하다는 것을 발견 했습니다 gmp.

open("/lib/x86_64-linux-gnu/libgmp.so", O_RDONLY|O_CLOEXEC) = \
   -1 ENOENT (No such file or directory)

특정 인터페이스 버전(예 libgmp.so.10: )에 연결해야 한다고 생각합니다.

그런데 이런 일이 흔한 일은 아닌 것 같습니다. 이것은 우연입니까, 아니면 지정되지 않은 버전을 사용해야 할 타당한 이유가 있습니까?

내가 생각할 수 있는 유일한 허용 가능한 상황은 운영 체제 배포입니다. 즉, 각 패키지를 빌드(및 제어)합니다.

답변1

"허용할 수 없다"고는 말할 수 없지만 런타임 시 바이너리가 일반 이름으로 공유 라이브러리를 검색하는 것은 확실히 드문 일입니다 *.so. 대개:

  • (빌드 시간) 링커는 이름이 일치하는 라이브러리를 검색합니다.*.so
  • 찾은 경우 링커는 라이브러리의 SONAME 필드를 쿼리하여 런타임 시 라이브러리가 위치해야 하는 이름을 찾습니다.
  • 런타임에 검색하는 이름이 되도록 빌드된 바이너리에 해당 이름을 기록합니다.

이 규칙의 목적은 바이너리를 특정 API 버전의 라이브러리에 바인딩할 수 있도록 하는 것입니다.

문제의 라이브러리가 이 규칙을 사용하지 않을 수도 있습니다. 라이브러리에 SONAME 필드가 포함되어 있는지 확인하려면 다음을 수행하세요.

objdump -p /lib/`arch`-linux-gnu/libthing.so | fgrep SONAME

SONAME이 없으면 라이브러리에 연결된 바이너리는 기본적으로 빌드 시 라이브러리가 발견된 이름(예: SONAME *.so)을 사용합니다. 이것은 아마도 당신이보고있는 것입니다. SONAME이 있는 경우 라이브러리에 연결된 바이너리는 런타임에 해당 이름을 사용해야 합니다.

관련 정보