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