डीबगिंग के लंबे अनुक्रम के बाद मैंने अपनी समस्या को एक फ़ाइल में संकुचित कर दिया है। और समस्या यह है कि फाइल दो अलग-अलग निर्देशिकाओं में अलग-अलग संकलित होती है, जब सबकुछ एक जैसा होता है।एक ही स्रोत कोड को संकलित कैसे कर सकते हैं विभिन्न ऑब्जेक्ट फाइलें उत्पन्न करते हैं?
मैं एक साधारण फ़ाइल संकलित करने के लिए 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 के लिए ऑब्जेक्ट में ऐसी कोई त्रुटि नहीं होती है और लिंक ठीक नहीं होते हैं।
स्पष्ट रूप से इसके लिए एक टैग [टैग: बाइनरी-पुनरुत्पादन क्षमता] है। मैंने इस कंपाइलर के साथ एक ही चीज़ देखी है। * Diff * का बहुमत अलग-अलग रजिस्टर चयन या फ़ाइल ऑफसेट दिखाता है, लेकिन इसकी मूलभूत कार्यक्षमता है। देखें: [डेबियन पुनरुत्पादित बनाता है] (https://wiki.debian.org/ReproducibleBuilds)। बेशक यह संभव है कि आउटपुट अलग है। क्या यह आपकी समस्या है? मुझे लगता है कि आपकी समस्या कुछ और है। –
इसके अलावा: [प्रत्येक निर्माण में एसओ बाइनरी बदलना] (http://stackoverflow.com/questions/4140329/binary-object-file-changing-in-each-build), आदि –
आप '-O0' के साथ संकलन करने का प्रयास कर सकते हैं यह देखने के लिए कि मतभेद बने रहते हैं या नहीं। – markgz