2011-10-25 22 views
5

मैं प्रोग्रामिंग रूप से लिनक्स और सोलारिस पर अपनी बाइनरी से जुड़े साझा पुस्तकालयों की एक सूची प्राप्त करना चाहता हूं। अभी मैं pmap के लिए बाहर खोल (मैं द्विआधारी पर ldd उपयोग नहीं कर सकते क्योंकि यह dlopen'd पुस्तकालयों शामिल नहीं किया जाएगा, और मैं pldd उपयोग नहीं कर सकते क्योंकि यह सोलारिस केवल है):सी ++ से निष्पादन योग्य साझा लाइब्रेरी सूची कैसे प्राप्त करें?

std::ostringstream cmd; 
cmd << "/usr/bin/pmap " << getpid() << " | awk '{ print $NF }' | grep '\\.so' | sort -u"; 
FILE* p = popen(cmd.str().c_str(), "r"); 

यह वह जगह है थोड़ा सा हैक लेकिन यह सोलारिस और लिनक्स दोनों पर काम करता है (pmap आउटपुट थोड़ा अलग है लेकिन वांछित जानकारी हमेशा अंतिम कॉलम में होती है)। क्या बिना किसी जानकारी के एक ही जानकारी प्राप्त करने का कोई तरीका है? यह दोनों प्लेटफार्मों पर काम करता है? मुझे लगता है कि /proc/$PID फ़ाइलों को उनके बीच अलग रूप से स्वरूपित किया गया है, लेकिन मुझे नहीं पता कि हेडर उन लोगों को पार्स करने में सहायता के लिए कहां स्थित हैं (यदि कोई सामान्य स्थान है?)।

+0

कड़ाई से बोलने 'dlopen'ed पुस्तकालय "लिंक नहीं" हैं, वे रनटाइम पर लोड हो जाते हैं। मुझे लगता है कि आप वास्तव में सभी भारित साझा पुस्तकालयों की एक सूची चाहते हैं? –

+0

यह सही है। –

उत्तर

2

आप कमांड 1234 के साथ एक प्रक्रिया आईडी होने के साथ उपयोग कर सकते हैं।

अपने प्रोग्राम के अंदर से, सरल तरीका (लिनक्स-विशिष्ट) /proc/self/maps फ़ाइल को पढ़ने और विश्लेषण करना है।

cat /proc/self/maps

लिनक्स के तहत

चलाने की कोशिश करें: यह आप इस प्रक्रिया की स्मृति मानचित्रण ऊपर cat आदेश चलाकर दिखाई देगा।

और यदि आपके पास कुछ सटीक सूचक है, तो आप किस गतिशील पुस्तकालय के बारे में जानकारी प्राप्त करने के लिए dladdr (एक जीएनयू/लिनक्स या ग्लिब विशिष्ट कार्य) का उपयोग कर सकते हैं।