2012-11-23 4 views
3

Red Hat Linux 용 이름 서비스 스위치 모듈을 구축했습니다. strace를 사용NSS 모듈이 Linux에서 .so.2로 끝나는 이유는 무엇입니까?

, 나는 OS가 다양한 디렉토리에있는 라이브러리를 찾습니다 것으로 확인되었습니다 있지만 (xxx는 서비스 이름은 예를 들어 libnss_xxx.so.2) 확장 .so.2와 파일을

은 왜하지 않습니다 .so 또는 .so.1 라이브러리를 찾으십니까? .so.2 라이브러리를 찾는 것을 멈추지 않고 앞으로 .so.3 라이브러리를 찾기 시작할 것이라는 보장이 있습니까?

편집 : http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html2이 '때마다 인터페이스 변경 증가 버전 번호'이라고 말한다. 그러면 다음과 같을 것입니다.

  • NSS 버전에는 버전 2의 라이브러리가 필요합니다.
  • 업데이트 된 NSS가있는 OS 업데이트에는 다른 버전 번호가 필요할 수 있습니다.

누군가가 사실인지 여부를 확인할 수 있습니까?

답변

3

당신이있는 거 가정은 사소한 편집으로 일반적으로 사실이다 :

  • NSS의 버전은 인터페이스 버전 2와 라이브러리의 버전이 필요합니다.
  • 업데이트 된 NSS가있는 OS 업데이트에는 다른 버전 번호가 필요할 수 있습니다.

인터페이스의 버전이 라이브러리의 버전에 따라 변경 될 필요는 없습니다. 즉, 최신 버전의 라이브러리가 여전히 동일한 인터페이스를 제공 할 수 있습니다.

2

공유 라이브러리 (컴파일시 심볼로드 및 스캔, 프로그램 시작시 다시로드 및 링크) 및 모듈 (런타임에로드 및 링크 됨)에는 두 가지 유형이 있습니다. 공유 라이브러리의 개념은 프로그램에 특정 버전의 라이브러리가 필요하다는 것입니다. 이 버전은 컴파일 타임에 결정됩니다. 일단 프로그램이 컴파일되면 새로운 (호환되지 않는) 버전의 라이브러리가 설치되어 있어도 계속 작동해야합니다. 즉, 새 버전은 다른 파일이어야하므로 최신 프로그램 (또는 최근에 컴파일 된 프로그램)이 최신 버전을 사용하는 동안 오래된 프로그램은 이전 라이브러리를 계속 사용할 수 있습니다.

이 시스템을 제대로 사용하려면 프로그램이 어떻게 든 필요한 라이브러리 버전이 계속 설치되어 있는지 확인해야합니다. 이는 배포판 패키징 시스템의 작업 중 하나입니다. 프로그램이 들어있는 패키지는 라이브러리 패키지의 필수 버전에 대한 종속성이 있어야합니다.

그러나 모듈에 대해 말하는 것 같습니다. 상황이 다르다. 이러한 버전은 ld.so (공유 라이브러리로드를 담당)가로드하는 것이 아니기 때문에 이러한 버전을 포함하지 않습니다. 프로그램은 모듈과 함께 번들되어야하므로 모듈 버전은 항상 모듈 버전을 사용하는 프로그램과 호환됩니다. 이것은 대부분의 프로그램에 적용됩니다.

그러나 프로그램에서 타사 모듈을 허용하는 경우 작동하지 않습니다. 그래서 그들은 그들 자신의 버전 시스템을 만들 수 있습니다. 이것은 nss가 한 것 같습니다 (나는 그것에 익숙하지 않다.). 이것은 그들이 모듈이 어떻게 보일 것인가를 지정하는 프로토콜 버전 (현재 2)을 정의했다는 것을 의미합니다. 어떤 기호를 정의해야하는지, 함수가 예상하는 인수는 이러한 종류의 것입니다. 버전 2의 프로토콜에 따라 모듈을 만들면 .so.2 모듈의 이름을 지정해야합니다 (지원되는 버전을 확인하기위한 방법이기 때문입니다). 새로운 호환되지 않는 프로토콜 3을 만들면 .so.3을 찾습니다. 모듈은 더 이상 발견되지 않으며 새로운 프로토콜을 지원하지 않기 때문에 좋은 방법입니다.