Çalıştığında bir binary yüklenen dinamik kitaplıkların listesini bulmak istiyorum (Tam yolları ile). CentOS 6.0 kullanıyorum. Bu nasıl yapılır?
Çalıştığında bir binary yüklenen dinamik kitaplıkların listesini bulmak istiyorum (Tam yolları ile). CentOS 6.0 kullanıyorum. Bu nasıl yapılır?
Yanıtlar:
Bunu ldd
komutla 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)
otool -L <path-to-binary>
ldd
. Man sayfasına bakınız .
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, ldd
arama yolunu / önbelleğini anlamaktır . Bence ldconfig
gitmenin 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ı
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
( dlopen
sonuç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.
strace -e trace=open,openat myprogram
/proc/<pid>/maps
ayrıca dlopen
libs 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/…
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
1234 numaralı bir işlem için, /proc/1234/maps
(metinsel) sahte dosyayı da okuyabilir ( proc (5) oku ) veya pmap (1) kullanabilirsiniz.
Bu işlem, bu işlemin sanal adres alanını verir , bu nedenle hafıza haritalanmış dosyalar (paylaşılan kütüphaneler dahil, hatta dlopen (3) -ed)
(elbette, verilen bir programı çalıştıran işlemleri bulmak için ps aux
ya da pgrep (1) kullanın)
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 $?
Bir find
komutta 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)
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
lld
Darwin'de yok , öyle görünüyor, ne de homebrew aracılığıyla bulamıyorum.