
답변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 | 개정 | 정렬 --고유 --버전 정렬