2012-01-09 2 views
3

나는 ABI 크로스 체크 툴을 찾고있다. 지금은 몇 가지 도구는 이러한 질문에 다른 질문에 제안 만난 :ABI 호환성 헤더/라이브러리 교차 검사

How to test binary compatibility automatically?

Static analysis tool to detect ABI breaks in C++ 이제

이 정확히되지 않습니다 내가 뭘하려고 - 이러한 ABI를 추적으로 버전 간 변경.

주어진 프로젝트 소스 파일 + 라이브러리 헤더 파일과 라이브러리 .so 파일뿐 아니라 컴파일러 버전 (라이브러리와 프로젝트 모두를 컴파일하는 데 사용됨)이 궁금 해서요. ABI의 출력은 컴파일 된 라이브러리와 일치합니까?

그래서 업스트림 라이브러리가 libfoo.so 및 libfood.so를 제공 한 경우에 해당합니다. 음식이 약간 다른 ABI 인 경우 (float 대신 double을 말하십시오), 컴파일을하지 않을 정도로 멀리는 아닙니다.

  • 컴파일 된 실행 파일이 올바른 lib에 링크되어 있다고 말하는 테스트 (방탄이 아님)가 가능합니까?
  • 이렇게하는 도구가 있습니까?

답변

1

libfoo.so이 C로 코딩되어 있다고 가정하면 (헤더 파일이없는 경우), 예를 들어 알 수있는 방법이 없습니다. 공유 객체의 기호 테이블에 입력 정보가 ​​포함되어 있지 않기 때문에 (예 : 일반적인 지혜를 제외하고는 라이브러리에 malloc 함수를 포함하여 두 개의 정수를 더하고 합계를 반환하는 함수를 포함하지 않습니다. 힙 할당).

따라서 libfoo.so은 악용 될 수 있습니다. 그러나 일반적으로 일부 공유 라이브러리에는 심볼과 관련된 버전이 있습니다 (라이브러리가 dlopen 인 경우 dlvsym을 통해 프로그래밍 방식으로이 버전을 쿼리 할 수 ​​있습니다). 버전을 생성 할 수있는 방법이 있습니다.

라이브러리가 순수한 C++ 인 경우 심볼은 mangled이므로 인코딩에 서명이 포함됩니다.

라이브러리의 버전을 반환하는 라이브러리의 일부 기능을 사용하는 것이 가장 좋습니다. 좋은 예를 들어 glib version information 함수를보십시오.

1

ABI compliance checker은 두 라이브러리 간의 변경 내용에 대한 응용 프로그램 검사도 지원하는 것으로 보입니다.