실행할 때 동적 라이브러리 실행 파일로드를 찾는 방법은 무엇입니까?


답변:


61

당신은 ldd명령으로 이것을 할 수 있습니다 :

NAME
       ldd - print shared library dependencies

SYNOPSIS
       ldd [OPTION]...  FILE...

DESCRIPTION
       ldd  prints  the  shared  libraries  required by each program or shared
       library specified on the command line.
....

예:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff87ffe000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007ff0510c1000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff050eb9000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007ff050cb0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff0508f0000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff0506ec000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ff0512f7000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff0504ce000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007ff0502c9000)

1
macOS와 동등한 것이 무엇인지에 대한 아이디어가 있습니까? 아니 lld다윈에, 그것은 나타납니다,도 나는 사제를 통해 찾을 수 있습니다.
mz2

7
macOS :otool -L <path-to-binary>
Richard Viney

이 바이너리를 실행할 수 있습니다. 따라서 이진 파일을 신뢰할 수없는 경우을 사용하지 않는 것이 좋습니다 ldd. 매뉴얼 페이지를 참조 하십시오 .
폴 루니

45

readelf -d $executable | grep 'NEEDED'

실행 파일을 실행할 수없는 경우 (예 : 크로스 컴파일 된 파일이거나 신뢰할 수없는 경우) 사용할 수 있습니다.

일반적인 경우, ldd는 LD_TRACE_LOADED_OBJECTS 환경 변수가 1로 설정된 표준 동적 링커 (ld.so (8) 참조)를 호출하여 링커가 라이브러리 종속성을 표시합니다. 그러나 일부 상황에서 일부 버전의 ldd는 프로그램을 직접 실행하여 종속성 정보를 얻으려고 시도 할 수 있습니다. 따라서 신뢰할 수없는 실행 파일에 ldd를 사용하면 안됩니다. 임의 코드가 실행될 수 있습니다.

예:

readelf -d /bin/ls | grep 'NEEDED'

샘플 ouptut :

 0x0000000000000001 (NEEDED)             Shared library: [libselinux.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libacl.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

라이브러리는 다른 라이브러리에 종속 될 수 있으므로 이제 종속성을 찾아야합니다.

자주 작동하는 순진한 접근 방식은 다음과 같습니다.

$ locate libselinux.so.1
/lib/i386-linux-gnu/libselinux.so.1
/lib/x86_64-linux-gnu/libselinux.so.1
/mnt/debootstrap/lib/x86_64-linux-gnu/libselinux.so.1

그러나 더 정확한 방법은 ldd검색 경로 / 캐시 를 이해하는 것 입니다. 나는 ldconfig갈 길이 라고 생각 합니다.

하나를 선택하고 반복하십시오.

readelf -d /lib/x86_64-linux-gnu/libselinux.so.1 | grep 'NEEDED'

샘플 출력 :

0x0000000000000001 (NEEDED)             Shared library: [libpcre.so.3]
0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]

등등.

또한보십시오:

/proc/<pid>/maps 프로세스 실행

Basile언급 한이 기능은 실행 파일을 실행하여 현재 사용중인 모든 라이브러리를 찾는 데 유용합니다. 예 :

sudo awk '/\.so/{print $6}' /proc/1/maps | sort -u

init(PID 1) 의 현재로드 된 모든 동적 종속성을 표시합니다 .

/lib/x86_64-linux-gnu/ld-2.23.so
/lib/x86_64-linux-gnu/libapparmor.so.1.4.0
/lib/x86_64-linux-gnu/libaudit.so.1.0.0
/lib/x86_64-linux-gnu/libblkid.so.1.1.0
/lib/x86_64-linux-gnu/libc-2.23.so
/lib/x86_64-linux-gnu/libcap.so.2.24
/lib/x86_64-linux-gnu/libdl-2.23.so
/lib/x86_64-linux-gnu/libkmod.so.2.3.0
/lib/x86_64-linux-gnu/libmount.so.1.1.0
/lib/x86_64-linux-gnu/libpam.so.0.83.1
/lib/x86_64-linux-gnu/libpcre.so.3.13.2
/lib/x86_64-linux-gnu/libpthread-2.23.so
/lib/x86_64-linux-gnu/librt-2.23.so
/lib/x86_64-linux-gnu/libseccomp.so.2.2.3
/lib/x86_64-linux-gnu/libselinux.so.1
/lib/x86_64-linux-gnu/libuuid.so.1.3.0

