पता लगाएं कि एक साझा लाइब्रेरी प्रतीक एक लाइव सिस्टम पर परिभाषित कहां है / एक सिस्टम पर निर्यात किए गए सभी प्रतीकों को सूचीबद्ध करता है


21

मूल रूप से, यह एक में दो प्रश्न हैं - क्योंकि अगर मैं एक सिस्टम के भीतर निर्यात किए गए सभी प्रतीकों को उनके साझा पुस्तकालय पथ के साथ सूचीबद्ध कर सकता हूं, तो मैं बस grepउस आउटपुट को प्राप्त कर सकता हूं ।

कर्नेल प्रतीकों के लिए, मुझे लगता है कि यह कुछ आसान है - क्योंकि हम हमेशा cat /proc/kallsymsस्मृति में लोड किए गए उन मॉड्यूल के सभी प्रतीकों की सूची प्राप्त कर सकते हैं ; फिर sudo cat /proc/modulesअपने पते के साथ लोड किए गए मॉड्यूल की एक सूची देगा, लेकिन उन रास्तों पर नहीं जहां मॉड्यूल लोड किए गए हैं (यदि वे अलग-अलग, आउट-ऑफ-ट्री .ko ऑब्जेक्ट्स के रूप में निर्मित होते हैं)।

उदाहरण के लिए, मैं इस कार्यक्रम kstका उपयोग करने की कोशिश करता हूं ltrace:

$ ltrace kst2
...
_ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0, 0xbfe631a8, 0x823652b, 0xbfe63298) = 0xa1ce854
__dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298)     = 0xa1ce800
_ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce854
__dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298)     = 0xa1ce800
...

... और मैं जानना चाहूंगा कि यह कहां _ZNK13QGraphicsItem10parentItemEvरहता है।

तो, साझा पुस्तकालय प्रतीकों के बारे में क्या करना है? [Gcc-help] के माध्यम से पढ़ना : उस पुस्तकालय को खोजना जिसमें प्रतीक परिभाषित किया गया है। ; मैंने कुछ इस तरह की कोशिश की:

$ find /usr/lib -name '*.so*' -exec nm --print-file-name --defined-only --dynamic {} \; | grep "QGraphicsItem"
...
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
/usr/lib/libQtGui.so.4.7.2:00766aa0 T _Zls6QDebugN13QGraphicsItem18GraphicsItemChangeE
/usr/lib/libQtGui.so.4.7.2:00767e80 T _Zls6QDebugP13QGraphicsItem
...

... लेकिन इससे मुझे अतिरिक्त समस्याएं मिलती हैं: मुझे वास्तव में उन सभी रास्तों का पता नहीं है जो मेरे सिस्टम पर साझा पुस्तकालयों के लिए स्कैन किए गए हैं, इसलिए जब मैंने पहली बार कोशिश की तो find /lib ...यह कुछ भी नहीं मिला; मुझे निर्देशिकाओं के इस अनुमान से चिढ़ है, साथ ही साथ विकल्प: संपूर्ण रूट फाइलसिस्टम को स्कैन करना find... और साथ ही, मुझे * हिट करना प्रतीत nmहोता है।। काफी त्रुटि संदेश का उत्पादन (जो मुझे भी पसंद नहीं है)।

बात यह है - ldd(या ld?) शायद प्रतीकों के इस लुकअप में से कुछ करता है, लेकिन मैंने संबंधित मैनपेज की कोशिश की, और मैं कमांड लाइन से किसी भी प्रतीक को "खोजने" का एक तरीका नहीं देख सकता, बिना किसी प्रकार की निष्पादन योग्य फ़ाइल के तर्क। साइड सवाल - क्या उसके लिए इन उपकरणों का उपयोग करने का कोई तरीका होगा?

तो, मैं एक कमांड लाइन टूल की तलाश में हूं, जो कुछ इस तरह का व्यवहार करेगा (छद्मकोश):

$ ./findsymbol '_Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE'
symbol found in:
    /usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
...

