実行時にどの動的ライブラリ実行可能ファイルがロードされているかを確認するには?

実行時にどの動的ライブラリ実行可能ファイルがロードされているかを確認するには?

実行時にバイナリによってロードされた動的ライブラリ(およびそのフルパス)のリストを探したいと思います。 CentOS 6.0を使用しています。どうすればいいですか?

答え1

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)

答え2

readelf -d $executable | grep 'NEEDED'

たとえば、クロスコンパイル済みまたは信頼できない場合、実行可能ファイルを実行できない場合は、次のようになります。

通常の状況では、lddは標準の動的リンカー(ld.so(8)を参照)を呼び出し、LD_TRACE_LOADED_OBJECTS環境変数を1に設定します。これにより、リンカーはライブラリの依存関係を表示します。ただし、一部のバージョンでは、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私はこれが行く道だと思います。

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プロセスの実行に使用されます。

バーゼルで言及これは、現在実行中の実行可能ファイルで使用されているすべてのライブラリを見つけるのに役立ちます。たとえば、

sudo awk '/\.so/{print $6}' /proc/1/maps | sort -u

init1現在ロードされているすべての動的依存関係を表示(PID)します。

/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)Ubuntu 18.04で壊れました。

また見なさい:Linuxで現在ロードされている共有オブジェクトを表示するには? |スーパーユーザー

答え3

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」という名前を見つけて共有オブジェクトを表示できます。

答え4

一括クエリ:

  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ライブラリのようです)

関連情報