2014-10-24 5 views
6

में .dynsym या .dynstr नहीं मिला। मैंने ltrace का उपयोग करने का प्रयास किया है। मैंने लाइब्रेरी को प्रोफाइल करने के लिए निम्न आदेश का उपयोग करने का प्रयास किया। इसलिए फ़ाइल जिसे sampleapp, ltrace -c -T --library=library.so --output=out.txt ./SampleApp प्रोग्राम द्वारा उपयोग किया जाता है। लेकिन यह उपर्युक्त त्रुटि दिखाता है। लेकिन लाइब्रेरी.सो एक डीबग बिल्ड है। तो प्रतीक तालिका वहाँ होना चाहिए। मैंने इसे objdump --source library.so | grep CreateSocket() के साथ सत्यापित करने का प्रयास किया है। यह कोड देता है जो CreateSocket() फ़ंक्शन का उपयोग करता है। जिसका अर्थ है कि इसमें एक प्रतीक तालिका है। यह त्रुटि क्यों होती है?ltrace: "library.so"

संबंधित पोस्ट: measure CPU usage per second of a dynamically linked library

उत्तर

0

यह निष्पादन योग्य SampleApp कैसे बनाया गया था पर निर्भर करता है। यदि आप स्थिर रूप से जुड़े थे तो आप उस त्रुटि को देखेंगे। ltrace केवल गतिशील रूप से जुड़े अनुप्रयोगों के लिए काम करता है।

साझा ऑब्जेक्ट निर्भरताओं को दिखाने के लिए आप ldd SampleApp चला सकते हैं। यह गतिशील रूप से जुड़ा हुआ है और libc करने के लिए एक निर्भरता किया गया था है, ldd के उत्पादन में इस तरह की एक पंक्ति में शामिल होंगे:

libc.so.6 => /usr/lib/libc.so.6 (0x00007fb24ac53000) 

उस मामले में, आप ltrace विकल्प --library=libc.so.6 उपयोग कर सकते हैं और यह काम करना चाहिए। हालांकि, --library=libc.so मेल नहीं खाएगा (आपको कोई त्रुटि नहीं मिलेगी, लेकिन कोई लाइब्रेरी कॉल मेल नहीं खाया जाएगा)।

जब स्थिर जुड़ा हुआ है, ldd SampleApp बजाय इस उत्पादन दिखाएगा:

not a dynamic executable 

मेरा अनुमान है कि यह स्थिर जोड़ने की वजह से गलत जा सकता है। महत्वपूर्ण बिंदु, हालांकि, यह है कि यदि ltrace इस त्रुटि को दिखाता है, तो आपको निष्पादन योग्य (बाइनरी) पर निदान शुरू करना होगा और यह कैसे बनाया गया था (लिंकर विकल्प), साझा लाइब्रेरी पर नहीं।

प्रश्न How does ltrace (library tracing tool) work? में लेट्रेस के आंतरिक के बारे में अधिक समझने के लिए कुछ अच्छे संदर्भ हैं।