- libtree adalah alat yang mengubah output
lddmenjadi bentuk pohon, sekaligus menjelaskan bagaimana shared library ditemukan atau mengapa tidak dapat ditemukan - Pada output default, sebagian dependensi standar disembunyikan; dengan
-v,-vv,-vvv, Anda bisa melihat secara bertahap library yang disembunyikan hingga dependensi dari library yang sudah pernah ditemui --pathatau-pmenampilkan path alih-alih soname, dan--max-depthdapat membatasi kedalaman penelusuran rekursif- Instalasi tersedia melalui binary prebuilt v3.1.1, Fedora/RHEL/CentOS, Ubuntu 22.04+, dan GNU Guix
- Untuk build dari source diperlukan compiler C yang memahami C99, dan saat menggunakan
makedisarankan memakaiLDFLAGS=-static
Apa yang dilakukan libtree
- libtree adalah alat yang mengubah
lddmenjadi bentuk pohon - Menjelaskan bagaimana shared library ditemukan, atau mengapa lokasinya tidak dapat ditemukan
- README menyertakan screenshot
doc/screenshot.png
Opsi output
- Pada output default, sebagian dependensi standar tidak ditampilkan
- Output yang lebih detail dikendalikan dengan opsi verbosity
libtree -v: menampilkan library yang secara default dilewatilibtree -vv: juga menampilkan dependensi dari library yang secara default dilewatilibtree -vvv: juga menampilkan dependensi dari library yang sudah pernah ditemui
- Flag
--pathatau-pmenampilkan path alih-alih soname- Contoh:
libtree -p $(which tar)
- Contoh:
--max-depthmembatasi kedalaman rekursi
Cara instalasi
- Binary prebuilt untuk v3.1.1: menyediakan binary prebuilt untuk Linux
- Di Fedora / RHEL / CentOS, instal dengan
dnf- Untuk RHEL dan distribusi turunannya, aktifkan
epel-releaseterlebih dahulu dnf install libtree-ldd
- Untuk RHEL dan distribusi turunannya, aktifkan
- Di Ubuntu 22.04+, instal dengan
apt-get install libtree - Di GNU Guix, instal dengan
guix install libtree - Rilis lama v2.0.0 juga tersedia
Build dari source
libtreememerlukan compiler C yang memahami C99- Prosedur build dasar adalah meng-clone repository lalu menjalankan
makegit clone https://github.com/haampie/libtree.gitcd libtreemake
- Saat menggunakan
make, disarankan memakaiLDFLAGS=-static - README juga menyediakan perintah unsafe quick install untuk mengambil
libtree.cdengancurllalu mengompilasinya, dalam bagian terpisah yang dapat dilipat
2 komentar
Pendapat Hacker News
Apakah alat ini juga mengikuti perilaku tak terduga
ldd, yaitu benar-benar mengeksekusi sebagian library yang sedang diperiksa?https://catonmat.net/ldd-arbitrary-code-execution
lddyang sudah lebih dari 5 tahun tidak mengeksekusi binary targetReferensi: https://manpages.debian.org/unstable/manpages/ldd.1.en.html#...
Tampaknya ia sebenarnya mem-parse file ELF secara langsung, dan juga mem-parse dependensi secara rekursif, jadi cukup keren
objdump, data akan ditampilkan apa adanya seperti yang dienkode dalam file ELFTermasuk juga daftar library yang akan dicari oleh vdso
Ada alat serupa bernama lddtree
https://github.com/gentoo/pax-utils/tree/master
Harus menelusuri dependensi yang hilang secara rekursif berulang-ulang dengan
ldditu cukup membosankanJadi ini terlihat seperti peningkatan yang bagus, dan lain kali saya menemui
not foundyang membingungkan, saya berniat mencobanyaPada dasarnya seperti depends.exe versi Linux CLI
Sebaiknya pakai https://github.com/lucasg/Dependencies sebagai gantinya. Itu juga tidak sepenuhnya mutakhir, tapi…
Jika Anda memasang Visual Studio dan memilih
x64/x86 build tools (latest)di installer, menjalankandumpbin /dependentsdari VS Developer Command Prompt masih menjadi opsi paling dapat diandalkan[1] https://www.dependencywalker.com/
Untuk yang penasaran arti warnanya, saya tidak menemukannya di manpage/README
Magenta: ada di daftar pengecualian, hanya ditampilkan dengan
-v[v[v]]Biru: item yang sudah pernah dilihat sebelumnya, sehingga Anda bisa menemukan dependensi yang muncul berkali-kali
Apa maksudnya “alasan library ditemukan atau tidak ditemukan”? Bukankah cuma dua kemungkinan: ada di
LD_LIBRARY_PATHatau tidak?Dari screenshot saja saya tidak begitu paham apa yang dimaksud
Ada beberapa cara berbeda untuk mencari direktori, seperti jalur pencarian sistem, runpath, rpath,
LD_LIBRARY_PATH, dan lain-lainLibrary biasanya di-link dengan nama pendek seperti
foo.so, tetapi juga bisa di-link secara dinamis dengan path lengkap library tersebutSelain itu, secara umum lebih baik menghindari pengaturan
LD_LIBRARY_PATHjika memungkinkan. Memang tidak selalu bisa, tetapi ketika disetel, ia naik ke prioritas pencarian paling atas untuk semua eksekusi. Bahkan jika sesuatu di-link secara dinamis dengan path lengkap library,LD_LIBRARY_PATHtetap diprioritaskan, dan membuat mekanisme pencarian menjadi benar-benar datarLD_LIBRARY_PATHagar bisa ditemukanInti judulnya adalah libtree memudahkan menemukan jalur dari executable ke semua dependensi langsung maupun tidak langsungnya. Salah satu kegunaannya adalah membantu mengidentifikasi masalah dependensi yang hilang
Dalam praktiknya, kalau Anda memakai sistem paket, dependensi biasanya jarang hilang, jadi kemungkinan Anda akan memakai libtree untuk alasan lain
LD_LIBRARY_PATH; ada juga RPATH yang dievaluasi saat pemuatan untuk masing-masing libraryPoin yang lebih besar adalah dependensi membentuk graf, dan ini bisa ditampilkan seperti pohon. Mengetahui library mana yang membutuhkan suatu library sehingga library tertentu tidak ditemukan itu berguna
LD_LIBRARY_PATH. Loader juga mempertimbangkan beberapa sumber lain untuk menemukan libraryDalam konfigurasi yang normal, ini merupakan kombinasi antara field ELF umum dari tiap binary yang dimuat dan jalur lain yang diketahui loader
Pada sistem yang memiliki beberapa versi dari library yang sama atau beberapa library bernama sama, bergantung pada
LD_LIBRARY_PATHbisa sangat picik. Loader akan mencari jalur diLD_LIBRARY_PATHsecara berurutan untuk setiap binary, lalu memilih library pertama yang cocok. Jika Anda belum mengatur jalur berprioritas lebih tinggi dengan cara lain, library itu mungkin bukan yang sebenarnya Anda inginkan, dan bisa menyebabkan error tak terduga saat runtimeCara yang lebih baik adalah mengatur RPATH ke lokasi library yang dibutuhkan binary tersebut
Jika environment dan pengaturan RPATH tidak konsisten, Anda juga bisa memuat beberapa versi dari library yang sama secara bersamaan. Alat ini membantu mengetahui apakah ada masalah dan mengapa itu terjadi
LD_LIBRARY_PATHKarena alat ini berbasis
ldd, mungkin ia juga menafsirkanDYLD_LIBRARY_PATH,DYLD_FALLBACK_FRAMEWORK_PATH,DYLD_FALLBACK_LIBRARY_PATH,@executable_path,@loader_path, dan@rpathSangat berguna. Biasanya saya membaca section dengan
readelfuntuk mencari tahu apa kebutuhan sebenarnyaApakah
LD_DEBUG=libstidak cukup?Saya tidak tahu apakah ini bug, tetapi pada contoh vim,
ldddan libtree menampilkan library yang berbedaMisalnya
linux-vdso.so.1muncul di bagian paling atas daftarldd, tetapi sama sekali tidak muncul di libtreelinux-vdso.so.1bukan library nyata yang bisa ditemukan di suatu tempat dalam filesystem dan juga tidak dirujuk di dalam file ELF, jadi libtree tidak bisa mengetahuinyaSebagai gantinya, kernel secara otomatis memetakannya ke ruang alamat proses yang baru dimulai. Ini adalah optimisasi untuk menghindari overhead system call pada fungsi seperti
gettimeofday. Referensi: https://man7.org/linux/man-pages/man7/vdso.7.htmlSaya pernah membuat skrip kecil yang berantakan untuk menjalankan
lddsecara rekursif demi mencari tahu apa saja yang harus disertakan agar bisa menjalankan binary closed-source di NixOSKalau harus melakukan hal seperti itu lagi, saya akan mencoba alat ini
Kelihatannya bagus!!