c++ - What does "symbol value" from nm command mean? -


जब आप एक स्थिर लाइब्रेरी की प्रतीक तालिका, जैसा nm mylib.a , की सूची करता है क्या 8 अंक हेक्स प्रत्येक प्रतीक के आगे दिखाई देता है? क्या कोड में प्रत्येक प्रतीक का रिश्तेदार स्थान है?

इसके अलावा, क्या एकाधिक प्रतीकों का एक ही प्रतीक मान हो सकता है? क्या 00000000 के प्रतीकों का मूल्य होने वाले सभी अलग-अलग प्रतीकों के साथ कुछ गड़बड़ है?

यहाँ एक स्निपेट है कोड मैंने सी में लिखा था:

  #include #include void foo (); Int main (int argc, char * argv []) {foo (); } शून्य foo () {printf ("फू बार बाज़!"); }  

मैंने उस कोड पर gcc -c foo.c भाग लिया यहां बताया गया है एनएम foo.o है पता चला है:

 000000000000001b टी foo -0000000000000000 टी मुख्य यू printf 

इस उदाहरण के लिए मैं चला रहा हूँ उबंटू लिनक्स 64-बिट; यही कारण है कि आप देखते हैं कि 8 अंकों का हेक्स 16 अंक है। : -)

हेक्स अंक जो आप देखते हैं वह कोड कोड का पता वस्तु कोड के भीतर .text। अनुभाग की शुरुआत के सापेक्ष है। (मानते हुए कि हम ऑब्जेक्ट फ़ाइल के अनुभागों को 0x0 से शुरू करते हैं) आप चलाते हैं objdump -td foo.o , आप उत्पादन में निम्नलिखित दिखाई देगा:

 अनुभाग .text की Disassembly: 0000000000000000: 0: 55 धक्का% RBP 1: 48 89 E5 mov% आरएसपी,% RBP 4: 48 83 ईसी 10 उप $ 0x10,% आरएसपी 8: 89 7 दिन एफसी mov% ईडीआई, -0x4 (% RBP) ख: 48 89 75 f0 mov% RSI, -0x10 (% RBP) च: B8 00 00 00 00 mov $ 0x0,% eax 14: e8 00 00 00 00 callq 19 19: C9 leaveq 1 क: सी 3 retq 000000000000001b: 1b: 55 धक्का% RBP 1c: 48 89 E5 mov% आरएसपी,% RBP 1f: B8 00 00 00 00 mov $ 0x0,% eax 24: 48 89 C7 mov% Rax,% RDI 27: B8 00 00 00 00 mov $ 0x0,% eax 2c: e8 00 00 00 00 callq 31 31: C9 Leaveq 32: c3 retq 

ध्यान दें कि ये दो प्रतीकों को सही लाइन पर जिन प्रविष्टियों से हमने प्रतीक तालिका में nm से देखा ध्यान में रखते हुए, यदि आप इस ऑब्जेक्ट फ़ाइल को अन्य ऑब्जेक्ट फाइलों से लिंक करते हैं तो ये पता बदल सकते हैं। साथ ही, यह ध्यान में रखना है कि callq 0x2c पर बदल जाएगा जब आप इस फाइल को लिंक करेंगे, जो कि आपके सिस्टम द्वारा प्रदान की गई सभी लिबसी के लिए है, क्योंकि वर्तमान में यह printf के लिए एक अपूर्ण कॉल है (यह नहीं पता है कि यह अभी कहां है )।

आपके mylib.a के लिए, यहां पर और अधिक चल रहा है आपके पास फ़ाइल एक संग्रह है; इसमें एकाधिक ऑब्जेक्ट फाइलें हैं, जिनमें से प्रत्येक के साथ इसके स्वयं के टेक्स्ट सेगमेंट हैं उदाहरण के लिए, यहाँ यहाँ मेरी बॉक्स पर /usr/lib/libm.a के खिलाफ एक एनएम का हिस्सा है

 e_sinh.o: 0000000000000000 आर .LC0 0000000000000008 आर .LC1 0000000000000010 आर .LC2 0000000000000018 आर .LC3 -0000000000000000 आर .LC4 यू __expm1 यू __ieee754_exp -0000000000000000 टी __ieee754_sinh e_sqrt.o: -0000000000000000 टी __ieee754_sqrt e_gamma_r.o: -0000000000000000 आर .LC0 यू __ieee754_exp -0000000000000000 टी __ieee754_gamma_r यू __ieee754_lgamma_r यू __rint 

आप देखेंगे कि एक से अधिक लेख खंड Enters - दूसरे कॉलम बाकी के पते पर 0x0 पते पर टी द्वारा इंगित किया गया है, लेकिन प्रत्येक व्यक्तिगत फ़ाइल में केवल 0x0 में एक पाठ खंड का प्रतीक है।

एक से अधिक प्रतीकों वाली व्यक्तिगत फ़ाइलों के लिए एक ही पते पर आराम, ऐसा लगता है कि होगा शायद संभव हो सकता है सब के बाद, यह सिर्फ एक तालिका में एक प्रविष्टि है जो डेटा के एक हिस्से के स्थान और आकार का निर्धारण करता है। लेकिन मुझे कुछ के लिए नहीं पता है मैंने पहले कभी भी एक खंड के उसी हिस्से को संदर्भित करने वाले कई प्रतीकों को नहीं देखा है इस से अधिक ज्ञान वाले कोई भी मेरी ओर झुक सकता है: -)

आशा है कि इससे कुछ मदद मिलती है।


Comments

Popular posts from this blog

Is there an open source WebSockets (JavaScript) XMPP library? -

java - Is there an object like a "Set" that can contain only unique string values, but also contain a count on the number of occurrences of the string value? -

iphone - How do I make a UIPickerView in a UIActionSheet -