Saya ingin tahu perpustakaan mana yang digunakan oleh executable di sistem saya. Lebih khusus, saya ingin memberi peringkat perpustakaan mana yang paling banyak digunakan, bersama dengan biner yang menggunakannya. Bagaimana saya bisa melakukan ini?
linux
shared-libraries
Alan Szlosek
sumber
sumber
dlopen
.Jawaban:
ldd
untuk membuat daftar pustaka bersama untuk setiap yang dapat dieksekusi.Untuk menemukan jawaban untuk semua executable di direktori "/ bin":
Ubah "/ bin" di atas menjadi "/" untuk mencari semua direktori.
Output (hanya untuk direktori / bin) akan terlihat seperti ini:
Edit - Dihapus "grep -P"
sumber
ldd -v
ldd
sebenarnya menjalankan executable dengan variabel lingkungan khusus, dan Linux dynamic linker mengenali flag ini dan hanya menampilkan pustaka daripada menjalankan executable. Lihatlah sumbernyaldd
; di sistem saya, ini skrip bash. Jika executable terhubung secara statis dan menggunakan syscalls, dan menentukan loader yang berbeda, ia dapat melakukan hal-hal jahat yang sewenang-wenang. Jadi jangan gunakanldd
pada executable yang tidak Anda percayai.Saya tidak memiliki ldd di ARM toolchain saya jadi saya menggunakan objdump:
$ (CROSS_COMPILE) objdump -p
Misalnya:
sumber
ldd
yang seharusnya tidak digunakan pada executable yang tidak dipercaya.obbjdump -p
perlihatkan informasi tambahan sepertiRPATH
, yang mungkin bisa membantu ketika menyelidiki masalah penautan dinamis dengan yang dapat dieksekusi Anda.musl-gcc
secara teratur menghasilkan binari sehingga memanggilldd
biner hanya mengeksekusi biner , jadi saat ini saya secara teratur diingatkan betapa tidak amannyaldd
).Di Linux saya menggunakan:
Ini berfungsi lebih baik daripada
ldd
ketika dieksekusi menggunakan loader non-standarsumber
untuk mempelajari perpustakaan apa yang digunakan biner, gunakan ldd
Anda harus menulis skrip shell kecil untuk mendapatkan rincian sistem Anda.
sumber
Periksa dependensi pustaka bersama dari program yang dapat dieksekusi
Untuk mencari tahu tergantung pada perpustakaan mana yang dapat dieksekusi tertentu, Anda dapat menggunakan perintah ldd. Perintah ini memanggil dynamic linker untuk mengetahui dependensi pustaka yang dapat dieksekusi.
> $ ldd / path / ke / program
Perhatikan bahwa TIDAK direkomendasikan untuk menjalankan ldd dengan executable pihak ketiga yang tidak dipercaya karena beberapa versi ldd dapat secara langsung memanggil executable untuk mengidentifikasi dependensi pustaka, yang dapat menjadi risiko keamanan.
Sebaliknya, cara yang lebih aman untuk menunjukkan dependensi pustaka dari biner aplikasi yang tidak dikenal adalah dengan menggunakan perintah berikut.
untuk info lebih lanjut
sumber
readelf -d
pengulanganredelf -d
menghasilkan output serupa denganobjdump -p
yang disebutkan di: https://stackoverflow.com/a/15520982/895245Namun berhati-hatilah bahwa pustaka dinamis dapat bergantung pada pustaka dinamis lain, karena Anda harus berulang.
Contoh:
Contoh ouptut:
Kemudian:
Pilih satu, dan ulangi:
Output sampel:
Dan seterusnya.
/proc/<pid>/maps
untuk menjalankan prosesIni 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: /superuser/310199/see-currently-loaded-share-objects-in-linux/1243089
sumber
Pada OS X secara default tidak ada
ldd
,objdump
ataulsof
. Sebagai alternatif, cobalahotool -L
:Dalam contoh ini, menggunakan
which openssl
mengisi di jalur yang sepenuhnya memenuhi syarat untuk lingkungan pengguna yang dapat dieksekusi dan saat ini.sumber
Pada sistem UNIX, anggaplah nama biner (dapat dieksekusi) adalah uji. Kemudian kita menggunakan perintah berikut untuk membuat daftar pustaka yang digunakan dalam tes ini
sumber
Dengan
ldd
Anda bisa mendapatkan perpustakaan yang menggunakan alat. Untuk memberi peringkat penggunaan perpustakaan untuk satu set alat, Anda dapat menggunakan sesuatu seperti perintah berikut.(Berikut
sed
menghapus semua baris yang tidak dimulai dengan tab dan menyaring hanya perpustakaan yang sebenarnya. Dengansort | uniq -c
Anda mendapatkan setiap perpustakaan dengan hitungan yang menunjukkan berapa kali itu terjadi.)Anda mungkin ingin menambahkan
sort -g
di akhir untuk mendapatkan perpustakaan dalam urutan penggunaan.Perhatikan bahwa Anda mungkin mendapatkan baris dua baris non-perpustakaan dengan perintah di atas. Salah satu executable statis ("bukan executable dinamis") dan satu tanpa pustaka. Yang terakhir adalah hasil
linux-gate.so.1
yang bukan perpustakaan di sistem file Anda tetapi satu "disediakan" oleh kernel.sumber
Satu lagi opsi bisa langsung baca file yang ada di
Misalnya id proses adalah 2601 maka perintahnya adalah
Dan hasilnya seperti
sumber
pada paket cetak ubuntu yang terkait dengan yang dapat dieksekusi
sumber
Saya menemukan posting ini sangat membantu karena saya perlu menyelidiki dependensi dari perpustakaan yang disediakan pihak ke-3 (jalur eksekusi 32 vs 64 bit).
Saya mengumpulkan skrip bash Q&D berulang berdasarkan saran 'readelf -d' pada distro RHEL 6.
Ini sangat mendasar dan akan menguji setiap ketergantungan setiap kali meskipun mungkin telah diuji sebelumnya (yaitu sangat bertele-tele). Output juga sangat mendasar.
redirect output ke file dan ambil untuk 'ditemukan' atau 'gagal'
Gunakan dan modifikasi, tentu saja dengan risiko Anda sendiri, sesuai keinginan.
sumber