2014-03-24 5 views
5

C++을 사용하여 Linux에서 elf 바이너리에 필요한 모든 동적 라이브러리 목록을 얻으려면 어떻게해야합니까?C++에서 ELF Binary에 필요한 동적 라이브러리를 어떻게 찾을 수 있습니까?

바이너리에서 정보 (파일명?)를 추출하면 PATH을 검색하여 실제 파일을 찾을 수 있지만 ELF에서 추출되지 않은 정보를 추출하는 것과 관련된 정보를 찾을 수 없었습니다. 이진.

생각하십니까?

+0

에 저장된 정보를 사용하여 상쇄해야합니다 RHEL 기반 배포판 (패키지 관리의 기본 RPM)에서 [this script] (http://vitalyisaev2.blogspot.com/2014/02/how-to-find-out-which-of -installed-rpm.html)을 사용하여 바이너리의 의존성을 * .so 파일뿐만 아니라 파일을 제공하는 패키지까지도 해결할 수 있습니다. –

+1

왜 물어 보시겠습니까? 간접적 인 종속성에 관심이 있습니까 (즉,'libbar.so'를 동적으로 링크하는'foo' 실행 파일 자체는 동적으로'libgee.so'를 링크하므로'ldd foo'는'libbar.so'와'libgee.so')? –

+0

정적 분석 도구를 사용하고 있기 때문에 타겟 바이너리뿐만 아니라 의존하고있는 모든 동적 라이브러리에서 CFG를 추출해야하기 때문에 물어 봅니다. –

답변

5

당신은 "readelf -d"프로그램을 호출하고 출력을 구문 분석 할 수 있습니다 필요한 공유 객체의

readelf -d /usr/bin/readelf | grep NEEDED 
0x0000000000000001 (NEEDED)    Shared library: [libz.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
4

목록은 실행 파일의 dynamic section 소위에 저장됩니다.

  1. 구문 분석 the ELF header이 파일은 동적 실행 (ET_EXEC 또는 ET_DYN) 인 것을 확인 : 필요한 정보를 얻기의 거친 알고리즘은 다음과 같이 될 것이다.
  2. 프로그램 헤더 (e_phoff/e_phnum/e_phentsize)의 오프셋과 개수를 가져와 0이 아니며 유효한지 확인하십시오.
  3. program headers을 구문 분석하여 PT_DYNAMIC을 찾습니다. 또한 PT_LOAD 세그먼트의 가상 주소 -> 파일 오프셋 매핑을 기억하십시오.
  4. 발견되면 dynamic section을 구문 분석하십시오. DT_NEEDEDDT_STRTAB 항목을 찾으십시오.

DT_NEEDED 항목의 d_val 필드는 필요한 라이브러리의 SONAME 될 DT_STRTAB의 문자열 테이블, 오프셋된다. DT_STRTAB 항목이 주소하지가 문자열 테이블의 오프셋 런타임 때문에, 다시 파일에 매핑이 경우 3 단계

+0

감사합니다. 바이너리에서 정보에 액세스하는 것은 꽤 일반적인 문제 일 것입니다.내 기능을 구현하고 유지 관리하지 않고도이 기능을 제공 할 수있는 라이브러리, 오픈 소스 프로젝트 또는 이와 유사한 것이 있습니까? –

+2

AFAIK 대부분의 사람들은 * 프로그램 *에서 스크립트를 필요로하지 않으므로 스크립팅에'readelf','objdump' 또는'ldd'를 사용합니다. 프로그래밍 방식의 액세스는'libelf '이지만이 특정 작업을 위해 바로 사용할 수있는 API를 제공하지는 않습니다. 동적 섹션을 수동으로 구문 분석해야합니다. –