มันขึ้นอยู่กับ. บางสิ่งที่รวบรวมไว้สำหรับ IA-32 (Intel 32 บิต) อาจทำงานบน amd64 เนื่องจาก Linux บน Intel ยังคงใช้งานร่วมกับแอพพลิเคชั่นแบบ 32 บิตได้ (ด้วยการติดตั้งซอฟต์แวร์ที่เหมาะสม) นี่คือcode
คอมไพล์ของคุณใน RedHat 7.3 ระบบ 32 บิต (ประมาณ 2002, gcc เวอร์ชั่น 2.96) จากนั้นไบนารีจะถูกคัดลอกไปยังและทำงานบนระบบ Centos 7.4 64- บิต (ประมาณปี 2560):
-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
Ancient RedHat 7.3 ถึง Centos 7.4 (โดยหลักแล้ว RedHat Enterprise Linux 7.4) ยังคงอยู่ในตระกูล "การกระจาย" เดียวกันดังนั้นจึงน่าจะมีความสะดวกในการพกพาดีกว่าการติดตั้ง "Linux จากศูนย์" แบบสุ่มบางส่วนในปี 2002 .
สิ่งที่รวบรวมสำหรับ amd64 จะไม่ทำงานบน Linux รุ่น 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 บิตการทำงานร่วมกันย้อนหลังกับ archs เก่าจะให้ห้องผู้บุกรุกเช่น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
ซึ่งโปรเซสเซอร์ Intel จะไม่ทราบว่าจะทำอย่างไรและเช่นเดียวกันสำหรับการประกอบ Intel ใน MIPS
คุณอาจใช้ QEMU หรือโปรแกรมจำลองอื่น ๆ เพื่อเรียกใช้โค้ดต่างประเทศ (อาจช้ามาก)
แต่! รหัสของคุณเป็นรหัสที่ง่ายมากดังนั้นจะมีปัญหาเรื่องการพกพาน้อยกว่าสิ่งอื่นใด โปรแกรมมักจะใช้ประโยชน์จากห้องสมุดที่มีการเปลี่ยนแปลงตลอดเวลา (glibc, openssl, ... ); สำหรับคนเหล่านั้นอาจจำเป็นต้องติดตั้งไลบรารี่ต่าง ๆ ที่เก่ากว่า (เช่น RedHat มักจะใส่ "compat" ไว้ในชื่อแพ็กเกจเช่น)
compat-glibc.x86_64 1:2.12-4.el7.centos
หรืออาจกังวลเกี่ยวกับการเปลี่ยนแปลง ABI (Application Binary Interface) สำหรับวิธีเก่า ๆ ที่ใช้ glibc หรือเปลี่ยนแปลงเร็ว ๆ นี้เนื่องจาก C ++ 11 หรือ C ++ รุ่นอื่น ๆ เราสามารถคอมไพล์แบบสแตติก (เพิ่มขนาดไบนารีบนดิสก์) เพื่อพยายามหลีกเลี่ยงปัญหาในไลบรารีแม้ว่าจะมีบางไบนารีแบบเก่าก็ตามหรือไม่ขึ้นอยู่กับว่าการกระจาย Linux แบบเก่านั้นรวบรวมทุกอย่างแบบไดนามิก (RedHat: ใช่) หรือไม่ ในทางตรงกันข้ามสิ่งต่าง ๆ เช่นpatchelf
สามารถ rejigger dynamic (ELF แต่อาจไม่ใช่a.out
รูปแบบ) เพื่อใช้ไลบรารีอื่น
แต่! ความสามารถในการเรียกใช้โปรแกรมเป็นสิ่งหนึ่งและจริง ๆ แล้วทำสิ่งที่มีประโยชน์กับโปรแกรมอื่น ไบนารีของ Intel เก่า 32 บิตอาจมีปัญหาด้านความปลอดภัยหากพวกเขาขึ้นอยู่กับรุ่นของ OpenSSL ที่มีปัญหาด้านความปลอดภัยที่น่ากลัวและไม่ได้ backported อยู่ในนั้นหรือโปรแกรมอาจไม่สามารถเจรจาต่อรองกับเว็บเซิร์ฟเวอร์ที่ทันสมัยได้ เซิร์ฟเวอร์ปฏิเสธโปรโตคอลและยันต์เก่าของโปรแกรมเก่า) หรือโปรโตคอล SSH เวอร์ชัน 1 ไม่ได้รับการสนับสนุนอีกต่อไปหรือ ...