Çalıştırıldığında dinamik kütüphanelerin çalıştırılabilir yüklerini nasıl bulabilirim?


Yanıtlar:


61

Bunu lddkomutla yapabilirsiniz:

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.
....

Örnek:

$ 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
Bunun bir macOS eşdeğeri olacağı hakkında bir fikriniz var mı? lldDarwin'de yok , öyle görünüyor, ne de homebrew aracılığıyla bulamıyorum.
mz2

7
MacOS'ta:otool -L <path-to-binary>
Richard Viney

bunun ikili dosyayı çalıştırabileceğini unutmayın. Bu yüzden ikili ikili güvenilmez ise, kullanmamak daha iyi olabilir ldd. Man sayfasına bakınız .
Paul Rooney

45

readelf -d $executable | grep 'NEEDED'

Yürütülebilir dosyayı çalıştıramazsanız, örneğin çapraz derlenmişse veya güvenmiyorsanız kullanılabilir:

Genel durumda, ldd, standart dinamik bağlayıcıyı (bkz. Ld.so (8)) LD_TRACE_LOADED_OBJECTS çevre değişkeni ile 1'e ayarlayarak çağırır ve bu da bağlayıcının kitaplık bağımlılıklarını görüntülemesine neden olur. Bununla birlikte, bazı durumlarda, ldd'nin bazı sürümlerinin, programı doğrudan uygulayarak bağımlılık bilgilerini edinmeye çalışabileceğini unutmayın. Bu nedenle, hiçbir zaman güvenilir olmayan bir çalıştırılabilir dosya üzerinde ldd kullanmamalısınız, çünkü bu keyfi bir kodun yürütülmesine neden olabilir.

Örnek:

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

Örnek çıkış:

 0x0000000000000001 (NEEDED)             Shared library: [libselinux.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libacl.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

Kütüphanelerin diğer kütüphanelere bağlı olabileceğine dikkat edin, o yüzden şimdi bağımlılıkları bulmanız gerekiyor.

Genellikle işe yarayan saf bir yaklaşım:

$ 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

ancak daha kesin olan yöntem, lddarama yolunu / önbelleğini anlamaktır . Bence ldconfiggitmenin yolu bu.

Birini seçip tekrarlayın:

readelf -d /lib/x86_64-linux-gnu/libselinux.so.1 | grep 'NEEDED'

Örnek çıktı:

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]

Ve bunun gibi.

Ayrıca bakınız:

/proc/<pid>/maps çalışan işlemler için

Basile tarafından belirtildiği gibi , şu anda çalıştırılabilir dosyaları çalıştırarak kullanılmakta olan tüm kütüphaneleri bulmakta fayda var. Örneğin:

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

şu anda yüklenen tüm dinamik bağımlılıkları gösterir 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

Bu yöntem aynı zamanda bir Ubuntu 18.04 ile hacklenmiş bu minimal kurulumladlopen test edilmiş kütüphaneleri de gösterir .sleep(1000)

Ayrıca bakınız: Yüklenmekte olan paylaşılan nesneleri Linux'ta nasıl görebilirim? | Süper kullanıcı


1
Okuma metodu ile ilgili güzel bir bölüm, çapraz ikili dosyalarda (ör: amd64'teki armhf) de işe yaramasıdır
Ghostrider

13

ldd ve lsof, doğrudan veya belirli bir anda yüklenen kütüphaneleri gösterir . Üzerinden yüklenen dlopen(veya tarafından atılandlclose ) kütüphaneleri hesaba katmazlar . Bunu kullanarak daha iyi bir resim elde edebilirsiniz strace, örneğin

strace -e trace=open myprogram

( dlopensonuçta aradığından beri open- tabii ki 64-bit açılış için farklı isimler kullanan bir sisteminiz olabilir ...).

Örnek:

strace -e trace=open date

bana bunu gösterir:

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

bunlardan biri ".so" adlarını yalnızca paylaşılan nesneleri görmek için aşırdırabilir.


3
Bir gelişme:strace -e trace=open,openat myprogram
Cyker

Güzel yöntem. /proc/<pid>/mapsayrıca dlopenlibs btw gösterir : unix.stackexchange.com/questions/120015/… ltrace -S aşağıdaki gibi hem sistem çağrılarını hem de kütüphane çağrılarını gösterdiği için çıktı daha soğuktur dlopen: unix.stackexchange.com/questions/226524/…
Ciro Santilli 新疆 改造 中心 法轮功 六四事件

7

lsof ayrıca kütüphaneler belirli bir süreç için kullanılmakta olduğunu gösterebilir.

yani

$ 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


1

Toplu sorgu için:

  1. küçük bir komut dosyası ( useslib) oluşturun ve PATH’a yerleştirin (aşağıdaki komutta tam bir yol belirtin)

    #! /bin/bash
    ldd $1 | grep -q $2
    exit $?
    
  2. Bir findkomutta kullanın, örneğin:

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

(libgtk-x11-2.0, gtk2 lib'si gibi görünüyor)


0

Mümkün kullanımı pmap.

Örneğin, bir işlem başlatın: $ watch date

Pid al: $ ps -ef | grep watch

Hafıza haritasını göster: $ pmap <pid>

Tam yol göster: $ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.