는 방법을 보여 모든 공유 라이브러리에 의해 사용된 실행파일 리눅스에서는?

StackOverflow https://stackoverflow.com/questions/50159

  •  09-06-2019
  •  | 
  •  

문제

나는 알고 싶어하는 라이브러리에 의해 사용되는 실행 파일에 시스템입니다.조금 더 구체적으로 말씀드리고 싶은 순위는 라이브러리를 사용 가장,바이너리와 함께 하는 그들을 사용합니다.이렇게 하려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

  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"

다른 팁

지 않았 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

무엇을 배우고 라이브러리 바이너리 사용하는 사용 ldd

ldd path/to/the/tool

당신을 써야 할텐데 작은 쉘 스크립트를 얻을 당신의 시스템을 분석합니다.

리눅스에서 사용:

lsof -P -T -p Application_PID

이 보다 더 나은 작품 ldd 할 때 사용하여 실행 non 기본 loader

체크인 공유 라이브러리 의존성 프로그램의 실행

무엇을 찾 라이브러리는 실행 파일에 따라 사용할 수 있습니다 ldd 명령입니다.이 명령을 호출하는 동적 링커를 찾 라이브러리 의존성의 실행 파일을 실행합니다.

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

참고하는 그것을 실행하는 것은 권장되지 않습 ldd 으로 어떤 신뢰할 수 없는 제삼자 실행하기 때문에 일부 버전의 ldd 직접 수 있습 호출에 실행파일을 식별하는 라이브러리 의존성할 수 있는 보안 위험이 있습니다.

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

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

더 많은 정보를 원

readelf -d 재귀

redelf -d 과 비슷한 출력을 생성하는 objdump -p 는 언급되었다: https://stackoverflow.com/a/15520982/895245

하지만 조심하는 동적 라이브러리에 따라 달라질 수 있습 다른 동적 라이브러리로,당신은 recurse.

예제:

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 실행하기 위한 프로세스

이것을 찾기 위해 유용한 모든 라이브러리는 현재에 의해 사용되는 실행 파일을 실행.E.g.:

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

이 방법은 또한 보 라이브러리는 열립 dlopen, 테스트 이 최소한의 설정 해킹과 sleep(1000) 우분투에서 18.04.

도 참조하십시오: https://superuser.com/questions/310199/see-currently-loaded-shared-objects-in-linux/1243089

에서 유닉스 시스템,가진(실행)이름은 시험입니다.그런 다음 우리를 사용하여 다음과 같은 명령을 사용하는 라이브러리에서 테스트

ldd test

OS X 에서 기본적으로 없 ldd, objdumplsof.에 대한 대안으로,시험 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 을 채우에는 완전한 경로 주어진 실행 및 현재 사용자 환경이다.

ldd 당신이 얻을 수 있는 라이브러리는 도구로 사용.순위를 사용의 라이브러리 세트를 위한 도구 같은 것을 사용할 수 있습니다면 다음 명령입니다.

ldd /bin/* /usr/bin/* ... | sed -e '/^[^\t]/ d; s/^\t\(.* => \)\?\([^ ]*\) (.*/\2/g' | sort | uniq -c

(기 sed 스트립 하지 않는 모든 줄을 시작으로 탭을 필터만 실제 라이브러리입니다.가 sort | uniq -c 당신이 얻는 각각의 라이브러리와 횟수를 나타내는 횟수가 발생했습니다.)

에 추가할 수 있습니다 sort -g 끝에 얻은 라이브러리기 위해서는 사용할 수 있습니다.

참고로 당신은 아마 라인은 두 비 라이브러리인으로 위의 명령입니다.중 하나는 정적 파일("지 않는 동 실행")그리고 한없이 모든 라이브러리입니다.후자는 결과 linux-gate.so.1 하지 않은 라이브러리에서 당신의 파일 시스템만"제공"의 커널이다.

ubuntu 인쇄 패키지에 관련된 실행

ldd executable_name|awk'{print$3}'|xargs dpkg-S|awk-F":"'{print$1}'

하나 더 많은 옵션을 선택할 수 있습니다 그냥 읽어보 파일의 위치

/proc/<pid>/maps

예를 들어 프로세스 id2601 다음 명령입니다

cat /proc/2601/maps

과이

7fb37a8f2000-7fb37a8f4000 r-xp 00000000 08:06 4065647                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37a8f4000-7fb37aaf3000 ---p 00002000 08:06 4065647                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf3000-7fb37aaf4000 r--p 00001000 08:06 4065647                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf4000-7fb37aaf5000 rw-p 00002000 08:06 4065647                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf5000-7fb37aafe000 r-xp 00000000 08:06 4065646                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37aafe000-7fb37acfd000 ---p 00009000 08:06 4065646                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acfd000-7fb37acfe000 r--p 00008000 08:06 4065646                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acfe000-7fb37acff000 rw-p 00009000 08:06 4065646                    /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acff000-7fb37ad1d000 r-xp 00000000 08:06 3416761                    /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37ad1d000-7fb37af1d000 ---p 0001e000 08:06 3416761                    /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1d000-7fb37af1e000 r--p 0001e000 08:06 3416761                    /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1e000-7fb37af1f000 rw-p 0001f000 08:06 3416761                    /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1f000-7fb37af21000 r-xp 00000000 08:06 4065186                    /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37af21000-7fb37b121000 ---p 00002000 08:06 4065186                    /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37b121000-7fb37b122000 r--p 00002000 08:06 4065186                    /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37b122000-7fb37b123000 rw-p 00003000 08:06 4065186                    /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so

이 게시물에 매우 도움이하는 데 필요한 조사의 종속성 제 3 자로부터 제공된 라이브러리(32 대 64 비트를 실행한 경로(s)).

내가 함께 Q&D recursing bash 기반으로 하는 스크립트'readelf-d'제안에 RHEL6 배포판.

그것은 매우 기본적인 것입니다 테스트는 모든 종속성의 모든 시간이다 경우에도 수하기 전에 테스트되었습니다(i.e 는 매우 자세한).출력이 매우 기본이 너무입니다.

#! /bin/bash

recurse ()
# Param 1 is the nuumber of spaces that the output will be prepended with
# Param 2 full path to library
{
#Use 'readelf -d' to find dependencies
dependencies=$(readelf -d ${2} | grep NEEDED | awk '{ print $5 }' | tr -d '[]')
for d in $dependencies; do
   echo "${1}${d}"
   nm=${d##*/}
   #libstdc++ hack for the '+'-s
   nm1=${nm//"+"/"\+"}
   # /lib /lib64 /usr/lib and /usr/lib are searched
   children=$(locate ${d} | grep -E "(^/(lib|lib64|usr/lib|usr/lib64)/${nm1})")
   rc=$?
   #at least locate... didn't fail
   if [ ${rc} == "0" ] ; then
      #we have at least one dependency
      if [ ${#children[@]} -gt 0 ]; then
         #check the dependeny's dependencies
         for c in $children; do
          recurse "  ${1}" ${c}
         done
      else
         echo "${1}no children found"
      fi
   else
      echo "${1}locate failed for ${d}"
   fi
done
}
# Q&D -- recurse needs 2 params could/should be supplied from cmdline
recurse "" !!full path to library you want to investigate!!

출력을 리디렉션은 파일과 grep 위해'발견'또는'하지 못했습니다.'

을 사용하고 수정하에서 자신의 위험 물론,습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top