Libtree: Kütüphane bulunma durumunu ağaç biçiminde açıklayan `ldd`
(github.com/haampie)- libtree,
lddçıktısını bir ağaca dönüştüren ve paylaşılan kütüphanelerin nasıl bulunduğunu ya da neden bulunamadığını açıklayan bir araçtır - Varsayılan çıktıda bazı standart bağımlılıkları gizler;
-v,-vv,-vvvile gizli kütüphaneleri ve daha önce karşılaşılan kütüphanelerin bağımlılıklarını kademeli olarak görebilirsiniz --pathveya-p, soname yerine yolu gösterir;--max-depthile özyinelemeli arama derinliği sınırlandırılabilir- Kurulum, v3.1.1 önceden derlenmiş ikili dosyaları, Fedora/RHEL/CentOS, Ubuntu 22.04+ ve GNU Guix üzerinden yapılabilir
- Kaynaktan derleme için C99 anlayan bir C derleyicisi gerekir;
makekullanılırkenLDFLAGS=-staticönerilir
libtree ne yapar
- libtree,
lddçıktısını ağaç biçimine dönüştüren bir araçtır - Paylaşılan kütüphanelerin nasıl bulunduğunu ya da neden konumlarının tespit edilemediğini açıklar
- README içinde
doc/screenshot.pngekran görüntüsü yer alır
Çıktı seçenekleri
- Varsayılan çıktıda bazı standart bağımlılıklar gösterilmez
- Daha ayrıntılı çıktı, verbosity seçenekleriyle kontrol edilir
libtree -v: Varsayılan olarak atlanan kütüphaneleri gösterirlibtree -vv: Varsayılan olarak atlanan kütüphanelerin bağımlılıklarını da gösterirlibtree -vvv: Daha önce karşılaşılan kütüphanelerin bağımlılıklarını da gösterir
--pathveya-pbayrağı, soname yerine yolu gösterir- Örnek:
libtree -p $(which tar)
- Örnek:
--max-depth, özyineleme derinliğini sınırlar
Kurulum yöntemleri
- Prebuilt binaries for v3.1.1: Linux için önceden derlenmiş ikili dosyalar sunar
- Fedora / RHEL / CentOS üzerinde
dnfile kurulur- RHEL ve türev dağıtımlarda önce
epel-releaseetkinleştirilmelidir dnf install libtree-ldd
- RHEL ve türev dağıtımlarda önce
- Ubuntu 22.04+ üzerinde
apt-get install libtreeile kurulur - GNU Guix üzerinde
guix install libtreeile kurulur - Older release v2.0.0 da sunulmaktadır
Kaynaktan derleme
libtree, C99 anlayan bir C derleyicisi gerektirir- Temel derleme adımları, depoyu klonlayıp ardından
makeçalıştırmaktırgit clone https://github.com/haampie/libtree.gitcd libtreemake
makekullanılırkenLDFLAGS=-staticönerilir- README içinde,
curlilelibtree.cindirip derlemeye yönelik unsafe quick install komutu da ayrı bir katlanır bölümde sunulur
2 yorum
Hacker News yorumları
Bu araç da
ldd’nin, denetlenen kütüphanelerin bir kısmını gerçekten çalıştırıveren beklenmedik davranışını aynen izliyor mu?https://catonmat.net/ldd-arbitrary-code-execution
lddsürümleri hedef ikiliyi çalıştırmıyorReferans: https://manpages.debian.org/unstable/manpages/ldd.1.en.html#...
Aslında ELF dosyasını doğrudan ayrıştırıyor ve bağımlılıkları da özyinelemeli olarak ayrıştırıyor gibi; bu oldukça güzel
objdumpkullanırsanız verileri ELF dosyasında kodlandığı haliyle çıktılarvdso’nun arayacağı kütüphane listesi bile buna dahil
Benzer bir araç olarak lddtree var
https://github.com/gentoo/pax-utils/tree/master
Eksik bağımlılıkları
lddile özyinelemeli şekilde tekrar tekrar izlemek epey sıkıcıBu yüzden bu iyi bir iyileştirme gibi görünüyor; bir dahaki belirsiz
not founddurumunda denemeyi düşünüyorumTemelde depends.exe’nin Linux CLI sürümü gibi
Onun yerine https://github.com/lucasg/Dependencies kullanmak daha iyi. O da tamamen güncel sayılmaz ama…
Visual Studio kuruluysa ve kurulum yöneticisinde
x64/x86 build tools (latest)seçildiyse, VS Developer Command Prompt’tadumpbin /dependentsçalıştırmak hâlâ en güvenilir seçenek[1] https://www.dependencywalker.com/
Renklerin ne anlama geldiğini merak edenler için yazayım; manpage/README’de bulamadım
macenta: dışlama listesinde, yalnızca
-v[v[v]]ile gösteriliyormavi: daha önce görülmüş öğe; böylece birden fazla kez görünen bağımlılıkları bulabilirsiniz
“Kütüphanenin neden bulunup bulunmadığı” ne demek? Ya
LD_LIBRARY_PATHiçindedir ya değildir, değil mi?Sadece ekran görüntüsüne bakınca bunun neyi kastettiğini pek anlayamadım
Sistem arama yolları, runpath, rpath,
LD_LIBRARY_PATHvb. farklı dizin arama yöntemleri varKütüphaneler genelde
foo.sogibi kısa adlarla bağlanır, ama kütüphanenin tam yolu ile dinamik olarak bağlanmaları da mümkünEk olarak, genel olarak
LD_LIBRARY_PATHayarlamaktan kaçınabiliyorsanız kaçınmak çok daha iyidir. Her zaman mümkün değildir ama ayarladığınızda tüm çalıştırmalarda arama önceliğinin en üstüne çıkar. Bir şey kütüphanenin tam yolu ile dinamik bağlanmış olsa bileLD_LIBRARY_PATHöncelik kazanır ve arama yöntemini tamamen düzleştirirLD_LIBRARY_PATHiçinde olması gerekmezBaşlıktaki ana fikir, libtree’nin yürütülebilir dosyadan tüm doğrudan ve dolaylı bağımlılıklara giden yolu kolayca bulmanızı sağlaması. Kullanım alanlarından biri de eksik bağımlılık sorunlarını anlamaya yardımcı olması
Gerçekte bir paket sistemi kullanıyorsanız bağımlılıkların eksik olması pek olası değildir; bu yüzden libtree’yi muhtemelen başka nedenlerle kullanırsınız
LD_LIBRARY_PATHiçinde olup olmaması değil; her kütüphane için yükleme anında değerlendirilen RPATH de varDaha büyük nokta şu: bağımlılıklar bir grafik oluşturur ve bu, ağaç gibi gösterilebilir. Belirli bir kütüphanenin bulunamamasına hangi kütüphanenin onu gerektirmesinin yol açtığını bilmek yararlıdır
LD_LIBRARY_PATHile bulunmaz. Yükleyici, kütüphaneleri bulmak için başka birçok kaynağı da dikkate alırNormal bir yapılandırmada bu, yüklenen her ikilinin genel ELF alanları ile yükleyicinin bildiği diğer yolların birleşimidir
Aynı kütüphanenin birden çok sürümünün veya aynı ada sahip birden çok kütüphanenin olduğu sistemlerde
LD_LIBRARY_PATH’e güvenmek çok dar görüşlü olabilir. Yükleyici her ikili içinLD_LIBRARY_PATHiçindeki yolları sırayla arar ve eşleşen ilk kütüphaneyi seçer. Başka bir yöntemle daha yüksek öncelikli yollar ayarlamadıysanız, bu kütüphane aslında istediğiniz şey olmayabilir ve çalışma zamanında beklenmeyen hatalara yol açabilirDaha iyi yöntem, ilgili ikili için gereken kütüphanelerin bulunduğu konuma RPATH ayarlamaktır
Ortam ve RPATH ayarları tutarsızsa aynı kütüphanenin birden çok sürümünü aynı anda yüklemeniz de mümkün. Bu araç, bir sorun olup olmadığını ve nedenini anlamaya yardımcı olur
LD_LIBRARY_PATHvarBu araç
lddtabanlı olduğundan muhtemelenDYLD_LIBRARY_PATH,DYLD_FALLBACK_FRAMEWORK_PATH,DYLD_FALLBACK_LIBRARY_PATH,@executable_path,@loader_path,@rpathöğelerini de çözümlerGerçekten yararlı. Genelde asıl gereksinimlerin ne olduğunu anlamak için
readelfile bölümleri okurumLD_DEBUG=libsyetmiyor mu?Hata mı bilmiyorum ama vim örneğinde
lddve libtree farklı kütüphaneler gösteriyorÖrneğin
linux-vdso.so.1,lddçıktısında listenin en üstünde görünüyor ama libtree’de hiç yoklinux-vdso.so.1, dosya sisteminde bir yerde bulunabilecek gerçek bir kütüphane değildir ve ELF dosyasında da referans verilmez; bu yüzden libtree bunu bilemezBunun yerine çekirdek, yeni başlatılan sürecin adres alanına otomatik olarak eşler.
gettimeofdaygibi işlevlerde sistem çağrısı ek yükünden kaçınmaya yönelik bir optimizasyondur. Referans: https://man7.org/linux/man-pages/man7/vdso.7.htmlNixOS’ta kapalı kaynak bir ikiliyi çalıştırmak için neleri dahil etmem gerektiğini anlamak amacıyla
ldd’yi özyinelemeli çalıştıran berbat küçük bir betik yazmıştımTekrar böyle bir şey yapmam gerekirse bu aracı denemeyi düşünüyorum
Güzel görünüyor!!