... जहाँ मैं खोज करने के लिए कोई निर्देशिका निर्दिष्ट नहीं करता - लेकिन जो भी संभालता है, जैसे LD_PRELOADया LD_LIBRARY_PATH; कहो तो मैं करूँ:

$ LD_PRELOAD="/path/to/mylib.so" ./findsymbol '*mylib_print*'

... तो मुझे वह स्थान मिलेगा /path/to/mylib.soजहां दिए गए प्रतीक को परिभाषित किया गया था (यह देखते हुए कि ऐसा प्रतीक मानक पुस्तकालयों में मौजूद नहीं होगा) - और आउटपुट "नहीं मिला" अन्यथा। और अन्यथा, ./findsymbol --dumpallसभी उपलब्ध प्रतीकों और किसी दिए गए वातावरण से देखे गए स्थानों (जैसे एक विशिष्ट bashशेल) की एक सूची तैयार कर सकता है ।

क्या इस तरह का एक उपकरण लिनक्स के लिए मौजूद है?

जवाबों:


16

पुस्तकालयों को देखने के लिए पथ को फ़ाइल में सूचीबद्ध किया जाएगा /etc/ld.so.conf, पर्यावरण चर LD_LIBRARY_PATHऔर किसी भी RPATH को ELF बाइनरी में एन्कोड किया गया है। कार्यक्रम lddआपको बताएगा कि एक विशिष्ट एप्लिकेशन किन पुस्तकालयों को लोड करेगा।

एक बार जब आपके पास एक प्रतीक होता है जिसके बारे में आप उत्सुक होते हैं, तो आप प्रोग्राम nmका उपयोग प्रतीकों .oऔर .aफ़ाइलों के readelfप्रतीकों को डंप करने के लिए .soया किसी योगिनी निष्पादन योग्य से डंप करने के लिए कर सकते हैं ।

उदाहरण:

nm -g /usr/lib/blah.a
readelf -Ws /usr/lib/blah.so

और अंत में, उस पृष्ठभूमि के साथ, यहाँ आपकी पवित्र कब्र है:

प्रतीक को देखते हुए _ZN6Kopete6Global10PropertiesC2Ev, यह कहां है?

scanelf -l -s _ZN6Kopete6Global10PropertiesC2Ev | grep _ZN6Kopete6Global10PropertiesC2Ev

कौन सी पैदावार:

ET_DYN _ZN6Kopete6Global10PropertiesC2Ev /usr/lib64/libkopete.so.4.11.4

-lध्वज में dirs खोज करने के लिए कहते हैं /etc/ld.so.confऔर -sनिर्दिष्ट प्रतीक खोजने के लिए।


यह अधूरा है: कुछ प्रोग्राम एप्लिकेशन-विशिष्ट निर्देशिकाओं से पुस्तकालयों को लोड करते हैं।
गिलेस एसओ- बुराई को रोकना '

2
@Gilles scanelfआपको खोज करने के लिए विशिष्ट निर्देशिकाओं को निर्दिष्ट करने और पुनरावर्ती seaching का समर्थन करने की अनुमति देता है -rताकि आप इसके खोज पथ को घुमा सकें या बहुत अधिक परेशानी के बिना अपने पूरे सिस्टम को खोज सकें। उदाहरण के लिए scanelf -r -s SYMBOL /lib/* /usr/* /opt/*, अधिकांश ऐसे स्थान मिल जाएंगे जहां पुस्तकालय छिप रहे हैं।
केसी

7

GNU सिस्टम पर (GNU libc डायनामिक लिंकर का उपयोग करते समय), आप अपना प्रोग्राम निम्नानुसार चला सकते हैं:

LD_DEBUG=bindings kst2

यह पता लगाने के लिए कि प्रतीक कहां हल करते हैं।


0

मैंने कई बार इसे चलाया है, एक लिनक्स सिस्टम से दूसरे कोड को पोर्ट करने की कोशिश करते हुए। आमतौर पर मैं सभी मानक निर्देशिकाओं को समाप्त करता हूं। मुझे गुगली कुछ भी नहीं मिली। तो यहाँ एक त्वरित स्क्रिप्ट है:

edt11x / findinsharedlibs

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.