바이너리가 연결된 라이브러리 찾기

바이너리가 연결된 라이브러리 찾기

소프트웨어가 연결된 libs와 해당 버전을 나열하는 명령이 있다는 것을 알고 있습니다.

ld나 libtool이 있나요?

하지만 기억이 나지 않습니다. Google에서 시간을 보냈지만 유용한 정보를 찾지 못했습니다.

업데이트
ldd <binary>Linux에서는 도움이 될 것입니다. (~에서@에르넬리otool -L <binary>) MacOS X에서도 비슷한 일을 하는 것을 발견했습니다 .

답변1

ldd를 사용해 보세요바이너리 실행

예:

~$ ldd /bin/bash
    linux-gate.so.1 =>  (0x00606000)
    libncurses.so.5 => /lib/libncurses.so.5 (0x00943000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00c5d000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x003e9000)
    /lib/ld-linux.so.2 (0x00a41000)

답변2

직접 필요한 것을 찾으려면 다음을 수행하십시오.

readelf -d APP | grep NEEDED

ldd다른 곳에서 언급했듯이 런타임에 필요한 모든 직접 및 간접 라이브러리가 모두 표시됩니다. dlopen()을 사용하여 동적으로 항목을 열 수 있으므로 이는 완전한 목록이 아닐 수 있지만 이는 99%의 시간 동안 작동합니다.

ld 및 libtool은 컴파일/링크 시 사용됩니다. 일단 앱이 있으면 유용하지 않습니다.

편집하다나중에 OSX에 관해 질문하신 답변을 보면 알 수 있지만 Linux 도구에 대한 답변에 추가하고 싶습니다.

제가 꽤 오래 전에 언급하는 것을 잊은 한 가지가 있습니다. 버전에 대해 질문하셨습니다. "어떤 버전"이라는 질문에도 답하지 ldd않습니다 . readelf그들은 당신이 찾고 있는 라이브러리의 파일 이름을 알려줄 것이며 명명 규칙에 일부 버전 정보가 있을 수 있지만 이를 강제하는 것은 없습니다. 기호의 버전이 관리될 수 있으며 nm이를 보려면 훨씬 더 낮은 수준까지 가야 합니다 .

답변3

또 다른 방법은 objdump를 사용하는 것입니다.

objdump -x "바이너리" | grep 필요

이는 이 바이너리에만 필요한 모든 종속성을 보여줍니다. 굉장히 유용하다.

답변4

그만큼다른 답변중요한 점을 놓치다:

공유 라이브러리는 다음 중 하나일 수 있습니다.곧장연결되어 있거나간접적으로다른 lib를 통해 연결되었습니다.

오직직접 연결됨:

objdump --private-headers "${bin}" | grep '필요' | 잘라내기 --delimiter=' ' --fields=18-

을 위한모두:

ldd "${bin}" | 잘라내기 --fields=2 | 잘라내기 --delimiter=' ' --fields=1 | 개정 | 잘라내기 --delimiter='/' --fields=1 | 개정 | 정렬 --고유 --버전 정렬

관련 정보