/lib의 특정 파일에 의존하는 바이너리를 확인하는 방법은 무엇입니까?

/lib의 특정 파일에 의존하는 바이너리를 확인하는 방법은 무엇입니까?

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 /sbinand 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

배포판에서 제공하는 바이너리를 고수하는 한 패키지 종속성을 통해 이를 추적합니다.

  1. 라이브러리 파일이 포함된 패키지를 확인합니다.
  2. 이 라이브러리 패키지에 의존하는 패키지를 나열합니다.
  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분 정도 걸립니다.

관련 정보