จะตรวจสอบได้อย่างไรว่าไฟล์ไบนารีของ linux เป็น 32- บิตหรือ 64- บิต?


24

เคอร์เนล 32 บิต (x86) สามารถเรียกใช้รหัส 32 บิตได้เท่านั้น เคอร์เนล 64 บิต (x86_64) สามารถเรียกใช้ได้ทั้งรหัส 32 บิตและ 64 บิต

ฉันต้องการทราบว่าเครื่องสามารถเรียกใช้งานปฏิบัติการได้หรืออีกนัยหนึ่งฉันมีไฟล์ไบนารีและฉันต้องใช้งานบน Ubuntu แบบ 32 บิต แต่ฉันไม่รู้ว่าไฟล์ไบนารีนั้นสามารถเรียกใช้งานได้แบบ 32 บิตหรือไม่ .

ฉันใช้fileคำสั่งระบุการปฏิบัติการที่จะตรวจสอบและนี่คือผลลัพธ์ที่ส่งคืน:

ELF 64- บิต LSB ที่ปฏิบัติการได้, x86-64, รุ่น 1 (SYSV), เชื่อมโยงแบบไดนามิก (ใช้ libs ที่ใช้ร่วมกัน), สำหรับ GNU / Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338686820656d680

คำตอบ:


29

คำตอบของคำถามในชื่อเรื่องอยู่ที่นั่นตอนต้นของผลลัพธ์:

ELF 64- บิต LSB ที่ปฏิบัติการได้, x86-64

ELF เป็นรูปแบบที่ปฏิบัติการและเชื่อมโยงได้ซึ่งเป็นรูปแบบไฟล์ปฏิบัติการไบนารีที่ใช้กันมากที่สุดโดย Linux

x86-64 เป็นสถาปัตยกรรมของไบนารีที่รุ่น 64 บิตของชุดคำสั่ง 86 xเดิมแนะนำโดยเอเอ็มดี ด้วยเหตุผลที่เกินฉัน Microsoft อ้างถึงมันเป็น "x64" แต่นั่นก็เป็นสิ่งเดียวกัน

uname -mpiหากคุณจำเป็นต้องรู้สถาปัตยกรรมของเคอร์เนลเองคุณสามารถใช้ ตัวอย่างเช่นในระบบของฉันที่พิมพ์:

ไม่ทราบที่ไม่รู้จัก x86_64

ซึ่งหมายความว่าฉันใช้เคอร์เนล x86-64

หากคุณสนใจซีพียูเองให้ดูที่/proc/cpuinfoรายละเอียดเกี่ยวกับ CPU ที่เคอร์เนลตรวจพบ

32-bit 80x86 executable ถูกระบุโดยfileเป็นเช่น:

ELF 32 บิตแบบปฏิบัติการ LSB, Intel 80386 , รุ่น 1 (SYSV), เชื่อมโยงแบบไดนามิก (ใช้ libs ที่ใช้ร่วมกัน), สำหรับ GNU / Linux 2.6.8, ถูกปล้น

ซึ่งบอกเราว่ามันเป็นแบบ 32 บิตโดยใช้ชุดคำสั่ง Intel 80386 (อาจมีนามสกุล)

โปรดทราบว่ามันไม่ง่ายเหมือนสถาปัตยกรรม 32 บิตและ 64 บิต ยกตัวอย่างเช่นลินุกซ์เคอร์เนลสนับสนุนสถาปัตยกรรม 32 บิตเช่น Intel 80386, AVR32 , S / 390และUnicore32 ในด้านของ 64- บิตลีนุกซ์สามารถใช้งานได้บนPA-RISC , x86-64, ItaniumและAlphaเป็นต้น ไม่ใช่ดิสทริบิวชันทั้งหมดที่มีไบนารีสำหรับสถาปัตยกรรมทั้งหมดอย่างไรก็ตาม (และฉันสงสัยว่ามีดิสทริบิวชันใดก็ตามที่กำหนดเป้าหมายสถาปัตยกรรมซีพียูที่รองรับทั้งหมดเท่า ๆ กัน) ดังนั้นหากคุณต้องการทราบว่าไบนารีที่กำหนดจะสามารถใช้งานได้กับระบบที่กำหนดหรือไม่คุณต้องพิจารณาสถาปัตยกรรมมากกว่าขนาดคำดั้งเดิมของ CPU


1
"เหตุผลที่เกินฉัน" ฉันยังจำวันที่ฉันพบว่า x64 เป็น 64 บิตและ x86 คือ 32 บิต
พอลเดรเปอร์

1
@PaulDraper คำว่า "x86" มีนิรุกติศาสตร์ชัดเจน มันย้อนกลับไปที่ซีพียูซีรี่ย์ 80x86 จาก Intel แตกต่างจากรุ่นก่อนเช่น 8008 หรือ 8080 และทุกวันนี้ส่วนใหญ่มักอ้างถึงชุดคำสั่งที่มีความสามารถ 32 บิต (80386, 80486, Pentium และใหม่กว่า ) หมายเลขรุ่นล่าสุดเหล่านี้มักจะถูกย่อด้วยการละเว้น "80" ที่จุดเริ่มต้นดังนั้น (โดยนัย 32 บิต) x86 ตรงกับ 386, 486 และอื่น ๆ อย่างไรก็ตามฉันไม่ทราบ CPU 64 บิตที่มีหมายเลขรุ่นของ โครงสร้างที่คล้ายกันซึ่งลงท้ายด้วย "64" แน่นอนว่าทั้ง AMD และ Intel ไม่ได้ใช้รูปแบบการตั้งชื่อในวันนี้
CVn

แม้ว่า x64 เป็นคำที่ใช้กันทั่วไปมาก ตัวอย่างสุ่ม: microsoft.com/en-us/download/details.aspx?id=42482
Paul Draper

@PaulDraper เป็นเรื่องปกติในขณะนี้ในโลกของ Microsoft แต่รากศัพท์ของมันยังไม่ชัดเจนในทางที่ว่า "x86" ไม่ได้เป็น
CVn

Microsoft อ้างถึง x86_64 เป็น AMD64 ในโปรแกรมติดตั้งของพวกเขา
phuclv

7

ไบต์ที่ 5 ของไฟล์ปฏิบัติการไบนารี Linux ( รูปแบบ ELF ดูที่ Wikipedia ) คือ 1 สำหรับไฟล์ปฏิบัติการที่ 32 บิต, 2 สำหรับไฟล์ปฏิบัติการ 64 บิต

หากต้องการดูสิ่งนี้สำหรับโปรแกรมที่ชื่อว่า "foo" ให้พิมพ์ที่บรรทัดคำสั่ง

od -t x1 -t c foo | head -n 2

2

หากคุณต้องการหลีกเลี่ยงท่อ 'หัว' คุณสามารถทำได้

od -An -t x1 -j 4 -N 1 foo

นี่จะพิมพ์ 01 ถ้า foo เป็นไบนารี 32 บิตและ 02 ถ้าเป็น 64 มันอาจยังมีช่องว่างนำบางส่วน - น่ารู้ว่าคุณกำลังทำการเปรียบเทียบอัตโนมัติกับผลลัพธ์

หากพบว่ามีประโยชน์ในคอนเทนเนอร์ Ubuntu Docker พื้นฐานที่ไม่ได้ติดตั้ง 'ไฟล์'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.