17.2. < Mechanism>
동적으로 로드된 라이브러리(공유 오브젝트)는 soname 이라는 메커니즘을 사용하여 여러 호환 가능한 라이브러리 버전을 관리합니다.
사전 요구 사항
- 동적 연결 및 라이브러리 이해
- ABI 호환성 개념에 대한 이해
- 라이브러리 이름 지정 규칙 이해
- 심볼릭 링크 이해
문제 소개
동적으로 로드된 라이브러리(공유 오브젝트)는 독립 실행 파일로 존재합니다. 이렇게 하면 라이브러리에 종속된 애플리케이션을 업데이트하지 않고 라이브러리를 업데이트할 수 있습니다. 그러나 이 개념에는 다음과 같은 문제가 발생합니다.
- 실제 라이브러리 버전을 지정합니다.Specifies the actual version of the library.
- 동일한 라이브러리의 여러 버전이 있어야 합니다.
- 각 버전의 ABI 호환성 신호
< Mechanism>
이 문제를 해결하기 위해 Linux는 soname이라는 메커니즘을 사용합니다.
라이브러리 foo
버전 X.Y 는 버전 번호에서 X 와 동일한 다른 버전과 호환되는 ABI입니다. 호환성을 유지하는 마이너 변경으로 숫자 Y 가 증가합니다. 호환성을 중단시키는 주요 변경 사항은 숫자 X 를 증가시킵니다.
실제 라이브러리 foo
버전 X.Y 는 libfoo.so.x .y 파일로존재합니다
. 라이브러리 파일 내에서 libfoo.so.x
값을 사용하여 soname이 기록되어 호환성을 신호합니다.
애플리케이션이 빌드되면 링커에서 libfoo.so
파일을 검색하여 라이브러리를 찾습니다. 이 이름의 심볼릭 링크가 있어야 실제 라이브러리 파일을 가리키는 심볼릭 링크가 있어야 합니다. 그런 다음 링커는 라이브러리 파일에서 soname을 읽고 이를 애플리케이션 실행 파일에 기록합니다. 마지막으로 링커는 이름 또는 파일 이름이 아니라 soname을 사용하여 라이브러리에 대한 종속성을 선언하도록 애플리케이션을 생성합니다.
런타임 동적 링커가 실행하기 전에 애플리케이션을 연결하는 경우 애플리케이션의 실행 파일에서 soname을 읽습니다. 이 soname은 libfoo.so.x
입니다. 이 이름의 심볼릭 링크가 있어야 실제 라이브러리 파일을 가리키는 심볼릭 링크가 있어야 합니다. 이렇게 하면 soname이 변경되지 않기 때문에 버전의 Y 구성 요소에 관계없이 라이브러리를 로드할 수 있습니다.
버전 번호의 Y 구성 요소는 단일 번호로만 제한되지 않습니다. 또한 일부 라이브러리는 버전으로 버전을 인코딩합니다.
파일에서 soname 읽기
라이브러리 파일의 soname을 표시하려면 somelibrary
:
$ objdump -p somelibrary | grep SONAME
somelibrary 를 검사할 라이브러리의 실제 파일 이름으로 바꿉니다.