이 방법은 또한 Ubuntu 18.04에서 해킹 된 최소 설정으로dlopen 테스트 한 라이브러리를 보여줍니다 .sleep(1000)

참고 : Linux에서 현재로드 된 공유 객체를 보는 방법? | 슈퍼 유저


1
readelf 방법에 대한 좋은 부분은 크로스 바이너리에서 작동한다는 것입니다 (예 : amd64의 armhf)
Ghostrider

13

ldd와 lsof는 직접 또는 주어진 순간에 로드 된 라이브러리를 보여줍니다 . 이를 통해로드 된 dlopen(또는에 의해 삭제 된dlclose ) 라이브러리는 설명하지 않습니다 . strace예를 들어을 사용하여 더 나은 그림을 얻을 수 있습니다 .

strace -e trace=open myprogram

( dlopen궁극적으로 전화하기 때문에 open-물론 64 비트 열기에 다른 이름을 사용하는 시스템이있을 수 있습니다 ...).

예:

strace -e trace=open date

나에게 이것을 보여줍니다 :

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/etc/localtime", O_RDONLY)        = 3
Wed Apr 12 04:56:32 EDT 2017

".so"이름을 grep하여 공유 객체 만 볼 수 있습니다.


3
개선 :strace -e trace=open,openat myprogram
Cyker

좋은 방법입니다. /proc/<pid>/maps또한 dlopen다음과 같이 libs btw : unix.stackexchange.com/questions/120015 / ...를 보여줍니다 . ltrace -S출력은 syscall과 라이브러리 호출을 모두 표시하므로 훨씬 더 시원합니다 dlopen. unix.stackexchange.com/questions/226524/…
Ciro Santilli

7

lsof 는 또한 하나의 특정 프로세스에 사용중인 라이브러리를 보여줄 수 있습니다.

$ pidof nginx
6920 6919

$ lsof -p 6919|grep mem
nginx   6919 root  mem    REG               0,64    65960     43 /lib64/libnss_files-2.12.so
nginx   6919 root  mem    REG               0,64    19536     36 /lib64/libdl-2.12.so
nginx   6919 root  mem    REG               0,64    10312   1875 /lib64/libfreebl3.so
nginx   6919 root  mem    REG               0,64  1923352     38 /lib64/libc-2.12.so
nginx   6919 root  mem    REG               0,64    88600   1034 /lib64/libz.so.1.2.3
nginx   6919 root  mem    REG               0,64  1967392   1927 /usr/lib64/libcrypto.so.1.0.1e
nginx   6919 root  mem    REG               0,64   183080   1898 /lib64/libpcre.so.0.0.1
nginx   6919 root  mem    REG               0,64    40400   1217 /lib64/libcrypt-2.12.so
nginx   6919 root  mem    REG               0,64   142688     77 /lib64/libpthread-2.12.so
nginx   6919 root  mem    REG               0,64   154664     31 /lib64/ld-2.12.so

2

A의 공정 PID 1234, 당신은 또한 읽을 수 /proc/1234/maps(텍스트) 의사 파일 (읽기 proc 디렉토리 (5) ...) 또는 사용 의 pmap을 (1)

이것은 해당 프로세스 의 가상 주소 공간 을 제공 하므로 메모리로 매핑되는 파일 (공유 라이브러리, dlopen (3) -ed one 포함)도 포함됩니다

(물론, 주어진 프로그램을 실행하는 프로세스를 찾으려면 ps aux또는 pgrep (1) 을 사용하십시오)


1

대량 쿼리의 경우 :

  1. 작은 스크립트를 작성하고 ( useslib) PATH에 넣습니다 (또는 아래 명령에서 전체 경로를 지정하십시오).

    #! /bin/bash
    ldd $1 | grep -q $2
    exit $?
    
  2. find예를 들어 명령에 사용하십시오 .

    find /usr/bin/ -executable -type f -exec useslib {} libgtk-x11-2.0 \; -print
    

(libgtk-x11-2.0은 gtk2 lib 인 것 같습니다)


0

사용 가능합니다 pmap.

예를 들어, 프로세스를 시작하십시오. $ watch date

pid 받기 : $ ps -ef | grep watch

메모리 맵 표시 : $ pmap <pid>

전체 경로로 표시 : $ pmap <pid> -p

