Saya ingin mengetahui daftar perpustakaan dinamis yang dimuat biner saat dijalankan (Dengan jalur lengkapnya). Saya menggunakan CentOS 6.0. Bagaimana cara melakukannya?
executable
libraries
dynamic-linking
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
sumber
lld
pada darwin, tampaknya, saya juga tidak dapat menemukannya melalui homebrew.otool -L <path-to-binary>
ldd
. Lihat halaman manual .readelf -d $executable | grep 'NEEDED'
Dapat digunakan jika Anda tidak dapat menjalankan executable, misalnya jika itu dikompilasi silang, atau jika Anda tidak mempercayainya:
Contoh:
Contoh ouptut:
Perhatikan bahwa pustaka dapat bergantung pada pustaka lain, jadi sekarang Anda perlu menemukan dependensinya.
Pendekatan naif yang sering berhasil adalah:
tetapi metode yang lebih tepat adalah memahami
ldd
jalur pencarian / cache. Saya pikirldconfig
adalah cara untuk pergi.Pilih satu, dan ulangi:
Output sampel:
Dan seterusnya.
Lihat juga:
/proc/<pid>/maps
untuk menjalankan prosesDisebutkan oleh Basile , ini berguna untuk menemukan semua perpustakaan yang saat ini digunakan oleh menjalankan executable. Misalnya:
menunjukkan semua dependensi dinamis
init
(PID1
) yang saat ini dimuat :Metode ini juga menunjukkan perpustakaan dibuka dengan
dlopen
, diuji dengan pengaturan minimal ini diretas dengansleep(1000)
Ubuntu 18.04.Lihat juga: Bagaimana cara melihat objek bersama yang saat ini dimuat di Linux? | Pengguna Super
sumber
ldd dan lsof menunjukkan perpustakaan dimuat baik secara langsung atau pada saat tertentu . Mereka tidak memperhitungkan pustaka yang dimuat melalui
dlopen
(atau dibuang olehdlclose
). Anda bisa mendapatkan gambaran yang lebih baik tentang penggunaan inistrace
, misalnya,(Karena
dlopen
pada akhirnya panggilanopen
- meskipun Anda tentu saja dapat memiliki sistem menggunakan nama yang berbeda untuk membuka 64-bit ...).Contoh:
tunjukkan ini:
dari mana orang dapat menangkap nama ".so" untuk hanya melihat objek yang dibagikan.
sumber
strace -e trace=open,openat myprogram
/proc/<pid>/maps
juga menunjukkandlopen
libs btw: unix.stackexchange.com/questions/120015/...ltrace -S
output lebih dingin karena menampilkan panggilan syscalls dan perpustakaan sepertidlopen
: unix.stackexchange.com/questions/226524/…lsof juga dapat menunjukkan kepada Anda perpustakaan mana yang sedang digunakan untuk satu proses tertentu.
yaitu
sumber
Untuk proses pid 1234, Anda juga bisa membaca
/proc/1234/maps
file pseudo (tekstual) (baca proc (5) ...) atau menggunakan pmap (1)Ini memberikan ruang alamat virtual dari proses itu, maka file-file (termasuk perpustakaan bersama, bahkan dlopen (3) -ed satu) yang dipetakan memori
(tentu saja, gunakan
ps aux
atau pgrep (1) untuk menemukan proses menjalankan beberapa program yang diberikan)sumber
Untuk kueri massal:
buat skrip kecil (
useslib
) dan masukkan ke dalam PATH (orspecify path lengkap pada perintah di bawah)Gunakan itu dalam
find
perintah, misalnya:(libgtk-x11-2.0 tampaknya menjadi lib gtk2)
sumber
Itu mungkin digunakan
pmap
.Sebagai contoh, mulailah proses:
$ watch date
Dapatkan pid:
$ ps -ef | grep watch
Tampilkan peta memori:
$ pmap <pid>
Tampilkan dengan jalur lengkap:
$ pmap <pid> -p
sumber