2009-11-13 28 views
8

से स्थिर रूप से जुड़े पुस्तकालयों को निकालें मुझे यकीन नहीं है कि यह भी संभव है, लेकिन निष्पादन योग्य फ़ाइल (foo.exe) दिया गया है, जिसमें कई पुस्तकालय हैं जो स्थिर रूप से जुड़े हुए हैं।निष्पादन योग्य

क्या कोई ऐसा सॉफ़्टवेयर है जो इस फ़ाइल से निकाला जाता है .lib (या .a) जो निष्पादन योग्य के अंदर रहता है?

धन्यवाद।

उत्तर

15

अविश्वसनीय रूप से असंभव है, आमतौर पर, आपको लाइब्रेरी की संपूर्ण सामग्री को आपके निष्पादन योग्य में इंजेक्शन नहीं मिलता है।

आप केवल सभी अपरिभाषित प्रतीकों को पूरा करने के लिए पर्याप्त हैं। यह वास्तव में पुस्तकालय का एक छोटा सा हिस्सा हो सकता है। एक पुस्तकालय में आम तौर पर ऑब्जेक्ट फ़ाइलों का एक सेट होता है, जिनमें से केवल आवश्यक हैं जो आपके निष्पादन योग्य में जुड़े होते हैं।

उदाहरण के लिए, यदि सी रनटाइम लाइब्रेरी में आपको केवल एक ही चीज कहा जाता है तो exit() था, तो आपके निष्पादन योग्य में printf() फ़ंक्शन का परिवार होने की संभावना नहीं होगी।

यदि आप सीधे ऑब्जेक्ट फ़ाइलों से जुड़े हैं, तो आपको एक मौका मिल सकता है, क्योंकि इन्हें शामिल किया जाएगा या नहीं (जब तक कि आपका लिंकर स्मार्ट नहीं है)।

लेकिन यह भी एक कठिन कार्य होगा क्योंकि निष्पादन योग्य में कोई जानकारी नहीं हो सकती है कि विशिष्ट ऑब्जेक्ट फ़ाइलों से कौन से कोड अनुभाग आए थे। यह संभावित रूप से करने योग्य है, लेकिन अगर कोई और तरीका है, तो मैं इसे पहले देख रहा हूं।

मुझे विशिष्ट प्रक्रिया स्पष्ट करते हैं:

  1. चार वस्तु फ़ाइलें, a.o, b.o, c.o और d.oa(), b(), c() और d() क्रमशः कार्य शामिल। वे सभीabcd.a संग्रह में जोड़े गए हैं।
  2. वे सभी स्टैंडअलोन (कोई निर्भरता नहीं) इस तथ्य को छोड़कर b()c() पर कॉल करते हैं।
  3. आपके पास एक मुख्य प्रोग्राम है जो a() और b() पर कॉल करता है और आप इसे संकलित करते हैं तो इसे abcd.a लाइब्रेरी से लिंक करें।
  4. लिंकर a.o और b.o पुस्तकालय से बाहर करने और अपने निष्पादन में, a() और b() के लिए की जरूरत को पूरा करने लेकिन c() के लिए एक की जरूरत को शुरू खींच लेता है, क्योंकि b() यह की जरूरत है।
  5. लिंकर तब c.o लाइब्रेरी से बाहर और आपके निष्पादन योग्य में ड्रग करता है, c() की आवश्यकता को पूरा करता है। अब सभी अपरिभाषित प्रतीक संतुष्ट हैं, निष्पादन योग्य किया जाता है और धूल दिया जाता है, आप तैयार होने पर इसे चला सकते हैं।

उस प्रक्रिया में किसी भी चरण में d.o आपके निष्पादन योग्य में खींच लिया गया था, इसलिए आपको इसे प्राप्त करने की शून्य उम्मीद है।

