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이 전 기본적으로 비어 있습니다 파일 이름 바꾸기가 동작을 바꿀 것이므로 나쁜 관행입니다.
필립은 데이비드 A. 휠러 (http://bit.ly/1CkQJmR)에 따르면, 불리는이 libnuke처럼, 하나의 버전 번호가 있습니다. so.1 또는 libnuke.so.4. 두 번째 버전 번호가 실제로 libnuke.so.1.2와 같이 soname의 일부가 될 수 있는지 알고 있습니까? –
글쎄요, 여러 자릿수의 아들이 존재합니다. 예를 들어 openssl 라이브러리가 있습니다 : SONAME : libssl.so.0.9.8,하지만 실제로는보다 제한적인 것처럼 보이는 데비안 인 "Program Library HOWTO"보다 더 일반적입니다 –
파일 이름과 soname이 다르게 설정되어야한다고 설명하고 있지만 나중에 soname을 설정하는 방법을 설명하지는 않습니다. – poolie