2014-06-10 6 views
5

डीबगिंग के लंबे अनुक्रम के बाद मैंने अपनी समस्या को एक फ़ाइल में संकुचित कर दिया है। और समस्या यह है कि फाइल दो अलग-अलग निर्देशिकाओं में अलग-अलग संकलित होती है, जब सबकुछ एक जैसा होता है।एक ही स्रोत कोड को संकलित कैसे कर सकते हैं विभिन्न ऑब्जेक्ट फाइलें उत्पन्न करते हैं?

मैं एक साधारण फ़ाइल संकलित करने के लिए CodeSourcery के arm gcc compiler (gcc संस्करण 4.3.3, सोर्सरी जी ++ लाइट 200q1-161) का उपयोग कर रहा हूं। मैं इसे बिना किसी समस्या के एक मॉड्यूल में उपयोग कर रहा था और फिर मैंने इसे इस्तेमाल करने के लिए इसे दूसरे मॉड्यूल में कॉपी किया। जब यह संकलित होता है, ऑब्जेक्ट फ़ाइल काफी अलग होती है। दो फाइलों को संकलित करने के लिए कमांड लाइन समान है (मैंने सुनिश्चित करने के लिए लिनक्स इतिहास का उपयोग किया है), और 3 में शामिल फ़ाइलें भी समान प्रतियां हैं (diff के साथ चेक की गई हैं)।

मैंने दो ऑब्जेक्ट फ़ाइलों पर एक द्विआधारी तुलना की और उनके पास कई अलग-अलग बाइट मतभेद बिखरे हुए हैं। मैंने दोनों की objdump -D किया और उनकी तुलना की और वहां बहुत अंतर हैं। यहां dump1, dump2, और diff है। कमांड लाइन " arm-none-eabi-gcc --std = gnu99 -Wall -O3 -g3 -ggdb -Wextra -Wno-unused -c crc.c -o crc.o" है।

यह कैसे संभव है? मैंने -सी के बजाय -एस के साथ संकलित किया है और असेंबलर आउटपुट को देखा है और यह निर्देशिका पथ को छोड़कर समान है। तो ऑब्जेक्ट फ़ाइल अलग कैसे हो सकती है?

मेरी असली समस्या यह है कि जब मैं अपने प्रोग्राम में डंप 2 के लिए ऑब्जेक्ट फ़ाइल को लिंक करने का प्रयास करता हूं, तो मुझे अपरिभाषित संदर्भ त्रुटियां मिलती हैं, इसलिए ऑब्जेक्ट में कुछ गलत है, जबकि डंप 1 के लिए ऑब्जेक्ट में ऐसी कोई त्रुटि नहीं होती है और लिंक ठीक नहीं होते हैं।

+0

स्पष्ट रूप से इसके लिए एक टैग [टैग: बाइनरी-पुनरुत्पादन क्षमता] है। मैंने इस कंपाइलर के साथ एक ही चीज़ देखी है। * Diff * का बहुमत अलग-अलग रजिस्टर चयन या फ़ाइल ऑफसेट दिखाता है, लेकिन इसकी मूलभूत कार्यक्षमता है। देखें: [डेबियन पुनरुत्पादित बनाता है] (https://wiki.debian.org/ReproducibleBuilds)। बेशक यह संभव है कि आउटपुट अलग है। क्या यह आपकी समस्या है? मुझे लगता है कि आपकी समस्या कुछ और है। –

+0

इसके अलावा: [प्रत्येक निर्माण में एसओ बाइनरी बदलना] (http://stackoverflow.com/questions/4140329/binary-object-file-changing-in-each-build), आदि –

+0

आप '-O0' के साथ संकलन करने का प्रयास कर सकते हैं यह देखने के लिए कि मतभेद बने रहते हैं या नहीं। – markgz

उत्तर

0

अधिकतर आपकी फ़ाइल अलग-अलग फ़ाइलों को शामिल करती है। यह सबसे संभावित कारण है।

जांचें कि आपके शामिल पथ बिल्कुल समान हैं, बयान शामिल पथों में पथ हैं। वे विभिन्न निर्देशिकाओं को इंगित कर सकते हैं। सी और सी ++ में एक सुविधा है कि जब आप #include abcd.h कॉलिंग फ़ाइल की निर्देशिका से abcd.h लोड करने का प्रयास करते हैं। इसे देखो।

1

बड़े पैमाने पर सॉफ्टवेयर के लिए, पॉइंटर्स पर कई कार्यान्वयन कर रहे हैं। यह एक प्रमुख कारण है जो परिणाम यादृच्छिकता का कारण बनता है। आम तौर पर यदि प्रोग्राम तर्क सही है, तो कुछ आंतरिक डेटा संरचनाओं का क्रम अलग-अलग हो सकता है जो ज्यादातर मामलों में हानिकारक नहीं है।

और साथ ही, 'objdump -D' आउटपुट की तुलना न करें, क्योंकि आप अलग-अलग निर्देशिका से कोड संकलित कर रहे हैं, स्ट्रिंग टेबल, प्रतीक तालिका, DWARF या eh_frame अलग होना चाहिए। आपको निश्चित रूप से बहुत सारी रेखाएं मिलेंगी।

एकमात्र तुलना जो समझ में आता है वह 'objdump -d' के आउटपुट की तुलना करना है जो केवल टेक्स्ट अनुभाग का ख्याल रखता है। यदि पाठ अनुभाग समान (समान) है तो इसे समान के रूप में माना जा सकता है।

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