2013-11-25 8 views
4

미리 컴파일 된 바이너리의 의존성 (특히 glibc 및 libstdC++ 심볼 & 버전)을 확인하는 가장 좋은 방법은 무엇입니까?리눅스에서 바이너리 호환성 결정

각 기계 (고용주 제한)에서 컴파일 할 소스 코드를 제공 할 수 없기 때문에 defacto "각 컴퓨터에서 컴파일하여 호환성을 보장"하는 응답이 적합하지 않습니다. 또한 정적으로 컴파일 된 바이너리를 제공하고 싶지는 않습니다.> 계란을 열기 위해 망치를 사용하는 경우가 많은 것처럼 보입니다.

나는 주위 기호를 결정 느슨하게 센터/내 실행 파일/라이브러리를 도서관 접근 방법 고려한는 다음 ldd -v </path/executable> 또는 objdump -x </path/executable> | grep UND 어떻게 든 확인하기 위해 대상 시스템에 명령을 실행 같은 명령의 사용을 통해 필요 그러한 기호, 라이브러리 및 버전이 제공된 경우 (이 단계를 어떻게 수행하는지 완전히 알 수는 없습니까?). 다음에 올바른 패턴 또는 그 이상이 있는지 확인하기 위해 패턴 또는 심볼 일치가옵니다.

그건 그렇고, 나는 이미이 일이 크게 이루어졌고 나는 지식 갭으로 고통 받고 있다고 생각합니다. 현재 구현되는 방법에 대해 설명합니다.

진행 방법에 대한 의견이나 제안이 있으십니까?

이것은 배포 가이드 라인이나 표준화 된 패키징 방법을 따르지 않을 수도있는 다양한 Linux 배포판 (특히 맞춤형 클러스터)에 내 소프트웨어를 설치하기위한 목적으로 추가해야합니다. 목표는 완벽한 설치입니다.

+0

가능한 중복 : http://stackoverflow.com/questions/4266354/how-to-tell-if-glibc-is-used의 glibc와 stdC++와 관련된 – oakad

+0

GNU 헤더는 해당 버전 매크로를 정의하고있다. 실제로 stdC++를 사용하면 gcc 버전에 의존 할 수 있으며 항상 함께 사용합니다. – oakad

+0

내가 사용하고있는 라이브러리 중 일부는 타사에서 제공하므로 버전 매크로를 내부적으로 검사 할 수있는 소스 액세스 권한이 없습니다. – John

답변

1

응용 프로그램과 다양한 Linux 배포판의 이진 호환성을 확인하려면 Linux 응용 프로그램 검사기 도구 ([1], [2], [3])를 사용하십시오. 이 도구를 사용하여 사용자 정의 배포판과의 호환성을 확인할 수도 있습니다.

enter image description here

+0

내 사용자 정의 배포가 아닙니다. 필자가 경험 한 바에 따르면 리눅스 클러스터를 만날 때마다 시스템 관리자가 여러 가지 비표준 방식으로이를 사용자 정의했습니다. 하나의 일반적인 증상은 소프트웨어를 설치할 위치를 선호한다는 것입니다. 저는/opt를 기본값으로 사용합니다 (LSB가 지정한 것으로 생각합니다).하지만 설치의 50 %는 다른 곳에서 선호합니다. – John

4

GNU 라이브러리 (glibc 및 libstdC++)는 심볼 버전 관리라는 메커니즘을 지원합니다. 먼저이 라이브러리는 동적 링커가 사용하는 특수 기호를 내보내 적절한 기호 버전 (libstdC++의 경우 CXXABI_ * 및 GLIBCXX_ *, glibc의 경우 GLIBC_ *)을 확인합니다. 의 조정에 간단한 스크립트 :

nm -D libc.so.6 | grep " A " 

는 최대 지원 libc의 인터페이스 버전 (된 libstdc 대한 동일한 작동 ++) 설정하는 처리를 더 쉘 될 수 버전 심볼들의리스트를 반환한다. C 코드에서 dlvsym()을 사용하여 라이브러리를 먼저 dlopen() 한 다음 dlvsym()을 사용하여 필요한 최소 기호 버전을 조회 할 수 있는지 여부를 확인하는 옵션이 있습니다.

런타임에 glibc 버전을 얻는 다른 옵션에는 gnu_get_libc_version() 및 confstr() 라이브러리 호출이 포함됩니다.

그러나 버전 관리 인터페이스의 적절한 사용은 명시 적으로 특정 glibc/libstdC++ 라이브러리 버전에 링크되는 코드를 작성하는 것입니다. 예를 들어, GLIBC_2.10 인터페이스 버전에 링크하는 코드는 2.10보다 새로운 glibc 버전 (2.18 이상의 모든 버전)에서 작동 할 것으로 예상됩니다. ".symver"어셈블러/링커 지시어를 사용하여 심볼 단위로 버전 관리를 가능하게하는 것이 가능하지만 좀 더 합리적인 접근법은 구버전 (최소 지원) 버전의 툴체인을 사용하여 chroot 환경을 설정하고 프로젝트를 컴파일하는 것입니다 그것은 (그것은 어떤 최신 버전이든간에 원활하게 실행됩니다).