C++을 사용하여 Linux에서 elf 바이너리에 필요한 모든 동적 라이브러리 목록을 얻으려면 어떻게해야합니까?C++에서 ELF Binary에 필요한 동적 라이브러리를 어떻게 찾을 수 있습니까?
바이너리에서 정보 (파일명?)를 추출하면 PATH
을 검색하여 실제 파일을 찾을 수 있지만 ELF에서 추출되지 않은 정보를 추출하는 것과 관련된 정보를 찾을 수 없었습니다. 이진.
생각하십니까?
C++을 사용하여 Linux에서 elf 바이너리에 필요한 모든 동적 라이브러리 목록을 얻으려면 어떻게해야합니까?C++에서 ELF Binary에 필요한 동적 라이브러리를 어떻게 찾을 수 있습니까?
바이너리에서 정보 (파일명?)를 추출하면 PATH
을 검색하여 실제 파일을 찾을 수 있지만 ELF에서 추출되지 않은 정보를 추출하는 것과 관련된 정보를 찾을 수 없었습니다. 이진.
생각하십니까?
당신은 "readelf -d"프로그램을 호출하고 출력을 구문 분석 할 수 있습니다 필요한 공유 객체의
readelf -d /usr/bin/readelf | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libz.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
목록은 실행 파일의 dynamic section 소위에 저장됩니다.
ET_EXEC
또는 ET_DYN
) 인 것을 확인 : 필요한 정보를 얻기의 거친 알고리즘은 다음과 같이 될 것이다.e_phoff/e_phnum/e_phentsize
)의 오프셋과 개수를 가져와 0이 아니며 유효한지 확인하십시오.PT_DYNAMIC
을 찾습니다. 또한 PT_LOAD
세그먼트의 가상 주소 -> 파일 오프셋 매핑을 기억하십시오.DT_NEEDED
및 DT_STRTAB
항목을 찾으십시오.DT_NEEDED
항목의 d_val
필드는 필요한 라이브러리의 SONAME 될 DT_STRTAB
의 문자열 테이블, 오프셋된다. DT_STRTAB
항목이 주소하지가 문자열 테이블의 오프셋 런타임 때문에, 다시 파일에 매핑이 경우 3 단계
감사합니다. 바이너리에서 정보에 액세스하는 것은 꽤 일반적인 문제 일 것입니다.내 기능을 구현하고 유지 관리하지 않고도이 기능을 제공 할 수있는 라이브러리, 오픈 소스 프로젝트 또는 이와 유사한 것이 있습니까? –
AFAIK 대부분의 사람들은 * 프로그램 *에서 스크립트를 필요로하지 않으므로 스크립팅에'readelf','objdump' 또는'ldd'를 사용합니다. 프로그래밍 방식의 액세스는'libelf '이지만이 특정 작업을 위해 바로 사용할 수있는 API를 제공하지는 않습니다. 동적 섹션을 수동으로 구문 분석해야합니다. –
에 저장된 정보를 사용하여 상쇄해야합니다 RHEL 기반 배포판 (패키지 관리의 기본 RPM)에서 [this script] (http://vitalyisaev2.blogspot.com/2014/02/how-to-find-out-which-of -installed-rpm.html)을 사용하여 바이너리의 의존성을 * .so 파일뿐만 아니라 파일을 제공하는 패키지까지도 해결할 수 있습니다. –
왜 물어 보시겠습니까? 간접적 인 종속성에 관심이 있습니까 (즉,'libbar.so'를 동적으로 링크하는'foo' 실행 파일 자체는 동적으로'libgee.so'를 링크하므로'ldd foo'는'libbar.so'와'libgee.so')? –
정적 분석 도구를 사용하고 있기 때문에 타겟 바이너리뿐만 아니라 의존하고있는 모든 동적 라이브러리에서 CFG를 추출해야하기 때문에 물어 봅니다. –