[linux] Linux에서 실행 파일이 사용하는 모든 공유 라이브러리를 표시하는 방법은 무엇입니까?

내 시스템의 실행 파일이 어떤 라이브러리를 사용하는지 알고 싶습니다. 더 구체적으로 말하면, 가장 많이 사용되는 라이브러리와 라이브러리를 사용하는 바이너리와 함께 순위를 매기고 싶습니다. 어떻게해야합니까?



답변

  1. ldd각 실행 파일에 대한 공유 라이브러리를 나열하는 데 사용하십시오 .
  2. 출력 정리
  3. 정렬, 계산 횟수, 정렬

“/ bin”디렉토리에서 모든 실행 파일에 대한 답변을 찾으려면 다음을 수행하십시오.

find /bin -type f -perm /a+x -exec ldd {} \; \
| grep so \
| sed -e '/^[^\t]/ d' \
| sed -e 's/\t//' \
| sed -e 's/.*=..//' \
| sed -e 's/ (0.*)//' \
| sort \
| uniq -c \
| sort -n

모든 디렉토리를 검색하려면 위의 “/ bin”을 “/”로 변경하십시오.

/ bin 디렉토리에 대한 출력은 다음과 같습니다.

  1 /lib64/libexpat.so.0
  1 /lib64/libgcc_s.so.1
  1 /lib64/libnsl.so.1
  1 /lib64/libpcre.so.0
  1 /lib64/libproc-3.2.7.so
  1 /usr/lib64/libbeecrypt.so.6
  1 /usr/lib64/libbz2.so.1
  1 /usr/lib64/libelf.so.1
  1 /usr/lib64/libpopt.so.0
  1 /usr/lib64/librpm-4.4.so
  1 /usr/lib64/librpmdb-4.4.so
  1 /usr/lib64/librpmio-4.4.so
  1 /usr/lib64/libsqlite3.so.0
  1 /usr/lib64/libstdc++.so.6
  1 /usr/lib64/libz.so.1
  2 /lib64/libasound.so.2
  2 /lib64/libblkid.so.1
  2 /lib64/libdevmapper.so.1.02
  2 /lib64/libpam_misc.so.0
  2 /lib64/libpam.so.0
  2 /lib64/libuuid.so.1
  3 /lib64/libaudit.so.0
  3 /lib64/libcrypt.so.1
  3 /lib64/libdbus-1.so.3
  4 /lib64/libresolv.so.2
  4 /lib64/libtermcap.so.2
  5 /lib64/libacl.so.1
  5 /lib64/libattr.so.1
  5 /lib64/libcap.so.1
  6 /lib64/librt.so.1
  7 /lib64/libm.so.6
  9 /lib64/libpthread.so.0
 13 /lib64/libselinux.so.1
 13 /lib64/libsepol.so.1
 22 /lib64/libdl.so.2
 83 /lib64/ld-linux-x86-64.so.2
 83 /lib64/libc.so.6

편집- “grep -P”제거


답변

ARM 툴체인에 ldd가 없었으므로 objdump를 사용했습니다.

$ (CROSS_COMPILE) objdump -p

예를 들어 :

objdump -p /usr/bin/python:

Dynamic Section:
  NEEDED               libpthread.so.0
  NEEDED               libdl.so.2
  NEEDED               libutil.so.1
  NEEDED               libssl.so.1.0.0
  NEEDED               libcrypto.so.1.0.0
  NEEDED               libz.so.1
  NEEDED               libm.so.6
  NEEDED               libc.so.6
  INIT                 0x0000000000416a98
  FINI                 0x000000000053c058
  GNU_HASH             0x0000000000400298
  STRTAB               0x000000000040c858
  SYMTAB               0x0000000000402aa8
  STRSZ                0x0000000000006cdb
  SYMENT               0x0000000000000018
  DEBUG                0x0000000000000000
  PLTGOT               0x0000000000832fe8
  PLTRELSZ             0x0000000000002688
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000414410
  RELA                 0x0000000000414398
  RELASZ               0x0000000000000078
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000414258
  VERNEEDNUM           0x0000000000000008
  VERSYM               0x0000000000413534


답변

리눅스에서는 다음을 사용합니다.

lsof -P -T -p Application_PID

ldd실행 파일이 기본아닌 로더를 사용할 때보 다 더 효과적입니다.


답변

바이너리가 사용하는 라이브러리를 배우려면 ldd를 사용하십시오.

ldd path/to/the/tool

시스템 전체의 고장에 도달하려면 작은 쉘 스크립트를 작성해야합니다.


답변

프로그램 실행 파일의 공유 라이브러리 종속성 확인

특정 실행 파일이 의존하는 라이브러리를 찾으려면 ldd 명령을 사용할 수 있습니다. 이 명령은 동적 링커를 호출하여 실행 파일의 라이브러리 종속성을 찾습니다.

> $ ldd / path / to / 프로그램

일부 버전의 ldd는 실행 파일을 직접 호출하여 라이브러리 종속성을 식별 할 수 있으므로 보안 위험이있을 수 있으므로 신뢰할 수없는 타사 실행 파일과 함께 ldd를 실행하지 않는 것이 좋습니다.

대신 알 수없는 응용 프로그램 바이너리의 라이브러리 종속성을 표시하는보다 안전한 방법은 다음 명령을 사용하는 것입니다.

$ objdump -p / path / to / 프로그램 | grep 필요

더 많은 정보를 위해서


답변

readelf -d 재귀

redelf -dhttps://stackoverflow.com/a/15520982/895245objdump -p 에서 언급 된 것과 유사한 출력을 생성합니다 .

그러나 동적 라이브러리는 다른 동적 라이브러리에 의존 할 수 있으므로 반복해야합니다.

예:

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

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

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 프로세스 실행

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

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)

참조 : /superuser/310199/see-currently-loaded-shared-objects-in-linux/1243089


답변

기본적으로 OS X에이 아니요 ldd, objdump또는 lsof. 대안으로 다음을 시도하십시오 otool -L.

$ otool -L `which openssl`
/usr/bin/openssl:
    /usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
    /usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

이 예제에서를 사용 which openssl하면 지정된 실행 파일 및 현재 사용자 환경에 대한 완전한 경로를 채 웁니다.