ldd
Linux에서는 특정 바이너리가 의존하는 모든 공유 라이브러리 목록을 제공합니다. 이는 일반적으로 바이너리를 생성하는 데 사용되는 링커 명령줄에 나열된 라이브러리보다 훨씬 더 광범위합니다. 여기에는 이러한 라이브러리의 종속성이 전부는 아니더라도 대부분이 포함됩니다.
명시적으로 링크된 라이브러리 목록(즉, 직접 종속성)만 결정하는 것이 가능합니까? 그렇다면 어떻게 합니까?
답변1
readelf -d
덤프 바이너리의 "동적" 부분을 사용할 수 있습니다 . 여기에는 필수 라이브러리가 포함됩니다.
예를 들어 다음 ldd
과 readelf
비교해보세요 /bin/ls
.
$ ldd /bin/ls
linux-vdso.so.1 => (0x00007fff190da000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f082f94e000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f082f749000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007f082f540000)
libc.so.6 => /lib64/libc.so.6 (0x00007f082f172000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f082ef10000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f082ed0c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f082fb75000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f082eb07000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f082e8eb000)
$ readelf -d /bin/ls | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libselinux.so.1]
0x0000000000000001 (NEEDED) Shared library: [libcap.so.2]
0x0000000000000001 (NEEDED) Shared library: [libacl.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
.so
파일로 도 이 작업을 수행할 수 있습니다 .
$ readelf -d /lib64/libpcre.so.1 | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
답변2
직접 종속성을 나열하려는 경우재귀적으로,lddtree
pax-utils에서 사용:
$ lddtree /bin/file
/bin/file (interpreter => /lib64/ld-linux-x86-64.so.2)
libmagic.so.1 => /usr/lib/libmagic.so.1
libzstd.so.1 => /usr/lib/libzstd.so.1
liblzma.so.5 => /usr/lib/liblzma.so.5
libbz2.so.1.0 => /usr/lib/libbz2.so.1.0
libz.so.1 => /usr/lib/libz.so.1
libseccomp.so.2 => /usr/lib/libseccomp.so.2
libc.so.6 => /usr/lib/libc.so.6
(이것은 내부적으로 python-pyelftools를 사용합니다.)