/libの特定のファイルに依存するバイナリを確認するには?

/libの特定のファイルに依存するバイナリを確認するには?

ldd <name>バイナリでコマンドを実行するのか、/binそれとも/sbinどのライブラリを使用しているのかを知ることができます。どうやって逆にできますか?つまり、ファイルに対してコマンドを実行し、/libどのバイナリがそれを使用しているかを確認しますか?

答え1

これはまさにあなたが要求したものではありませんが、これは特定のライブラリを使用するバイナリのリストを見つけるのに役立ちます。binstatsシステムのバイナリとライブラリに関するレポートを生成し、主にライブラリが見つからないバイナリと廃止されたライブラリを特定します。

デバッグモードでは一時ファイルを残します。そのうちの1つは、-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分かかります。

関連情報