निर्भर करता है। IA-32 (Intel 32-bit) के लिए संकलित कुछ amd64 पर चल सकता है क्योंकि Intel पर लिनक्स 32-बिट अनुप्रयोगों (उपयुक्त सॉफ़्टवेयर इंस्टॉल के साथ) के साथ पीछे की संगतता बनाए रखता है। यहां code
रेडहैट 7.3 32-बिट सिस्टम (लगभग 2002, gcc संस्करण 2.96) पर संकलित किया गया है और फिर बाइनरी को सेंटोस 7.4 64-बिट सिस्टम (लगभग 2017) पर कॉपी और रन किया गया है:
-bash-4.2$ file code
code: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
-bash-4.2$ ./code
-bash: ./code: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
-bash-4.2$ sudo yum -y install glibc.i686
...
-bash-4.2$ ./code ; echo $?
99
प्राचीन रेडहैट 7.3 से सेंटोस 7.4 (अनिवार्य रूप से रेडहैट एंटरप्राइज लिनक्स 7.4) एक ही "वितरण" परिवार में रह रहा है, इसलिए संभवतः 2002 से 2018 में कुछ अन्य यादृच्छिक लिनक्स वितरण के लिए कुछ यादृच्छिक "खरोंच से लिनक्स" स्थापित करने से बेहतर पोर्टेबिलिटी होगी। ।
Amd64 के लिए संकलित कुछ केवल लिनक्स के 32-बिट रिलीज पर नहीं चलेगा (पुराने हार्डवेयर नए हार्डवेयर के बारे में नहीं जानता है)। यह प्राचीन पुरानी चीजों पर चलने के लिए बनाए गए आधुनिक सिस्टम पर संकलित नए सॉफ्टवेयर के लिए भी सही है, क्योंकि लाइब्रेरी और यहां तक कि सिस्टम कॉल बैकवर्ड पोर्टेबल नहीं हो सकते हैं, इसलिए संकलन ट्रिक्स की आवश्यकता हो सकती है, या एक पुराने संकलक और इसके आगे, या संभवतः प्राप्त कर सकते हैं। पुराने सिस्टम पर संकलन। (यह पुरानी पुरानी चीजों की आभासी मशीनों को आसपास रखने का एक अच्छा कारण है।)
आर्किटेक्चर मायने रखता है; amd64 (या IA-32) ARM या MIPS से काफी अलग है, इसलिए उनमें से एक से बाइनरी को दूसरे पर चलने की उम्मीद नहीं होगी। विधानसभा स्तर main
पर IA-32 पर आपके कोड का अनुभाग इसके माध्यम gcc -S code.c
से संकलित करता है
main:
pushl %ebp
movl %esp,%ebp
movl $99,%eax
popl %ebp
ret
जो एक amd64 प्रणाली (Linux सिस्टम पर - OpenBSD पर विपरीत amd64 पर 32-बिट बायनेरिज़ का समर्थन नहीं करता है, के साथ सौदा कर सकता है ; पुराने आर्क के साथ पश्चगामी संगतता हमलावरों को wiggle कमरा देती है, जैसे CVE-2014-8866 और मित्र)। इस बीच एक बड़े-एंडियन MIPS सिस्टम पर main
इसके बजाय संकलन करता है:
main:
.frame $fp,8,$31
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-8
sw $fp,4($sp)
move $fp,$sp
li $2,99
move $sp,$fp
lw $fp,4($sp)
addiu $sp,$sp,8
j $31
nop
एक इंटेल प्रोसेसर को पता नहीं होगा कि क्या करना है, और इसी तरह MIPS पर इंटेल असेंबली के लिए।
आप संभवतः विदेशी कोड चलाने के लिए QEMU या कुछ अन्य एमुलेटर का उपयोग कर सकते हैं (शायद बहुत धीरे-धीरे)।
हालाँकि! आपका कोड बहुत सरल कोड है, इसलिए किसी भी चीज़ की तुलना में कम पोर्टेबिलिटी समस्या होगी; कार्यक्रम आमतौर पर पुस्तकालयों का उपयोग करते हैं जो समय के साथ बदल गए हैं (ग्लिस्क, ओपनसेल, ...); उन लोगों के लिए भी विभिन्न पुस्तकालयों के पुराने संस्करणों को स्थापित करने की आवश्यकता हो सकती है (उदाहरण के लिए RedHat आमतौर पर "कंपास" को पैकेज के लिए कहीं और रखता है)
compat-glibc.x86_64 1:2.12-4.el7.centos
या संभवतः पुरानी चीजों के लिए एबीआई परिवर्तन (एप्लिकेशन बाइनरी इंटरफ़ेस) के बारे में चिंता करें जो कि ग्लिबक का उपयोग करते हैं, या अधिक हाल ही में सी ++ 11 या अन्य सी ++ रिलीज के कारण परिवर्तन। पुस्तकालय के मुद्दों से बचने की कोशिश करने के लिए व्यक्ति स्थैतिक (डिस्क पर द्विआधारी आकार में वृद्धि) को भी संकलित कर सकता है, हालांकि कुछ पुराने बाइनरी ने ऐसा किया था या नहीं यह इस बात पर निर्भर करता है कि क्या पुराने लिनक्स वितरण गतिशील (रेडहैट: हाँ) सबसे अधिक सब कुछ संकलित कर रहा था या नहीं। दूसरी ओर, patchelf
गतिशील लाइजर (एलएएफ, लेकिन शायद a.out
प्रारूप नहीं ) की तरह चीजें अन्य पुस्तकालयों का उपयोग कर सकती हैं।
हालाँकि! एक कार्यक्रम चलाने में सक्षम होना एक बात है, और वास्तव में इसके साथ कुछ उपयोगी करना। पुराने 32-बिट इंटेल बायनेरिज़ में सुरक्षा संबंधी समस्याएँ हो सकती हैं, यदि वे ओपनएसएसएल के एक संस्करण पर निर्भर करते हैं, जिसमें कुछ भयानक और गैर-बैकपोर्टेड सुरक्षा समस्या है, या प्रोग्राम आधुनिक वेब सर्वर (आधुनिक के रूप में) के साथ बातचीत करने में सक्षम नहीं हो सकता है सर्वर पुराने प्रोटोकॉल और पुराने प्रोग्राम के सिफर को अस्वीकार करते हैं), या एसएसएच प्रोटोकॉल संस्करण 1 अब समर्थित नहीं है, या ...