2016-06-05 6 views
6

यदि लाइब्रेरी फ़ंक्शन जैसे उदा। malloc को फिर से कार्यान्वित किया गया है, फिर उस नाम के साथ दो प्रतीक हैं, एक स्थानीय ऑब्जेक्ट फ़ाइल में से एक और सिस्टम लाइब्रेरी में से एक है। जब से कोई फ़ंक्शन उदा। stdio का उपयोग किया जाता है, जो malloc (और क्यों) कहता है?यदि एक मानक लाइब्रेरी फ़ंक्शन को फिर से कार्यान्वित किया जाता है, तो दोनों में से कौन सा कहलाता है?

+0

पारंपरिक मॉडल इस जगह 'malloc' भी आंतरिक संदर्भ के लिए, कि मॉड्यूल और बाद में जोड़ने के क्रम में पुस्तकालयों पहले वाले ओवरराइड है। निस्संदेह जटिलताएं हो सकती हैं, जैसे मैक्रो रैपर ट्रेसिंग जानकारी जोड़ना, या आवंटकों को अतिरिक्त संकेत प्रदान करने वाले आंतरिक रूपों का उपयोग। – doynax

+0

अगर मैं समझता हूं कि सही है तो इसका मतलब यह होगा कि आमतौर पर सिस्टम लाइब्रेरी प्रतीक का उपयोग किया जाएगा। लेकिन परीक्षणों से पता चलता है कि स्थानीय फ़ंक्शन (पुन: कार्यान्वयन) का उपयोग इसके बजाय किया जाता है। – user3224237

+0

यह दूसरी तरफ है। ऑब्जेक्ट फाइलें सूचीबद्ध सूची में पुस्तकालयों से पहले पिछली बार लिंक की गई हैं। – doynax

उत्तर

3

लिंक व्यवहार एक सामान्य तरीके से, यह है:

  • सभी प्रतीकों वस्तु फ़ाइलों में परिभाषित शामिल करें।
  • फिर libs में वस्तुओं का उपयोग कर अपरिभाषित लोगों को हल।

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

एक और तरीका है, गुंजाइश के रूप में जीएनयू binutils पर विचार, पुस्तकालय कार्यों ओवरराइड करने के लिए --wrap पैरामीटर का उपयोग कर समारोह रैप करने के लिए है: https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html

--wrap ld विकल्प हम दोनों कार्यों से जुड़ा हुआ हो सकता है का उपयोग करके और रैपर फ़ंक्शन लपेटकर कॉल करने में सक्षम होगा।

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

-1

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

एक और जवाब है कि आप अपरिभाषित व्यवहार लागू कर रहे हैं, और संभावना परिणाम malloc समारोह बुलाया जाएगा कि है कि आप सबसे अधिक नुकसान होगा है। यदि आप भाग्यशाली हैं, जबकि विकासशील हैं। यदि आपका कोड कम भाग्यशाली है, तो आपका कोड ग्राहकों के हाथ में है। ऐसा मत करो

नए नामों से malloc आसपास रैपर लेखन काफी खराब है। मॉलोक को बदलने की कोशिश करना पागलपन है।

+0

दुर्भाग्यवश, कोई वास्तविक विकल्प नहीं है। पोर्ट करने के लिए एक उपकरण 'sbrk' * और * मानक लाइब्रेरी फ़ंक्शंस का उपयोग कर रहा है। यह आज के सिस्टम पर काम नहीं कर सकता है। तो या तो sbrk प्रतिस्थापित किया गया है (अधिकांश टूल कोड को फिर से लिखना है), या एक स्थानीय मॉलोक प्रदान किया जाता है, जो 'sbrk' का उपयोग नहीं करता है। एक समस्या बाकी है: स्थानीय मॉलोक एएसएएन के साथ काम नहीं करता है, भले ही वह स्थानीय मॉलोक सही लगता है। वर्तमान में यह अस्पष्ट है, क्यों यह एएसएएन के साथ काम नहीं करता है। – user3224237

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

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