2010-11-25 9 views
6

मेरे पास (असेंबलर कोड से) के रूप में संकलित एक ऑब्जेक्ट फ़ाइल है।gdb मेमोरी एक्सेस शिकायत पर विवरण

अगर मैं यह ld का उपयोग कर, जब मैं stepi (या nexti) gdb पता 0x0 में स्मृति का उपयोग के बारे में शिकायत करने की कोशिश जोड़ देते हैं। यदि मैं इसे gcc का उपयोग करके लिंक करता हूं, तो सब ठीक है।

मैं इस समस्या अनुमान लगा रहा हूँ ld है, जो कम वर्गों का उत्पादन जब जीसीसी को लिंक करने परिणाम की तुलना में कारण होता है।

क्या जीडीबी को अधिक वर्बोज़ करने के लिए कॉन्फ़िगर करने का कोई तरीका है ताकि मैं निष्पादन योग्य के साथ क्या गलत हो सकता हूं?

(gdb) b main 
Breakpoint 1 at 0x100000f8e 
(gdb) r 
Breakpoint 1, 0x0000000100000f8e in main() 
(gdb) x/10i $pc 
0x100000f8e <main>: fbld 0x6c(%rip)  # 0x100001000 <data1> 
0x100000f94 <main+6>: fimul 0x7a(%rip)  # 0x100001014 <data2> 
0x100000f9a <main+12>: fbstp 0x60(%rip)  # 0x100001000 <data1> 
0x100000fa0 <main+18>: mov0x0 $0x2000001,%rax 
0x100000fa7 <main+25>: mov $,%rdi 
0x100000fae <main+32>: syscall 
(gdb) si 
Cannot access memory at address 0x0 
0x0000000100000f94 in main() 

पुनश्च: निष्पादन योग्य ही दोनों संस्करणों में अपेक्षा के अनुरूप चलाता है।

बाद में संपादित करें: आदेशों मैं संकलित करने के लिए उपयोग किया है:

as -arch x86_64 src.s -o src.o 
ld -e _main -arch x86_64 src.o -o src 
gcc -o src src.o 
+0

क्या आपने "stepi" कमांड के बाद रजिस्ट्रार (जानकारी रजिस्ट्रार) या स्टैक को डंप करने की कोशिश की है, और यदि अलग है, तो? निष्पादन योग्य ठीक होने पर आप परवाह क्यों करते हैं? – AlastairG

+0

मैं "stepi" से पहले और बाद में रजिस्टरों को डंप कर सकता हूं लेकिन मुझे कुछ भी प्रासंगिक नहीं दिख रहा है। मुझे परवाह है क्योंकि मुझे अस्पष्ट व्यवहार पसंद नहीं है। – diciu

+0

आपने 'ld' और 'gcc' (और 'जैसा' निश्चित रूप से) को कैसे कॉल किया? आप किस झंडे का उपयोग करते थे? – Bart

उत्तर

2

gdb, एक "शो डिबग" कमांड है विभिन्न आंतरिक डिबग सेटिंग्स दे रही है। जैसे "डीबग लक्ष्य 1 सेट करें" लक्ष्य प्रक्रिया के साथ जीडीबी की बातचीत के लिए ट्रेसिंग चालू कर देगा। हो सकता है कि आप उनके हर झंडे के साथ प्रयोग करना चाहें (वहां बहुत सारे नहीं हैं)।

+0

उत्तर के लिए धन्यवाद। अब मुझे समस्या दिखाई दे रही है - एलडी रिटर्न 0x0 द्वारा बनाई गई बाइनरी पर frame_register_unwind को कॉल करें। मुझे नहीं पता क्यों, लेकिन यह एक अच्छी शुरुआत है। – diciu

1

जीसीसी वास्तव में लिंकिंग नहीं करता है, यह सिर्फ आपकी तरफ से एलडी कॉल करता है। आपके द्वारा प्रदान किए जा रहे विकल्प आपके द्वारा उपयोग किए जा रहे विकल्पों से अलग होना चाहिए।

इस सूत्र के अनुसार:

How to get GCC linker command?

आप जीसीसी -v चलाकर ld मंगलाचरण के कमांड लाइन को देखने के लिए सक्षम होना चाहिए। आपको यह बताएगा कि अपनी ld कमांड लाइन को कैसे संशोधित करें ताकि चीजें आपके लिए काम कर सकें।

+0

उत्तर के लिए धन्यवाद, मैं वास्तव में इस तरह से एकत्र किए गए अतिरिक्त तर्कों के साथ एलडी का उपयोग कर लिंक कर सकता हूं। – diciu