2009-07-14 29 views
35

में उपयोग की गई स्थिर पुस्तकालयों की सूची प्राप्त करें क्योंकि ldd केवल गतिशील पुस्तकालयों को सूचीबद्ध करता है, क्या निष्पादन योग्य बनाने के लिए उपयोग की जाने वाली स्थिर पुस्तकालयों के बारे में जानकारी निकालने का कोई तरीका है?निष्पादन योग्य

उत्तर

35

ldd <exe filename> गतिशील पुस्तकालयों

nm <exe filename> फ़ाइल में प्रतीकों से पता चलता जुड़ा हुआ पता चलता है।

जो स्थिर पुस्तकालयों से आते हैं प्रतीकों उन पुस्तकालयों के खिलाफ nm चल आवश्यकता है उन में प्रतीक (काम करता है, आदि) की एक सूची प्राप्त करने के लिए, तो nm <exe filename> से प्रतीकों में से क्या अपनी सूची में उनकी तुलना देखने के लिए।

आप comm कमांड के साथ सूचियों की तुलना करते हैं। विवरण के लिए man comm देखें।

यह इस मंच here से लिया गया था।

+2

@Goz और anon बिंदु के रूप में, यह केवल तभी काम करता है जब बाइनरी को नहीं हटाया गया है/इसमें डिबगिंग जानकारी शामिल है। किसी स्थिर पुस्तकालय को किसी एप्लिकेशन में लिंक करने के बाद नाम आवश्यक नहीं हैं (और इसका उपयोग भी नहीं किया जाता है) - कॉल सभी पते से हैं। –

+0

यह सवाल का जवाब नहीं देता है। "उन पुस्तकालयों के खिलाफ एनएम चलाना" संभव नहीं है यदि आप पुस्तकालयों को नहीं जानते हैं; और वहाँ पुस्तकालयों को जोड़ने में अंतर्निहित रूप से उपयोग किया जाता है। – kavadias

+0

यदि यह एक अज्ञात बाइनरी है, तो हम नहीं जानते कि पुस्तकालय मौजूद हैं। तो "उन पुस्तकालयों के खिलाफ एनएम चलाना" स्वयं को पराजित करता है। – goldenmean

10

नहीं, लिंकिंग प्रक्रिया के दौरान पुस्तकालयों के नाम त्याग दिए जाते हैं। हालांकि, अगर आपके निष्पादन योग्य में डीबग जानकारी है (यानी यह -g ध्वज के साथ संकलित किया गया था), तो आप उससे जानकारी प्राप्त कर सकते हैं।

+0

क्या रॉ एएसएम को समझने का कोई तरीका नहीं है, या संकलक अनुकूलन और झंडे भी इससे प्रभावित होंगे? – MrMesees

5

जब तक कोई दिए गए कंपाइलर बाइनरी के अंदर किसी प्रकार का मेटा डेटा स्टोर नहीं करता है, तो नहीं। एक स्थिर पुस्तकालय कोड है जो सीधे बाइनरी में संकलित होता है।

6

यदि आपके पास स्रोत कोड है और इसके लिए सभी कोड नहीं जाना चाहते हैं, तो आप यह जानने के लिए संकलित करते समय मानचित्र फ़ाइल जेनरेट कर सकते हैं कि कौन से स्थिर पुस्तकालय जुड़े हुए हैं।

उदाहरण के लिए g++ -Xlinker -Map=a.map main.c, लिंक की गई स्थिर लाइब्रेरी जानकारी के लिए मानचित्र फ़ाइल देखें।

2

कुछ ELF निष्पादन योग्य के अंदर स्थिर पुस्तकालयों की सूची प्राप्त करने का कोई तरीका नहीं है।

क्योंकि लिंकर के लिए, एक स्थिर पुस्तकालय का उपयोग सदस्यों के "आलसी" सेट के रूप में किया जाता है। इसलिए परिणामी ईएलएफ निष्पादन योग्य में केवल लिंक करने के लिए आवश्यक सदस्यों को शामिल किया जाएगा। तो foo2.o जैसे libfoo.a जैसे सदस्य ऑब्जेक्ट फ़ाइल foo2.o निष्पादन योग्य में जुड़े हुए थे (बशर्ते foo2 में परिभाषित कुछ प्रतीक आवश्यक हैं, यानी कहीं संदर्भित किया गया है)।

बेशक

, nm, या objdump, या readelf, या strings कुछ ELF निष्पादन पर उपयोग करने में कुछ संकेत दे सकते हैं किस बारे में है क्योंकि आप प्रतीकों देखेंगे (स्थिर पुस्तकालयों से आने वाले उन सहित) इसके अंदर हैं, वस्तु फ़ाइलों उन स्थिर पुस्तकालयों (या उनके अंदर उपयोग किए जाने वाले शाब्दिक तार) में परिभाषित (सदस्यों) में परिभाषित किया गया है।

+1

आप किस तरह के संकेत का मतलब है? क्या आप उदाहरण दे सकते हैं? क्या आप मुझे स्रोत पर इंगित कर सकते हैं जहां मुझे इनमें से अधिक संकेत मिल सकते हैं? – stackoverflowwww

+1

उदाहरण के लिए रीडल्फ का उपयोग करना आपको बाइनरी में उपयोग किए जाने वाले फ़ंक्शंस, ऑब्जेक्ट्स, प्रतीकों को दिखाएगा। ये उपयोग किए गए पुस्तकालयों को खोजने के लिए संकेत के रूप में कार्य कर सकते हैं। उदाहरण के लिए आप वहां Curl_http फ़ंक्शन देख सकते हैं और जानते हैं कि libcurl का सबसे अधिक उपयोग बाइनरी द्वारा किया जाता है और यदि यह गतिशील रूप से लिंक नहीं किया गया है तो इसे स्थिर रूप से लिंक किया जाना चाहिए। – ohgodnotanotherone

संबंधित मुद्दे