実行時に実行される動的ライブラリの実行可能ファイルを見つける方法


回答:


61

lddコマンドでこれを行うことができます:

NAME
       ldd - print shared library dependencies

SYNOPSIS
       ldd [OPTION]...  FILE...

DESCRIPTION
       ldd  prints  the  shared  libraries  required by each program or shared
       library specified on the command line.
....

例:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff87ffe000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007ff0510c1000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff050eb9000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007ff050cb0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff0508f0000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff0506ec000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ff0512f7000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff0504ce000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007ff0502c9000)

1
macOSでこれに相当するものは何か?lldダーウィンにはありません、それは表示されませんし、自作で見つけることもできません。
mz2

7
macOSの場合:otool -L <path-to-binary>
Richard Viney

これによりバイナリが実行される可能性があることに注意してください。そのため、バイナリが信頼できない場合、を使用しない方が良い場合がありますlddmanページを参照してください
ポールルーニー

46

readelf -d $executable | grep 'NEEDED'

実行可能ファイルを実行できない場合、たとえば、クロスコンパイルされた場合、または信頼できない場合に使用できます。

通常の場合、lddはLD_TRACE_LOADED_OBJECTS環境変数を1に設定して標準の動的リンカー(ld.so(8)を参照)を呼び出します。これにより、リンカーはライブラリの依存関係を表示します。ただし、状況によっては、lddのバージョンによっては、プログラムを直接実行して依存関係情報を取得しようとする場合があることに注意してください。したがって、信頼できない実行可能ファイルに対してlddを使用しないでください。これにより、任意のコードが実行される可能性があります。

例:

readelf -d /bin/ls | grep 'NEEDED'

サンプル出力:

 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

しかし、より正確な方法は、ldd検索パス/キャッシュを理解することです。ldconfig行く方法だと思います。

いずれかを選択して、繰り返します。

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 実行中のプロセス用

Basileが言及したように、これは実行可能ファイルを実行することによって現在使用されているすべてのライブラリを見つけるのに役立ちます。例えば:

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)

参照:Linuxで現在ロードされている共有オブジェクトを表示する方法は?| スーパーユーザー


1
同様:(AMD64上armhf EX)readelfが方法についての素晴らしい部分は、それがクロスバイナリ上で動作することである
Ghostrider

13

lddおよびlsofは、直接または特定の瞬間にロードされたライブラリを表示します。経由でロードdlopen(または破棄dlclose)されたライブラリは考慮されません。を使用してstrace、これのより良い全体像を得ることができます。例えば、

strace -e trace=open myprogram

dlopen最終的に呼び出しますopen-もちろん、64ビットのオープンに別の名前を使用しているシステムがあるかもしれませんが...)。

例:

strace -e trace=open date

私にこれを示しています:

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/etc/localtime", O_RDONLY)        = 3
Wed Apr 12 04:56:32 EDT 2017

そこから「.so」の名前をgrepして、共有オブジェクトだけを見ることができます。


3
改善点:strace -e trace=open,openat myprogram
サイカー

いい方法。/proc/<pid>/mapsまた、示しdlopenところでLIBSを:unix.stackexchange.com/questions/120015/... ltrace -Sそれはのように両方のシステムコールやライブラリ呼び出しを示すように、出力にも涼しいですdlopenunix.stackexchange.com/questions/226524/...を
チロSantilli新疆改造中心法轮功六四事件

7

lsofは、特定のプロセスに使用されているライブラリを表示することもできます。

すなわち

$ pidof nginx
6920 6919

$ lsof -p 6919|grep mem
nginx   6919 root  mem    REG               0,64    65960     43 /lib64/libnss_files-2.12.so
nginx   6919 root  mem    REG               0,64    19536     36 /lib64/libdl-2.12.so
nginx   6919 root  mem    REG               0,64    10312   1875 /lib64/libfreebl3.so
nginx   6919 root  mem    REG               0,64  1923352     38 /lib64/libc-2.12.so
nginx   6919 root  mem    REG               0,64    88600   1034 /lib64/libz.so.1.2.3
nginx   6919 root  mem    REG               0,64  1967392   1927 /usr/lib64/libcrypto.so.1.0.1e
nginx   6919 root  mem    REG               0,64   183080   1898 /lib64/libpcre.so.0.0.1
nginx   6919 root  mem    REG               0,64    40400   1217 /lib64/libcrypt-2.12.so
nginx   6919 root  mem    REG               0,64   142688     77 /lib64/libpthread-2.12.so
nginx   6919 root  mem    REG               0,64   154664     31 /lib64/ld-2.12.so

2

以下のためのプロセスのpid 1234の、あなたも読むことができる/proc/1234/maps(原文)擬似ファイルを(読み取りPROCを(5) ...)、または使用のpmapを(1)