$ pmap 72770
72770:   watch date
00005613a32c9000     20K r-x-- watch
00005613a34cd000      4K r---- watch
00005613a34ce000      4K rw--- watch
00005613a4f6a000    264K rw---   [ anon ]
00007f2f3a7d5000 204616K r---- locale-archive
00007f2f46fa7000   1748K r-x-- libc-2.27.so
00007f2f4715c000   2048K ----- libc-2.27.so
00007f2f4735c000     16K r---- libc-2.27.so
00007f2f47360000      8K rw--- libc-2.27.so
00007f2f47362000     16K rw---   [ anon ]
00007f2f47366000     12K r-x-- libdl-2.27.so
00007f2f47369000   2044K ----- libdl-2.27.so
00007f2f47568000      4K r---- libdl-2.27.so
00007f2f47569000      4K rw--- libdl-2.27.so
00007f2f4756a000    160K r-x-- libtinfo.so.6.1
00007f2f47592000   2048K ----- libtinfo.so.6.1
00007f2f47792000     16K r---- libtinfo.so.6.1
00007f2f47796000      4K rw--- libtinfo.so.6.1
00007f2f47797000    232K r-x-- libncursesw.so.6.1
00007f2f477d1000   2048K ----- libncursesw.so.6.1
00007f2f479d1000      4K r---- libncursesw.so.6.1
00007f2f479d2000      4K rw--- libncursesw.so.6.1
00007f2f479d3000    148K r-x-- ld-2.27.so
00007f2f47bdb000     20K rw---   [ anon ]
00007f2f47bf1000     28K r--s- gconv-modules.cache
00007f2f47bf8000      4K r---- ld-2.27.so
00007f2f47bf9000      4K rw--- ld-2.27.so
00007f2f47bfa000      4K rw---   [ anon ]
00007ffd39404000    136K rw---   [ stack ]
00007ffd3959b000     12K r----   [ anon ]
00007ffd3959e000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total           215692K
$ pmap 72770 -p
72770:   watch date
00005613a32c9000     20K r-x-- /usr/bin/watch
00005613a34cd000      4K r---- /usr/bin/watch
00005613a34ce000      4K rw--- /usr/bin/watch
00005613a4f6a000    264K rw---   [ anon ]
00007f2f3a7d5000 204616K r---- /usr/lib/locale/locale-archive
00007f2f46fa7000   1748K r-x-- /usr/lib64/libc-2.27.so
00007f2f4715c000   2048K ----- /usr/lib64/libc-2.27.so
00007f2f4735c000     16K r---- /usr/lib64/libc-2.27.so
00007f2f47360000      8K rw--- /usr/lib64/libc-2.27.so
00007f2f47362000     16K rw---   [ anon ]
00007f2f47366000     12K r-x-- /usr/lib64/libdl-2.27.so
00007f2f47369000   2044K ----- /usr/lib64/libdl-2.27.so
00007f2f47568000      4K r---- /usr/lib64/libdl-2.27.so
00007f2f47569000      4K rw--- /usr/lib64/libdl-2.27.so
00007f2f4756a000    160K r-x-- /usr/lib64/libtinfo.so.6.1
00007f2f47592000   2048K ----- /usr/lib64/libtinfo.so.6.1
00007f2f47792000     16K r---- /usr/lib64/libtinfo.so.6.1
00007f2f47796000      4K rw--- /usr/lib64/libtinfo.so.6.1
00007f2f47797000    232K r-x-- /usr/lib64/libncursesw.so.6.1
00007f2f477d1000   2048K ----- /usr/lib64/libncursesw.so.6.1
00007f2f479d1000      4K r---- /usr/lib64/libncursesw.so.6.1
00007f2f479d2000      4K rw--- /usr/lib64/libncursesw.so.6.1
00007f2f479d3000    148K r-x-- /usr/lib64/ld-2.27.so
00007f2f47bdb000     20K rw---   [ anon ]
00007f2f47bf1000     28K r--s- /usr/lib64/gconv/gconv-modules.cache
00007f2f47bf8000      4K r---- /usr/lib64/ld-2.27.so
00007f2f47bf9000      4K rw--- /usr/lib64/ld-2.27.so
00007f2f47bfa000      4K rw---   [ anon ]
00007ffd39404000    136K rw---   [ stack ]
00007ffd3959b000     12K r----   [ anon ]
00007ffd3959e000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total           215692K
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.