2012-09-28 3 views
33

"Program Library HOWTO"을 학습했습니다. 그것은 soname을 사용하여 다음과 같은 버전을 관리한다고 언급합니다.공유 라이브러리를 빌드하기위한 'soname'옵션은 무엇입니까?

gcc -shared -fPIC -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.0 foo.c 
ln -s libfoo.so.1.0.0 libfoo.so.1 
ln -s libfoo.so.1 libfoo.so 

그리고 soname이 설정되지 않은 경우 정보가 표시됩니다. libfoo.so.1.0.0과 같습니다. 대답은 here에서 확인하십시오.

그리고 그것은 또한 그래서 나는 오직 하나 개의 유용한 점은 당신이 사용할 때 soname 옵션은 당신에게 공유 라이브러리의 버전을 말할 수 있다고 생각

gcc -shared -fPIC -o libfoo.so.1.0.0 foo.c 
ln -s libfoo.so.1.0.0 libfoo.so.1 
ln -s libfoo.so.1 libfoo.so 

을 다음과 같이 불리는없이 작동 할 수 있음을 발견 확인하려면 readelf -d libfoo.so 명령을 사용하십시오.

그 밖의 기능은 무엇입니까?

답변

38

soname은 라이브러리가 지원하는 바이너리 API 호환성을 나타내는 데 사용됩니다.

SONAME은 라이브러리 파일에서 실제 대상 라이브러리 버전을 확인하기 위해 링커에서 컴파일 할 때 사용됩니다. gcc -l NAME은 lib NAME .so 링크 또는 파일을 찾아보다 확실하게 SONAME을 캡처합니다 (예 : SONNAME libnuke.so.0을 포함하는 libnuke.so.0.1.4에 libnuke.so 링크가 있음).

런타임시 ELF 동적 섹션 NEEDED으로 설정되면이 이름 (또는 링크)이있는 라이브러리가 있어야합니다. 런타임에 SONAME은 무시되므로 링크 또는 파일 존재만으로 충분합니다.

참고 : SONAME은 링크/빌드시에만 적용되며 런타임에는 적용되지 않습니다.

라이브러리의 'SONAME'은 'objdump -p file | grep SONAME'으로 볼 수 있습니다. 바이너리의 '필요'는 'objdump -p file | grep NEEDED'로 볼 수 있습니다.

[편집] 경고 다음은 일반적인 발언이며 리눅스에 배포 된 발언은 아닙니다. 끝 부분을 참조하십시오.

의 당신이 libnuke.so.1.2 이름을 가진 라이브러리를 가지고 있고 새 libnuke 라이브러리 개발 가정 해 봅시다 : 새 라이브러리 API를 변경하지 않고 이전의 수정 인 경우

  • 을, 당신은 단지 동일한 불리는를 유지해야 , 파일 이름의 버전을 늘리십시오. 즉 파일은 libnuke.so.1.2.1이지만 soname은 여전히 ​​libnuke.so.1.2입니다.
  • 새 기능 만 추가했지만 기능을 손상시키지 않고 이전과 여전히 호환되는 새 라이브러리가 있다면 이전 버전과 동일한 soname과 .1과 같은 새 접미사를 사용하고 싶습니다. ie 파일과 soname은 libnuke.so.1.2.1이 될 것입니다. libnuke.1.2와 연결된 모든 프로그램은 여전히 ​​그 프로그램과 함께 작동합니다. libnuke.1.2.1과 연결된 새로운 프로그램은 libnuke.1.2.1.1처럼 새로운 서브 버전이 생길 때까지만 작동합니다.
  • 새 라이브러리가 libnuke와 호환되지 않는 경우 : libnuke.so.2
  • 새 라이브러리가 이전 버전 인 libnuke.so.1.3과 호환되는 경우 [libnuke.so와 계속 호환됩니다.1]

[편집] 완료하려면 : 리눅스 경우.

특정 형태로 리눅스 실제 생활 SONAME에서

:. LIB [NAME] [API-VERSION] .so를 [메이저 버전] 메이저 버전은 각 주요 도서관의 변화로 증가 하나 개의 정수 값입니다. libnuke.so.0.1.5

나는 불리는를 제공하지 않는 것이 생각 : API 버전은

그런 다음 실제 파일 이름 부 버전과 전복을 포함

전직 libnuke.so.0이 전 기본적으로 비어 있습니다 파일 이름 바꾸기가 동작을 바꿀 것이므로 나쁜 관행입니다.

+1

필립은 데이비드 A. 휠러 (http://bit.ly/1CkQJmR)에 따르면, 불리는이 libnuke처럼, 하나의 버전 번호가 있습니다. so.1 또는 libnuke.so.4. 두 번째 버전 번호가 실제로 libnuke.so.1.2와 같이 soname의 일부가 될 수 있는지 알고 있습니까? –

+0

글쎄요, 여러 자릿수의 아들이 존재합니다. 예를 들어 openssl 라이브러리가 있습니다 : SONAME : libssl.so.0.9.8,하지만 실제로는보다 제한적인 것처럼 보이는 데비안 인 "Program Library HOWTO"보다 더 일반적입니다 –

+0

파일 이름과 soname이 다르게 설정되어야한다고 설명하고 있지만 나중에 soname을 설정하는 방법을 설명하지는 않습니다. – poolie

0

는 또 다른 측면 : 는 적어도 리눅스에 SONAME 항목이 명령 ldconfig를 실행/lib 디렉토리/lib64에 등 에서 적절한 링크를 만드는 방법에 대한 런타임 링커 시스템에 대한 힌트를 제공합니다라는 이름의 심볼릭 링크를 만들려고 SONAME은 런타임 링커 캐시에도 포함됩니다. 동일한 SONAME을 태그 지정하는 최신 라이브러리가 링크 경주에서 우승합니다. 특정 소프트웨어가 특정 SONAME에 의존하고 라이브러리를 갱신하려면이 새 라이브러리 (ldconfig가 캐시와 링크를 다시 작성하는 데 사용되는 경우)에 ldconfig 스틱을 가져 오려면이 SONAME을 제공해야합니다. 예 : libssl.so.6 및 libcrypto.so.6은 그러한 경우입니다.

1

libA.so가 libB.so에 종속되어 있고 이들이 모두 디렉토리에 있다고 가정합시다 (물론 동적 링커에서는 디렉토리를 찾을 수 없습니다). 당신이 soname을 설정하지 않은 경우 dlopen이 작동하지 않습니다 : 런타임 링커가 너무 pANULL로 설정되어 libB.so를 찾을 수 없습니다

auto pB = dlopen("./libB.so", RTLD_LAZY | RTLD_GLOBAL); 
auto pA = dlopen("./libA.so", RTLD_LAZY | RTLD_GLOBAL); 

때문입니다. 지옥에서 당신을 저장합니다이 경우 soname에서

...

관련 문제