मूल रूप से, यह एक में दो प्रश्न हैं - क्योंकि अगर मैं एक सिस्टम के भीतर निर्यात किए गए सभी प्रतीकों को उनके साझा पुस्तकालय पथ के साथ सूचीबद्ध कर सकता हूं, तो मैं बस 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
शेल) की एक सूची तैयार कर सकता है ।
क्या इस तरह का एक उपकरण लिनक्स के लिए मौजूद है?