2009-07-14 6 views

답변

35

ldd <exe filename> 동적 라이브러리

nm <exe filename>이 파일의 기호를 보여줍니다 연결을 보여줍니다.

정적 라이브러리에서 가져온 기호를 확인하려면 해당 라이브러리에 대해 기호 (함수 등) 목록을 얻으려면 nm을 실행하고 nm <exe filename>의 기호 목록과 비교해야합니다.

목록을 comm 명령과 비교합니다. 자세한 내용은 man comm을 참조하십시오.

이것은 게시판 here에서 가져 왔습니다.

+2

@Goz와 anon이 지적했듯이, 이것은 바이너리가 제거되지 않았거나 디버깅 정보가있는 경우에만 작동합니다. 정적 라이브러리가 응용 프로그램에 링크 된 후 이름은 필요하지 않으며 사용되지도 않습니다. 호출은 모두 주소로되어 있습니다. –

+0

이 질문에 대답하지 않습니다. 라이브러리를 모르는 경우 "해당 라이브러리에 대해 nm 실행"이 가능하지 않습니다. 연결에 암묵적으로 사용되는 라이브러리가 있습니다. – kavadias

+0

알 수없는 이진 파일 인 경우 어떤 라이브러리가 있는지 알 수 없습니다. 따라서 "해당 라이브러리에 대한 nm 실행"은 자멸하고 있습니다. – goldenmean

10

아니요, 링크 과정 중에 라이브러리의 이름이 삭제됩니다. 그러나 실행 파일에 디버그 정보가 포함되어 있으면 (즉, -g 플래그로 컴파일 된 경우) 정보를 얻을 수 있습니다.

+0

RAW ASM을 식별 할 수있는 방법이 없습니까? 아니면 컴파일러 최적화 및 플래그도 영향을 미칩니 까? – MrMesees

5

주어진 컴파일러가 이진 내부에 일종의 메타 데이터를 저장하지 않는다면, 아니오. 정적 라이브러리는 바이너리로 직접 컴파일되는 코드입니다.

6

소스 코드가 있고이 코드를 모두 수행하지 않으려는 경우 컴파일 할 때 맵 파일을 생성하여 어떤 정적 라이브러리가 링크되어 있는지 알 수 있습니다.

예를 들어 g++ -Xlinker -Map=a.map main.c과 같이 링크 된 정적 라이브러리 정보가 있는지 확인하십시오.

2

일부 ELF 실행 파일 내에 정적 라이브러리 목록을 가져 오는 방법이 없습니다.

링커 때문에 정적 라이브러리는 "게으른"멤버 집합으로 사용되기 때문에. 따라서 ELF 실행 파일은 링크하는 데 필요한 멤버 만 포함합니다. 따라서 foo2.olibfoo.a 인 경우 객체 파일 foo2.o이 실행 파일에 링크 된 것처럼 연결됩니다 (foo2에 정의 된 기호가 필요합니다. 즉, 어딘가에서 참조). 몇 가지 힌트를 줄 수 nm, 또는 objdump, 또는 readelf, 또는 ELF 실행에 strings를 사용 물론

, 일에 대해 당신이 문자를 볼 수 있기 때문에, 그 안에 있습니다 (정적 도서관에서 오는 포함) 오브젝트 파일 이러한 정적 라이브러리 (또는 그 내부에서 사용되는 리터럴 문자열)에 정의되어 있습니다.

+1

어떤 종류의 힌트를 원하십니까? 예제를 줄 수 있습니까? 제가이 힌트를 더 많이 찾을 수있는 곳으로 안내해 주시겠습니까? – stackoverflowwww

+1

예를 들어 readelf를 사용하면 이진 파일에서 사용되는 함수, 개체 및 기호가 표시됩니다. 이것들은 힌트로서 사용 된 라이브러리를 찾을 수 있습니다. 예를 들어 Curl_http 함수를 볼 수 있고 libcurl이 바이너리에서 가장 많이 사용되며 동적으로 링크되지 않은 경우 정적으로 링크되어야합니다. – ohgodnotanotherone