Làm cách nào để xác định xem tệp nhị phân linux là 32 bit hay 64 bit?


24

Một hạt nhân 32 bit (x86) chỉ có thể chạy mã 32 bit. Một hạt nhân 64 bit (x86_64) có thể chạy cả mã 32 bit và 64 bit.

Tôi muốn biết liệu một máy có thể chạy được tệp thực thi hay không: nói cách khác, tôi có tệp nhị phân và tôi phải chạy trên Ubuntu 32 bit, nhưng tôi không biết tệp nhị phân có thực thi được 32 bit không .

Tôi đã sử dụng file lệnh, chỉ định thực thi được kiểm tra và đây là kết quả trả về:

ELF 64-bit LSB thực thi, x86-64, phiên bản 1 (SYSV), được liên kết động (sử dụng libs chung), cho GNU / Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6

Câu trả lời:


29

Câu trả lời cho câu hỏi trong tiêu đề nằm ngay ở đầu đầu ra:

ELB 64 bit thực thi LSB, x86-64

ELF là Định dạng có thể thực thi và có thể liên kết , định dạng tệp thực thi nhị phân được Linux sử dụng phổ biến nhất.

x86-64 là kiến ​​trúc của nhị phân, phiên bản 64 bit của tập lệnh x86 ban đầu được AMD giới thiệu . Vì những lý do nằm ngoài tôi, Microsoft gọi nó là "x64", nhưng đó là điều tương tự.

Nếu bạn cần biết kiến ​​trúc của chính kernel, bạn có thể sử dụng uname -mpi. Ví dụ, trên hệ thống của tôi, bản in đó:

x86_64 không rõ

có nghĩa là tôi đang chạy kernel x86-64.

Nếu bạn quan tâm đến chính CPU, hãy xem /proc/cpuinfochi tiết về (các) CPU được phát hiện bởi nhân Linux.

fileVí dụ, một tệp thực thi 80x86 32 bit được xác định bằng :

ELF 32-bit LSB thực thi, Intel 80386 , phiên bản 1 (SYSV), được liên kết động (sử dụng lib được chia sẻ), cho GNU / Linux 2.6.8, bị tước

cho chúng tôi biết rằng đó là một tệp thực thi 32 bit bằng cách sử dụng tập lệnh Intel 80386 (có thể có phần mở rộng).

Lưu ý rằng nó không đơn giản như kiến ​​trúc 32 bit so với 64 bit. Ví dụ, nhân Linux hỗ trợ các kiến ​​trúc 32 bit như Intel 80386, AVR32 , S / 390Unicore32 . Về mặt 64 bit, Linux có thể sử dụng được trên PA-RISC , x86-64, ItaniumAlpha , trong số những thứ khác. Tuy nhiên, không phải tất cả các bản phân phối đều cung cấp nhị phân cho tất cả các kiến ​​trúc, tuy nhiên (và tôi nghi ngờ có bất kỳ bản phân phối nào nhắm đến tất cả các kiến trúc CPU được hỗ trợ như nhau). Vì vậy, nếu bạn muốn biết liệu một nhị phân nhất định có thể thực thi được trên một hệ thống nhất định hay không, bạn cần xem xét kiến trúc , thay vì kích thước từ gốc của CPU.


1
"Những lý do nằm ngoài tôi". Tôi vẫn nhớ ngày tôi phát hiện ra rằng x64 là 64 bit và x86 là 32 bit.
Paul Draper

1
@PaulDraper Thuật ngữ "x86" có từ nguyên rõ ràng; nó bắt nguồn từ các CPU dòng 80x86 của Intel, phân biệt chúng với các phiên bản trước như 8008 hoặc 8080, và ngày nay thường đề cập đến các biến thể có khả năng 32 bit (tập lệnh IA-32) (80386, 80486, Pentium và mới hơn ). Các số mô hình gần đây hơn này thường được viết tắt bằng cách bỏ qua "80" ở đầu, do đó (ngụ ý 32-bit) x86 khớp với 386, 486, v.v. Tuy nhiên, tôi không biết bất kỳ CPU 64 bit nào có số kiểu một cấu trúc tương tự kết thúc bằng "64"; chắc chắn cả AMD và Intel đều không sử dụng sơ đồ đặt tên như vậy ngày nay.
CVn

Mặc dù x64 một thuật ngữ rất phổ biến. Ví dụ ngẫu nhiên: microsoft.com/en-us/doad/details.aspx?id=42482
Paul Draper

@PaulDraper Hiện tại nó phổ biến trong thế giới Microsoft, nhưng từ nguyên của nó vẫn chưa rõ ràng theo cách mà "x86" không có.
một CVn

Microsoft gọi x86_64 là AMD64 trong trình cài đặt của họ
phuclv

7

Byte thứ 5 của tệp thực thi nhị phân Linux ( định dạng ELF, xem Wikipedia ) là 1 cho tệp thực thi 32 bit, 2 cho tệp thực thi 64 bit.

Để xem điều này cho một chương trình có tên "foo", gõ vào dòng lệnh

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

2

Nếu bạn muốn tránh đường ống 'đầu', bạn có thể làm

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

Điều này sẽ in 01 nếu foo là nhị phân 32 bit và 02 nếu là 64. Nó vẫn có thể bao gồm một số khoảng trắng hàng đầu - đáng để biết nếu bạn đang thực hiện bất kỳ so sánh tự động nào về kết quả.

Nếu thấy điều này hữu ích trong bộ chứa Ubuntu Docker cơ bản nơi 'tệp' chưa được cài đặt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.