2009-07-24 18 views
5

यह उन चीजों में से एक प्रतीत होता है जो हर वार्ता के बारे में बताते हैं लेकिन कोई भी परिभाषित नहीं करता है ... मुझे इस विषय पर कोई जानकारी नहीं मिल रही है। प्रतीक संकल्प क्या है? यह सबसे अच्छी बात है जो मैंने पाया है: http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter2-90421.html#chapter2-93321प्रतीक संकल्प क्या है?

क्या आपके प्रोग्राम को संकलित करने के तरीके के साथ कुछ करना है?

उत्तर

5

ठीक है, अब आप यूनिक्स के एनएम का उल्लेख करते हैं, मैं प्रतीक संकल्प को इंगित कर सकता हूं।

निष्पादन योग्य फाइलें उन संस्थाओं का संदर्भ दे सकती हैं जो स्वयं के भीतर परिभाषित नहीं हैं। उदाहरण के लिए, साझा पुस्तकालयों पर चर या प्रक्रियाएं। उन संस्थाओं को बाहरी प्रतीकों द्वारा पहचाना जाता है। निष्पादन योग्य के पास आंतरिक प्रतीक भी हो सकते हैं जिन्हें बाहरी फाइलों द्वारा संदर्भित किया जा सकता है - जैसे कि पुस्तकालयों के मामले में।

प्रतीक संदर्भ, इस संदर्भ में, एक बार प्रोग्राम को स्मृति में लोड किया गया है, यह सभी बाहरी इकाइयों को उचित पते निर्दिष्ट करता है। इसका मतलब है लोड किए गए कार्यक्रम में हर स्थिति को बदलना जहां बाहरी प्रतीक का संदर्भ बनाया गया था।

ये पते इस बात पर निर्भर करेंगे कि, स्मृति में, बाहरी प्रतीकों के साथ कोड लोड किया गया है।

यूनिक्स में, प्रोग्राम के लिए डिफ़ॉल्ट संकलन मोड निष्पादन योग्य में आवश्यक सब कुछ पूर्व-लिंक करने के बजाय सिस्टम साझा लाइब्रेरी का उपयोग करना है। उदाहरण के लिए, gcc के साथ प्रोग्राम को संकलित करते समय, यदि आप अनसुलझे प्रतीकात्मक संदर्भों के बजाय, सांख्यिकीय रूप से संकलित होने की इच्छा रखते हैं तो आप -static ध्वज पास करते हैं।

अधिक जानकारी के लिए "साझा पुस्तकालय" देखें।

+0

भावना बनाता है आपको बहुत बहुत धन्यवाद: आम तौर पर, इन नियमों कार्यक्रम के शब्दों के साथ बातचीत और कभी कभी वे भी (संभावित) अस्पष्टता में परिणाम कर सकते हैं:

सी ++। मैं "साझा पुस्तकालय" भी देखूंगा। क्या आपके पास ऐसी कोई किताबें हैं जिनके बारे में आप अधिक जानने के लिए सिफारिश कर सकते हैं? –

+1

विषय पर मुझे पता है कि सबसे अच्छी किताब है [_Linkers और Loaders_ जॉन आर लेविन] (http://rads.stackoverflow.com/amzn/click/1558604960)। – alanc

1

मुझे यकीन नहीं है कि आप किस संदर्भ में प्रतीक संकल्प का मतलब है। लेकिन यह मुझे साझा पुस्तकालयों में रन-टाइम प्रतीक रिज़ॉल्यूशन के लिए dlopen (3), और dlsym (3) की याद दिलाता है।

+0

मेरा मतलब है कि इसे यूनिक्स पर एनएम कमांड के साथ प्रयोग करने के संदर्भ में। क्या उससे मदद हुई? मुझे यकीन नहीं है कि डलोपेन क्या है, इसलिए मैं यह नहीं कह सकता कि आप करीब हैं या नहीं। –

1

जैसा कि बताया गया है, यह रन-टाइम या लिंक-टाइम प्रतीक रिज़ॉल्यूशन का संदर्भ ले सकता है। हालांकि आपको संकलन-समय प्रतीक संकल्प नहीं भूलना चाहिए।

यह नियम "चीजों" को प्रतीकों को मैप करने के लिए उपयोग की जाने वाली नियम हैं। प्रतीक किसी भी नाम (स्थानीय, सदस्य और वैश्विक चर, कार्य, विधियों, प्रकार इत्यादि) जैसा दिखने वाले किसी भी चीज के बारे में होते हैं और "चीजें" कंपाइलर्स को समझते हैं कि नाम क्या संदर्भित करता है।

ऐसा करने के लिए नियम काफी सरल हो सकते हैं (उदाहरण के लिए, सी में आईआईआरसी यह देखने के लिए स्थानों की एक आदेशित सूची से थोड़ा अधिक है) या जटिल (सी ++ में ओवरलोडिंग, टेम्पलेट्स और व्हाट्नॉट के साथ सभी प्रकार के मामले हैं)। ,

int First(int i) { return i; } 
float First(float f) { return f; } 

void Second(int (*fn)(int)) { printf("int"); } 
void Second(float (*fn)(float); { printf("float"); } 

... 

Second(&First); // What will be printed? 
संबंधित मुद्दे