これにより、そのプロセスの仮想アドレス空間が得られるため、メモリマップされたファイル(共有ライブラリ、dlopen(3) -ed を含むも含まれます

(もちろん、特定のプログラムを実行しているプロセスを見つけるには、ps auxまたはpgrep(1)を使用してください)


1

一括クエリの場合:

  1. 小さなスクリプト(useslib)を作成してPATHに入力します(または以下のコマンドで完全なパスを指定します)

    #! /bin/bash
    ldd $1 | grep -q $2
    exit $?
    
  2. findたとえば、コマンドで使用します。

    find /usr/bin/ -executable -type f -exec useslib {} libgtk-x11-2.0 \; -print
    

(libgtk-x11-2.0はgtk2 libのようです)


0

使用可能pmapです。

たとえば、プロセスを開始します。 $ watch date

PIDを取得: $ ps -ef | grep watch

メモリマップを表示: $ pmap <pid>

フルパスで表示: $ pmap <pid> -p

$ pmap 72770
72770:   watch date
00005613a32c9000     20K r-x-- watch
00005613a34cd000      4K r---- watch
00005613a34ce000      4K rw--- watch
00005613a4f6a000    264K rw---   [ anon ]
00007f2f3a7d5000 204616K r---- locale-archive
00007f2f46fa7000   1748K r-x-- libc-2.27.so
00007f2f4715c000   2048K ----- libc-2.27.so
00007f2f4735c000     16K r---- libc-2.27.so
00007f2f47360000      8K rw--- libc-2.27.so
00007f2f47362000     16K rw---   [ anon ]
00007f2f47366000     12K r-x-- libdl-2.27.so
00007f2f47369000   2044K ----- libdl-2.27.so
00007f2f47568000      4K r---- libdl-2.27.so
00007f2f47569000      4K rw--- libdl-2.27.so
00007f2f4756a000    160K r-x-- libtinfo.so.6.1
00007f2f47592000   2048K ----- libtinfo.so.6.1
00007f2f47792000     16K r---- libtinfo.so.6.1
00007f2f47796000      4K rw--- libtinfo.so.6.1
00007f2f47797000    232K r-x-- libncursesw.so.6.1
00007f2f477d1000   2048K ----- libncursesw.so.6.1
00007f2f479d1000      4K r---- libncursesw.so.6.1
00007f2f479d2000      4K rw--- libncursesw.so.6.1
00007f2f479d3000    148K r-x-- ld-2.27.so
00007f2f47bdb000     20K rw---   [ anon ]
00007f2f47bf1000     28K r--s- gconv-modules.cache
00007f2f47bf8000      4K r---- ld-2.27.so
00007f2f47bf9000      4K rw--- ld-2.27.so
00007f2f47bfa000      4K rw---   [ anon ]
00007ffd39404000    136K rw---   [ stack ]
00007ffd3959b000     12K r----   [ anon ]
00007ffd3959e000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total           215692K
$ pmap 72770 -p
72770:   watch date
00005613a32c9000     20K r-x-- /usr/bin/watch
00005613a34cd000      4K r---- /usr/bin/watch
00005613a34ce000      4K rw--- /usr/bin/watch
00005613a4f6a000    264K rw---   [ anon ]
00007f2f3a7d5000 204616K r---- /usr/lib/locale/locale-archive
00007f2f46fa7000   1748K r-x-- /usr/lib64/libc-2.27.so
00007f2f4715c000   2048K ----- /usr/lib64/libc-2.27.so
00007f2f4735c000     16K r---- /usr/lib64/libc-2.27.so
00007f2f47360000      8K rw--- /usr/lib64/libc-2.27.so
00007f2f47362000     16K rw---   [ anon ]
00007f2f47366000     12K r-x-- /usr/lib64/libdl-2.27.so
00007f2f47369000   2044K ----- /usr/lib64/libdl-2.27.so
00007f2f47568000      4K r---- /usr/lib64/libdl-2.27.so
00007f2f47569000      4K rw--- /usr/lib64/libdl-2.27.so
00007f2f4756a000    160K r-x-- /usr/lib64/libtinfo.so.6.1
00007f2f47592000   2048K ----- /usr/lib64/libtinfo.so.6.1
00007f2f47792000     16K r---- /usr/lib64/libtinfo.so.6.1
00007f2f47796000      4K rw--- /usr/lib64/libtinfo.so.6.1
00007f2f47797000    232K r-x-- /usr/lib64/libncursesw.so.6.1
00007f2f477d1000   2048K ----- /usr/lib64/libncursesw.so.6.1
00007f2f479d1000      4K r---- /usr/lib64/libncursesw.so.6.1
00007f2f479d2000      4K rw--- /usr/lib64/libncursesw.so.6.1
00007f2f479d3000    148K r-x-- /usr/lib64/ld-2.27.so
00007f2f47bdb000     20K rw---   [ anon ]
00007f2f47bf1000     28K r--s- /usr/lib64/gconv/gconv-modules.cache
00007f2f47bf8000      4K r---- /usr/lib64/ld-2.27.so
00007f2f47bf9000      4K rw--- /usr/lib64/ld-2.27.so
00007f2f47bfa000      4K rw---   [ anon ]
00007ffd39404000    136K rw---   [ stack ]
00007ffd3959b000     12K r----   [ anon ]
00007ffd3959e000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total           215692K
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.