2012-01-24 15 views
5

यदि मैं objdump -d को (linux amd64) .o फ़ाइल पर चलाता हूं, तो लिंक कॉल रिज़ॉल्यूशन किए बिना फ़ंक्शन कॉल दिखाई देते हैं। उदाहरण:objdump और स्थानीय फ़ंक्शन कॉल के लिंक को हल करना?

90: 66 89 44 24 1c   mov %ax,0x1c(%rsp) 
    95: 44 89 74 24 10   mov %r14d,0x10(%rsp) 
    9a: e8 00 00 00 00   callq 9f <foo+0x9f> 
    9f: 83 f8 ff    cmp $0xffffffffffffffff,%eax 
    a2: 74 5e     je  102 <foo+0x102> 

समारोह के भीतर एक शाखा ठीक से पता चलता है, लेकिन callq सिर्फ ठूंठ लिंकर के लिए में डाल दिया है (लिंकर के लिए उपलब्ध शून्य से चार बाइट्स के साथ में एक उचित पता लगाने के लिए)।

क्या कोई तरीका है, वास्तव में लिंक किए बिना, असेंबली लिस्टिंग प्राप्त करने के लिए जिसमें फ़ंक्शन नाम हल हो गए हैं? मुझे उस पते का परवाह नहीं है जिसका अंततः उपयोग किया जाएगा, केवल फ़ंक्शन का नाम। वह जानकारी .o फ़ाइल में होनी चाहिए, क्योंकि लिंकर को इसे अपना काम करने के लिए उपभोग करना चाहिए।

मैं पूछता हूँ क्योंकि साझा lib है कि प्रश्न में कोड में चला जाता है 140MB के बारे में है, और यह उस पर -d objdump चलाने के लिए एक लंबे समय लगता है सभी फ़ंक्शन कॉल उनके वास्तविक का संकल्प के साथ एएसएम डंप पाने के लिए नाम।

+0

मैं अपने विशिष्ट समस्या के लिए एक समाधान खोज निकाला है। मैं अपने विशाल साझा lib में फ़ंक्शन पता प्राप्त करने के लिए एनएम चला सकता हूं, और फिर उस एनएम आउटपुट का उपयोग कर --start-address के साथ objdump चला सकता हूं। मैं अभी भी मूल प्रश्न के उत्तर में रूचि रखूंगा हालांकि यह संभव है। –

उत्तर

12

क्या कोई तरीका है, असल में लिंक किए बिना, असेंबली लिस्टिंग प्राप्त करने के लिए जिसमें फ़ंक्शन नाम हल हो गए हैं?

हाँ: का उपयोग objdump -dr foo.o

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