2011-04-04 10 views

उत्तर

5

जीसीसी उसे नहीं जानता है। यह जानता है कि एक समारोह printf है और यह जानता है कि इसे कैसे कॉल करें, लेकिन ऑब्जेक्ट फ़ाइल उत्पन्न करता है जिसमें एक अनसुलझे प्रतीक को कॉल किया जाता है।

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

+0

यह कैसे पता चलता है कि 'printf' को स्थिर रूप से हल किया जाना चाहिए (लिंक समय) या गतिशील रूप से (रन टाइम)? –

+0

कंपाइलर 'printf' पर कॉल के लिए प्लेसहोल्डर छोड़ देता है। इस बारे में कोई जानकारी नहीं है कि फ़ंक्शन कहां है, इसलिए यह केवल कुछ फर्जी पते पर कॉल करता है और इसे ठीक करने के लिए लिंकर के लिए झंडे लगाता है। लिंकर जानता है कि यह फ़ंक्शन एक गतिशील रूप से लोड की गई लाइब्रेरी में रहता है (आप इसे बताते हैं), और इसे ओएस लोडर के लिए ठीक करने के लिए झंडे लगाते हैं। ओएस तब लोड समय पर इसे हल करता है, जब यह लाइब्रेरी लोड करता है (या हो सकता है कि यह पहले ही लोड हो चुका है) और यह 'printf' का असली पता जानता है। –

+0

ठीक है, इस तरह प्रक्रिया लिंक तालिका काम करती है, लेकिन लिंकर को कैसे पता चलता है कि 'printf' जैसे फ़ंक्शन को ओएस द्वारा स्वयं ही हल किया जाना चाहिए या नहीं? ** हम इसे कैसे ** बताते हैं? –

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