Linux

64 位核心,但所有 32 位 ELF 可執行執行程序,這是怎麼回事?

  • April 21, 2021

輸出uname

root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux

但是/sbin/init執行檔顯示為 32 位:

root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

該系統的其他方面似乎也與事情相矛盾:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32

64 位核心可以安裝在 Debian 32 位上。您可以在其軟體包頁面上看到 amd64 核心可用於 32 位 Debian 。這可以用作使用啟用 PAE 的核心來支持超過 4G 的總 RAM 的替代方案。請注意,32 位二進製文件仍然無法訪問每個程序超過大約 3G 的 RAM。

所有支持x64指令集(也稱為 x86_64 或 amd64)的處理器也支持x86指令集(也稱為 i386 或 i686,嚴格來說是 x86 的特定版本)。對於ARM A64(出現在 ARMv8 中的新 64 位指令集)和 A32(“經典”32 位指令集的名稱)、SPARC64SPARC以及我相信MIPS64MIPS也是如此。所以在所有這些架構系列中,如果一個處理器可以執行 64 位程式碼,它也可以執行 32 位程式碼。

Linux 核心支持在 64 位核心上執行 32 位使用者態程式碼(我認為在上面提到的所有體系結構系列上)。核心必須是同構的(全部為 64 位或全部為 32 位),並且每個程序必須是同構的,但您可以在 64 位核心上混合使用 32 位和 64 位程序。反過來是不可能的:使用 32 位核心,您無法執行 64 位程序。

這是 Linux 中的一種設計選擇,其動機是希望在 64 位安裝上執行現有的 32 位二進製文件。其他 Unix 變體做出了不同的選擇:Solaris 可以在 32 位核心上執行 64 位程序,反之亦然,而 OpenBSD 不能在 64 位核心上執行 32 位程序。

您可以在 中獲取有關 CPU的資訊/proc/cpuinfo。如果您的 x86 CPU 有lm標誌,則它是 64 位 CPU。

預設情況下,uname -march顯示編譯核心的體系結構。Linux 可以設置程序的“個性”(使用personality)系統呼叫。您可以使用命令以不同的個性執行子程序setarchsetarch i686 someprogramlinux32 someprogram在返回的環境中執行指定的程序 while 或 在返回的環境中執行指定uname -m的程序。i686``setarch amd64 someprogram``linux64 someprogram``uname -m``amd64

file /sbin/init告訴你init程序是為什麼架構編譯的。儘管可以在安裝中混合 32 位和 64 位執行檔,但通常所有核心作業系統程序都來自相同的體系結構,因為它更易於管理。

$HOSTYPE是一個 bash 變數,它告訴你bash程序是為什麼架構編譯的。

getconf LONG_BIT讓您知道預設 C 編譯器是設置為編譯 32 位還是 64 位程序。更精確的測試是編譯並執行一個程序,該程序列印sizeof(void*)sizeof(size_t)呼叫getconf只能提供有關getconf認為是預設編譯器的資訊。

引用自:https://unix.stackexchange.com/questions/134391