ldd <name>
바이너리에서 명령을 실행하는지, /bin
아니면 /sbin
어떤 라이브러리를 사용하는지 알 수 있습니다. 어떻게 반대로 할 수 있나요? 즉, 파일에 대해 명령을 실행 /lib
하고 어떤 바이너리가 이를 사용하고 있는지 확인하시겠습니까?
답변1
이것은 정확히 귀하가 요청한 것이 아니지만, 이를 통해 특정 라이브러리를 사용하는 바이너리 목록을 찾을 수 있습니다.binstats
시스템의 바이너리 및 라이브러리에 대한 보고서를 생성하여 주로 라이브러리가 누락된 바이너리와 더 이상 사용되지 않는 라이브러리를 확인합니다.
디버그 모드에서는 임시 파일을 남깁니다. 그 중 하나는 -b
경로(또는 이 옵션으로 지정된 폴더)의 모든 바이너리와 사용하는 모든 라이브러리를 나열합니다. 이 파일이 있으면 관심 있는 라이브러리를 검색하여 해당 라이브러리의 기능을 확인할 수 있습니다.
그래서 기본적으로:
binstats -d
awk '/^\// { binary=$1 }; /libtinfo.so.5/ { print binary }' etempb.00
모든 용도를 나열합니다 libtinfo.so.5
. (파일 이름은 가 아닐 수도 있지만 etempb.00
이해하시기 바랍니다...)
이렇게 하면 경로가 아닌 디렉터리에 저장된 바이너리가 손실됩니다.예를 들어in /usr/libexec
또는 in /sbin
and in /usr/sbin
(다음으로 실행하지 않는 경우) 하지만 해당 옵션 root
에 관련 폴더를 추가할 수 있습니다 .-b
답변2
OP는 명확히 하지 않았지만 어느 것이 궁금하다면;현재 실행 중프로세스는 주어진 라이브러리를 사용하고 있습니다. lsof
이는 (공유 라이브러리의 파일 설명자를 사용하여) 현재 사용 중인 모든 공유 라이브러리와 이를 로드하는 프로그램 이름을 나열할 수 있기 때문에 유용합니다.
예를 들어, 다음은 제가 사용하고 있는 텍스트 편집기에서 사용하는 파일 목록입니다(처음 몇 개의 열 제거).
cwd DIR 8,1 4096 783366 /tmp
rtd DIR 8,1 4096 2 /
txt REG 8,1 1007808 659475 /usr/bin/vile
mem REG 8,1 22664 1189463 /usr/lib/vile/vile-txt-filt.so
mem REG 8,1 14472 1072690 /usr/lib/perl/5.14.2/auto/Tie/Hash/NamedCapture/NamedCapture.so
mem REG 8,1 26984 717426 /usr/lib/perl/5.14.2/auto/List/Util/Util.so
mem REG 8,1 18704 717420 /usr/lib/perl/5.14.2/auto/IO/IO.so
mem REG 8,1 18672 717423 /usr/lib/perl/5.14.2/auto/Fcntl/Fcntl.so
mem REG 8,1 14472 717444 /usr/lib/perl/5.14.2/auto/Cwd/Cwd.so
mem REG 8,1 47616 914637 /lib/x86_64-linux-gnu/libnss_files-2.13.so
mem REG 8,1 43560 914639 /lib/x86_64-linux-gnu/libnss_nis-2.13.so
mem REG 8,1 89056 914574 /lib/x86_64-linux-gnu/libnsl-2.13.so
mem REG 8,1 31584 914635 /lib/x86_64-linux-gnu/libnss_compat-2.13.so
mem REG 8,1 10272 714121 /usr/lib/x86_64-linux-gnu/gconv/ISO8859-1.so
mem REG 8,1 110939968 692851 /usr/lib/locale/locale-archive
mem REG 8,1 530736 914572 /lib/x86_64-linux-gnu/libm-2.13.so
mem REG 8,1 35104 914569 /lib/x86_64-linux-gnu/libcrypt-2.13.so
mem REG 8,1 131107 913941 /lib/x86_64-linux-gnu/libpthread-2.13.so
mem REG 8,1 14768 914571 /lib/x86_64-linux-gnu/libdl-2.13.so
mem REG 8,1 1607696 914566 /lib/x86_64-linux-gnu/libc-2.13.so
mem REG 8,1 1574680 717850 /usr/lib/libperl.so.5.14.2
mem REG 8,1 167952 913960 /lib/x86_64-linux-gnu/libtinfo.so.5.9
mem REG 8,1 136936 913944 /lib/x86_64-linux-gnu/ld-2.13.so
mem REG 8,1 26066 714417 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
0u CHR 136,2 0t0 5 /dev/pts/2
1u CHR 136,2 0t0 5 /dev/pts/2
2u CHR 136,2 0t0 5 /dev/pts/2
3r REG 8,1 6317 1197635 /usr/share/vile/perl/capture.pm
4r REG 8,1 1875 1197632 /usr/share/vile/perl/Vile/Manual.pm
5r REG 8,1 1349 1197630 /usr/share/vile/perl/plugins.pl
6r REG 8,1 4916 1197634 /usr/share/vile/perl/hgrep.pm
7r REG 8,1 652 1197643 /usr/share/vile/perl/Visit.pm
8r REG 8,1 1680 1197625 /usr/share/vile/perl/Glob2re.pm
9r REG 8,1 3986 1197638 /usr/share/vile/perl/dirlist.pm
10r FIFO 0,8 0t0 25311 pipe
ldd
그런데 lsof
대부분의 Unix 계열 플랫폼에서는 보편적으로 사용할 수 없습니다.
다음은 현재 실행 중인 시스템의 모든 라이브러리에 대한 보고서를 생성하는 예제 스크립트입니다(인수가 제공되면 라이브러리 이름과 비교됩니다).
#!/usr/bin/perl -w
# $Id: lsof-libs,v 1.2 2016/05/28 13:59:33 tom Exp $
#
# Process the output from "lsof", obtaining a list of binaries by library path.
use strict;
open( FP, "lsof|" ) || do {
print STDERR "Can't open lsof: $!\n";
return;
};
my (@input) = <FP>;
close(FP);
my $program = "";
my $library = "";
my %libs;
for my $n ( 0 .. $#input ) {
my @fields = split /\s+/, $input[$n];
next if ( $#fields < 8 );
next unless ( $fields[8] =~ /^\// );
my $pathname = $fields[8];
if ( $fields[3] eq "txt" ) {
$program = $pathname;
}
elsif ( $fields[3] eq "mem" ) {
next unless ( $pathname =~ /\/lib[^\/]/ );
$library = $pathname;
my $found = ( $#ARGV < 0 );
if ( $#ARGV >= 0 ) {
for my $a ( 0 .. $#ARGV ) {
if ( $ARGV[$a] eq $library ) {
$found = 1;
last;
}
}
}
if ($found) {
my %obj;
%obj = %{ $libs{$library} } if ( $libs{$library} );
$obj{$program} = 1;
$libs{$library} = \%obj;
}
}
}
for my $lib ( sort keys %libs ) {
printf "%s\n", $lib;
my %obj = %{ $libs{$lib} };
for my $prog ( sort keys %obj ) {
printf "\t%s\n", $prog;
}
}
1;
추가 자료:
답변3
배포판에서 제공하는 바이너리를 고수하는 한 패키지 종속성을 통해 이를 추적합니다.
- 라이브러리 파일이 포함된 패키지를 확인합니다.
- 이 라이브러리 패키지에 의존하는 패키지를 나열합니다.
- 이 패키지의 실행 파일을 나열하십시오.
물론 배포판의 패키징 메커니즘을 통해 설치되지 않은 프로그램에 대해서는 알려주지 않습니다. 패키지에 여러 실행 파일이 포함되어 있으면 추가 실행 파일도 나열됩니다. 반면, 여러 가지 목적으로 패키지는 실행 파일이 아니라 필요한 정보입니다.
각 단계를 수행하는 방법은 배포판에서 사용하는 패키지 관리자에 따라 다릅니다. 이것팩맨 로제타널리 사용되는 배포판에는 패키지 관리 명령 목록이 있습니다. 예를 들어 Debian, Ubuntu, Linux Mint, 기본 OS 및 기타 dpkg/apt 기반 배포판에서는 다음과 같습니다.
dpkg -S /path/to/library.so # which package contains this library?
aptitude search "~i ~Dlibrary-package" # which installed packages depend on this library?
dpkg -L $(aptitude search -F %p "~i ~D$(dpkg -S /path/to/library.so | sed 's/:.*//')") | grep /bin
답변4
의심스러운 경우 무차별 대입을 사용하십시오.
#!/bin/bash
# $1 -- target library
IFS=:
find $PATH -maxdepth 1 -executable -type f -o -type l 2>/dev/null |
while read b; do
ldd "$b" 2>/dev/null | grep -q -F "$1" && echo "$b"
done
시스템에서 모든 PATH 실행 파일(~4K)을 찾는 데 약 1분 정도 걸립니다.