- libtree एक ऐसा टूल है जो
lddके आउटपुट को ट्री में बदलता है और यह समझाता है कि shared library कैसे खोजी गई, या वह क्यों नहीं मिल रही है - डिफ़ॉल्ट आउटपुट में कुछ standard dependencies छिपी रहती हैं, और
-v,-vv,-vvvके साथ छिपी हुई लाइब्रेरियाँ तथा पहले से मिल चुकी लाइब्रेरियों की dependencies को चरणबद्ध तरीके से देखा जा सकता है --pathया-psoname की जगह path दिखाता है, और--max-depthसे recursive खोज की गहराई सीमित की जा सकती है- इंस्टॉलेशन v3.1.1 prebuilt binaries, Fedora/RHEL/CentOS, Ubuntu 22.04+, और GNU Guix के ज़रिए किया जा सकता है
- source build के लिए C99 समझने वाला C compiler चाहिए, और
makeइस्तेमाल करते समयLDFLAGS=-staticकी सिफारिश की जाती है
libtree क्या करता है
- libtree एक टूल है जो
lddको ट्री के रूप में बदलता है - यह समझाता है कि shared library कैसे खोजी जाती है, या उसका location क्यों नहीं मिल पाता
- README में
doc/screenshot.pngका screenshot शामिल है
आउटपुट विकल्प
- डिफ़ॉल्ट आउटपुट में कुछ standard dependencies दिखाई नहीं जातीं
- अधिक विस्तृत आउटपुट verbosity options से नियंत्रित होता है
libtree -v: वे लाइब्रेरियाँ दिखाता है जिन्हें डिफ़ॉल्ट रूप से छोड़ दिया जाता हैlibtree -vv: डिफ़ॉल्ट रूप से छोड़ी जाने वाली लाइब्रेरियों की dependencies भी दिखाता हैlibtree -vvv: पहले से मिल चुकी लाइब्रेरियों की dependencies भी दिखाता है
--pathया-pफ्लैग soname की जगह path दिखाता है- उदाहरण:
libtree -p $(which tar)
- उदाहरण:
--max-depthrecursive depth को सीमित करता है
इंस्टॉल करने का तरीका
- Prebuilt binaries for v3.1.1: Linux के लिए prebuilt binaries उपलब्ध हैं
- Fedora / RHEL / CentOS में
dnfसे इंस्टॉल करें- RHEL और उससे निकले distributions में पहले
epel-releaseको सक्षम करें dnf install libtree-ldd
- RHEL और उससे निकले distributions में पहले
- Ubuntu 22.04+ में
apt-get install libtreeसे इंस्टॉल करें - GNU Guix में
guix install libtreeसे इंस्टॉल करें - Older release v2.0.0 भी उपलब्ध है
source से build करना
libtreeके लिए C99 समझने वाला C compiler चाहिए- बेसिक build प्रक्रिया में repository clone करने के बाद
makeचलाया जाता हैgit clone https://github.com/haampie/libtree.gitcd libtreemake
makeइस्तेमाल करते समयLDFLAGS=-staticकी सिफारिश की जाती है- README में
curlसेlibtree.cडाउनलोड करके compile करने वाला unsafe quick install कमांड भी अलग fold section में दिया गया है
2 टिप्पणियां
Hacker News की राय
क्या यह टूल भी
lddके उस अनपेक्षित व्यवहार को वैसे ही अपनाता है, जिसमें वह जांची जा रही लाइब्रेरी के कुछ हिस्सों को सचमुच execute कर देता है?https://catonmat.net/ldd-arbitrary-code-execution
lddversions target binary को execute नहीं करतेसंदर्भ: https://manpages.debian.org/unstable/manpages/ldd.1.en.html#...
असल में यह ELF file को सीधे parse करता है, और dependencies को भी recursively parse करता दिखता है, इसलिए काफी बढ़िया है
objdumpइस्तेमाल करने पर ELF file में encoded data जैसा है वैसा output कर देता हैइसमें vdso द्वारा खोजी जाने वाली libraries की सूची भी शामिल होती है
ऐसा ही एक टूल lddtree भी है
https://github.com/gentoo/pax-utils/tree/master
lddसे छूटी हुई dependency को recursively बार-बार trace करना काफी उबाऊ होता हैइसलिए यह अच्छा सुधार लगता है, और अगली बार कोई अस्पष्ट
not foundमिले तो मैं इसे आजमाऊंगामूल रूप से यह Linux CLI version का depends.exe जैसा है
इसके बजाय https://github.com/lucasg/Dependencies इस्तेमाल करना बेहतर है। यह भी पूरी तरह up-to-date नहीं है, लेकिन…
अगर आपने Visual Studio install किया है और installer में
x64/x86 build tools (latest)चुना है, तो VS Developer Command Prompt मेंdumpbin /dependentsचलाना अब भी सबसे भरोसेमंद विकल्प है[1] https://www.dependencywalker.com/
जो लोग जानना चाहते हैं कि colors का क्या मतलब है, उनके लिए लिख देता हूं; manpage/README में मुझे नहीं मिला
मैजेंटा: exclude list में है, सिर्फ
-v[v[v]]में दिखता हैनीला: पहले देखा जा चुका item है, इसलिए कई बार आने वाली dependency पहचानी जा सकती है
“लाइब्रेरी क्यों मिलती है या नहीं मिलती” का मतलब क्या है? या तो वह
LD_LIBRARY_PATHमें होती है या नहीं होती, बस यही नहीं?screenshot देखकर समझ नहीं आ रहा कि यह किस ओर इशारा कर रहा है
system search paths, runpath, rpath,
LD_LIBRARY_PATHआदि अलग-अलग directory search methods होते हैंlibraries आम तौर पर
foo.soजैसे छोटे नाम से link होती हैं, लेकिन library के full path से भी dynamic link हो सकती हैंसाथ ही, सामान्य तौर पर
LD_LIBRARY_PATHsetting से बच सकें तो बचना बेहतर है। हमेशा संभव नहीं होता, लेकिन set करने पर यह हर execution में search priority में सबसे ऊपर आ जाती है। भले ही कोई चीज library के full path से dynamically linked हो,LD_LIBRARY_PATHpriority ले लेता है और search method को पूरी तरह flat बना देता हैLD_LIBRARY_PATHके अंदर होना जरूरी नहीं हैtitle का मुद्दा यह है कि libtree executable से सभी direct और indirect dependencies तक जाने वाला path आसानी से खोजने देता है। इसका एक use missing dependency की समस्या समझने में मदद करना है
असल में अगर आप package system इस्तेमाल कर रहे हैं, तो dependency missing होना बहुत आम नहीं होगा, इसलिए libtree का इस्तेमाल शायद किसी और वजह से होगा
LD_LIBRARY_PATHमें होने या न होने की नहीं है; हर library के लिए load time पर evaluate होने वाला RPATH भी होता हैबड़ा point यह है कि dependencies एक graph बनाती हैं, और इसे tree की तरह दिखाया जा सकता है। यह जानना उपयोगी है कि किस library की जरूरत वाली कौन-सी library के कारण कोई खास library नहीं मिल रही
LD_LIBRARY_PATHसे नहीं मिलतीं। loader library खोजने के लिए कई अलग-अलग sources भी consider करता हैnormal setup में यह load हो रही हर binary के सामान्य ELF fields और loader को पता अन्य paths का combination होता है
ऐसी systems में जहां same library के कई versions या same name की कई libraries हों,
LD_LIBRARY_PATHपर निर्भर रहना बहुत short-sighted हो सकता है। loader हर binary के लिएLD_LIBRARY_PATHके paths को क्रम से search करता है और पहली matching library चुनता है। अगर आपने किसी और तरीके से higher-priority path set नहीं किया है, तो वह library असल में वही न भी हो सकती है जो आप चाहते हैं, और runtime पर unexpected errors हो सकते हैंबेहतर तरीका यह है कि उस binary को जिन libraries की जरूरत है, जहां वे मौजूद हैं, वहां के लिए RPATH set किया जाए
अगर environment और RPATH settings consistent नहीं हैं, तो same library के कई versions साथ-साथ load हो सकते हैं। यह टूल यह समझने में मदद करता है कि समस्या है या नहीं, और क्यों
LD_LIBRARY_PATHतो हैंयह टूल
lddbased है, इसलिए शायदDYLD_LIBRARY_PATH,DYLD_FALLBACK_FRAMEWORK_PATH,DYLD_FALLBACK_LIBRARY_PATH,@executable_path,@loader_path,@rpathभी interpret करेगासच में उपयोगी है। आम तौर पर असली requirements क्या हैं यह जानने के लिए मैं
readelfसे sections पढ़ता हूंक्या
LD_DEBUG=libsकाफी नहीं है?पता नहीं यह bug है या नहीं, लेकिन vim example में
lddऔर libtree अलग-अलग libraries दिखाते हैंउदाहरण के लिए
linux-vdso.so.1lddमें list के सबसे ऊपर आता है, लेकिन libtree में बिल्कुल नहीं दिखताlinux-vdso.so.1कोई actual library नहीं है जिसे file system में कहीं खोजा जा सके, और ELF file के अंदर भी इसका reference नहीं होता, इसलिए libtree इसे नहीं जान सकताइसके बजाय kernel newly started process के address space में इसे automatically map करता है। यह
gettimeofdayजैसे functions में system call overhead से बचने के लिए optimization है। संदर्भ: https://man7.org/linux/man-pages/man7/vdso.7.htmlNixOS पर closed-source binary चलाने के लिए क्या include करना है यह पता लगाने के लिए मैंने कभी
lddको recursively चलाने वाली एक गड़बड़-सी छोटी script बनाई थीअगर फिर कभी ऐसा करना पड़ा, तो इस टूल को एक बार आजमाऊंगा
अच्छा लग रहा है!!