थोड़ा अलग आवश्यकता: मुझे यह निर्धारित करने के लिए एक प्रोग्राम की तरह एक परीक्षण की आवश्यकता है कि स्क्रिप्ट को कॉन्फ़िगर करें यह निर्धारित करने के लिए कि क्या संकलित लक्ष्य मशीन बिट या थोड़ा एंडियन है, कोड को निष्पादित किए बिना । स्क्रिप्ट को हेडर #define HAVE_LITTLE_ENDIAN 1
में जमा करना होगा config.h
, वरना #define HAVE_LITTLE_ENDIAN 0
।
संकलित लक्ष्य मशीन बिल्ड मशीन से भिन्न हो सकती है, क्योंकि हम क्रॉस-संकलन हो सकते हैं, जो यह भी बताता है कि परीक्षण किसी भी संकलित कोड को चलाने की कोशिश क्यों नहीं करनी चाहिए। यह इस सवाल से printf
बाहर है कि एक बयान के साथ थोड़ा सी कार्यक्रम है जो उत्तर को बाहर निकालता है।
एक संभावित समाधान यह है। हम एक फाइल बनाते हैं conftest.c
जिसमें यह लिखा होता है:
#define USPELL(C0, C1, C2, C3) \
((unsigned) C0 << 24 | \
(unsigned) C1 << 16 | \
(unsigned) C2 << 8 | (unsigned) C3)
unsigned x[6] = {
0,
USPELL('L', 'I', 'S', 'P'),
USPELL('U', 'N', 'I', 'X'),
USPELL('C', 'O', 'R', 'E'),
USPELL('D', 'W', 'I', 'M'),
0
};
अब, हम इसे conftest.o
उपयोग करने के लिए संकलित करते हैं:
$ /path/to/cross-compiling/cc conftest.c -c
फिर हम चलाते हैं:
$ strings conftest.o
PSILXINUEROCMIWD
यदि स्ट्रिंग PSILXINUEROCMIWD
होती है, तो लक्ष्य थोड़ा-सा है। यदि स्ट्रिंग LISPUNIXCOREDWIM
होती है, तो यह बड़ा-एंडियन है। यदि न तो स्ट्रिंग होती है या, और भी आश्चर्यजनक रूप से, दोनों करते हैं, तो परीक्षण विफल हो गया है।
यह दृष्टिकोण काम करता है क्योंकि कार्यक्रम में गणना की गई "फोर सीसी" स्थिरांक में मशीन-स्वतंत्र मूल्य होते हैं, जो अंतर्जात की परवाह किए बिना समान पूर्णांक को दर्शाते हैं। ऑब्जेक्ट फ़ाइल में उनका संग्रहण प्रतिनिधित्व लक्ष्य प्रणाली की समाप्ति का अनुसरण करता है, और जो वर्ण-आधारित दृश्य के तहत दिखाई देता है strings
।
दो शून्य गार्ड शब्द यह सुनिश्चित करते हैं कि स्ट्रिंग पृथक है। यह कड़ाई से आवश्यक नहीं है, लेकिन यह सुनिश्चित करता है कि हम जिस स्ट्रिंग की तलाश कर रहे हैं, वह किसी अन्य स्ट्रिंग में एम्बेडेड नहीं है, जिसका अर्थ है कि strings
यह स्वयं के लिए एक पंक्ति में आउटपुट करेगा।
PS USPELL
मैक्रो तर्क सम्मिलन को छोटा नहीं करता है क्योंकि यह इस विशिष्ट उद्देश्य के लिए तैयार किया गया है, पुन: उपयोग के लिए नहीं।