अद्यतन: पुन टिप्पणी मैं ऊपर बनाया "वहाँ एक और तरीका है, मुझे लगता है कि पहली पर विचार करना होता", तो आप सिर्फ अन्य उत्तर आप स्रोत है में से एक के लिए एक टिप्पणी में कहा गया है वह कोड जिसने पुस्तकालयों को निकाला है, जिसे आप निकालना चाहते हैं। मुझे पूछने की ज़रूरत है: आप उस स्रोत के साथ पुस्तकालयों का पुनर्निर्माण क्यों नहीं कर सकते?यह निष्पादन योग्य कोड के एक मोर से पुस्तकालयों को फिर से बनाने की कोशिश करने से मुझे एक बहुत आसान समाधान लगता है।

+0

परिदृश्य पर, कई कस्टम वस्तु फ़ाइलें उन्हें एक ही कस्टम लाइब्रेरी फ़ाइल में लिंक होते हैं, और। यदि सभी पुस्तकालय कस्टम हैं, तो क्या वे निष्पादन योग्य में "पूर्ण एम्बेडेड" नहीं हैं? असल में मैं स्रोत कोड प्राप्त नहीं करना चाहता, मैं केवल लाइब्रेरी फाइलें प्राप्त करना चाहता हूं। – HyLian

+0

यदि लाइब्रेरी में प्रत्येक ऑब्जेक्ट फ़ाइल को सभी अपरिभाषित प्रतीकों को पूरा करने के लिए आवश्यक है तो हाँ, वे सभी वहां होंगे। लेकिन यह जरूरी नहीं है कि मामला। – paxdiablo

+0

चलो वापस कदम। आपके पास .sl/.a फ़ाइलें क्यों नहीं हैं? – paxdiablo

-1

ऐसा लगता है कि आप एक डिकंपेलर के लिए पूछ रहे हैं। इस तरह के औजारों का उपयोग करना मुश्किल है (शायद हल्के ढंग से परिष्कृत सी ++ के लिए असंभव) और यदि आपकी समस्या को हल करने का कोई अन्य तरीका है, पुस्तकालयों को फिर से लिखने के लिए कुछ महीने लगाना, तो मैं उस कार्यवाही की सिफारिश करता हूं।

पैक्स की तरह इंगित किया गया है, भले ही आपने एक डिकंपेलर का उपयोग किया हो, आपको केवल लाइब्रेरी फ़ंक्शंस ही मिलेगा जिसे निष्पादन योग्य कहा जाता है।

+0

लेकिन मैं निष्पादन योग्य को पूरी तरह से अपनाना नहीं चाहता हूं, मुझे स्रोत कोड की आवश्यकता नहीं है, मुझे उस लाइब्रेरी फाइलों की आवश्यकता है जो उस निष्पादन योग्य में जुड़े हुए थे, और उस पुस्तकालयों के साथ एक और अलग निष्पादन योग्य लिंक करें। – HyLian

+0

क्या आपके पास लाइब्रेरी के लिए हेडर फाइलें हैं? –

+0

हां मेरे पास है, वास्तव में मेरे पास उन सभी स्रोत कोड हैं जो उन पुस्तकालयों को उत्पन्न करते हैं। – HyLian

1

कल्पना कीजिए कि भाषा में 10 किताबें हैं जिन्हें आप समझ नहीं सकते हैं, बिना कवर, शीर्षक पृष्ठ, पृष्ठ संख्या और अध्याय। कुछ किताबें अपूर्ण हो सकती हैं। सभी पेज एक साथ शफल हो गए हैं, इसलिए यह पता लगाना असंभव है कि प्रत्येक पुस्तक की शुरुआत और अंत कहां है। (प्रत्येक पृष्ठ एक फ़ंक्शन कॉल है) अब पुस्तक 5 के पेज 123 को खोजने का प्रयास करें (मान लीजिए कि यह उपरोक्त फ़ंक्शन से बाहर है())।

खैर, यह स्थिर लिंक है कि निष्पादन के अंदर फ़ाइलों पुस्तकालयों संभव है ...

+0

और आपके पास पुस्तक 5 के लिए मूल पांडुलिपि है। पांडुलिपि से केवल पुस्तक 5 को पुनर्मुद्रण करना निश्चित रूप से आसान है। –

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