2011-08-18 22 views
2

短的問題:我怎麼能可靠地在任何Linux發行 MIPS mipsel體系 MIPS64 mips64el區分?當dpkg-architecture不存在時,如何區分linux上的mips cpu類型?

更詳細的解釋:

我們提供靜態內置/分配獨立的二進制文件(特)許多體系。安裝腳本通常運行uname -suname -m來確定操作系統和體系結構。根據該決定從服務器獲取二進制文件,因此它需要可靠地工作。它確實如此。除了Mac OS X 10.6和Debian外,幾乎在任何地方。 Mac會在運行64位應用程序的操作系統上報告 i386,而對於32位操作系統,Debian報告 mips64

的Debian上 MIPS64正確報告處理器類型,但是這並不能幫助我至少有兩個方面的原因:

  1. 操作系統是32位,而不是64位的名稱可能暗示。
  2. 它以小端模式運行。 Debian稱 mipsel,而不是 mips。它通常可以切換,但操作系統只能在一種模式下運行,並且mips軟件通常與mipsel不兼容。

這裏有一些輸出從系統命令:

$ file my_binary_name 
my_binary_name: ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, with unknown capability 0xf41 = 0x756e6700, with unknown capability 0x70100 = 0x1040000, stripped 

$ dpkg-architecture 
DEB_BUILD_ARCH=mipsel 
DEB_BUILD_ARCH_OS=linux 
DEB_BUILD_ARCH_CPU=mipsel 
DEB_BUILD_ARCH_BITS=32 
DEB_BUILD_ARCH_ENDIAN=little 
DEB_BUILD_GNU_CPU=mipsel 
DEB_BUILD_GNU_SYSTEM=linux-gnu 
DEB_BUILD_GNU_TYPE=mipsel-linux-gnu 
DEB_HOST_ARCH=mipsel 
... 

dpkg的架構將是完美的任務,但它不存在於其他Linux發行版。

的第一個問題已經解決這裏:How to determine whether a given Linux is 32 bit or 64 bit?

命令

getconf LONG_BIT 

正確地報告我的系統上32。

但是,我該如何確定它是大端還是小端?

我發現config.guess可以確定差異,但它通過運行最終用戶計算機上可能不存在的編譯器來實現。除此之外,config.guess完全忽略了這樣的事實,即操作系統在32位模式下工作,並錯誤地報告了 mips64el而不是 mipsel

+0

什麼毛病我下面提供的答案嗎?請接受它,如果沒有。 – mattst88

回答

5

file命令告訴你:

$文件my_binary_name

my_binary_name:ELF 32位LSB可執行文件,MIPS,MIPS-I版本1(SYSV),動態鏈接(使用共享庫),爲GNU/Linux 2.6.18,未知能力0xf41 = 0x756e6700,未知能力0x70100 = 0x1040000,剝離

的LSB有代表最低顯著字節,meanin g小尾數。給定big-endian二進制文件的輸出將是MSB,最重要的字節。

請注意,MIPS有3個ABI(實際上更多),其中之一是n32。 n32具有本機64位整數,但只有32位指針(並且需要64位內核)。

對於N32的二進制文件file仍然將報告32位:

ELF 32位LSB的可執行文件,MIPS,N32 MIPS-III版本1(SYSV)

O32(什麼Debian使用):

ELF 32位LSB的可執行文件,MIPS,MIPS-III版本1(SYSV)

N64:

ELF 64位LSB的可執行文件,MIPS,MIPS-III版本1(SYSV)

+0

因此,當編譯器不可用時,最好的辦法是簡單地執行'file $(which file)'來檢查系統是32位還是64位,LSB與HSB?在Mac OS X與胖二進制文件這將無法正常工作,但我想這是我唯一的選擇在mips * linux的情況下。感謝您解釋關於n32/o32的額外位。爲n32/o32編譯的二進制文件是否相互兼容? – Mojca

+0

我不知道「文件」輸出看起來像胖二進制文件,所以我不能說,但你已經知道Mac OS X上的胖二進制文件包含PowerPC(大端)和x86(小端)代碼,所以在這種情況下,他們沒有什麼特別有趣的。您關於MIPS ABI兼容性的問題讓我感到困惑,因爲ABI或多或少本質上不兼容。如果這是你的問題,他們可以在同一個系統上共存。 o32庫位於'/ lib'中,n32位於'/ lib32'中,n64位於'/ lib64'中。 – mattst88

0

我意識到這是一個老問題,但它沒有答案,所以在這裏。

您已經知道了位的大小,所以你一定可以檢查:

case "$var" in 
mips64el | mipsel) endian=little;; 
mips64 | mips) endian=big;; # or: echo big;; if you need to capture it 

(其中$ VAR持有給出您的字符串:注意:您可以模式匹配的情況下;見: the POSIX sh documentation。)

如果不是,您應該能夠從autoconf測試一個定義;使用the MIPSEL macro

+0

你想回答「如何設置基於架構名稱的稱爲endian的變量」?因爲我要求相反。問題是我不知道什麼是合適的架構名稱,我想根據永久性來確定名稱。但是我不知道如何在不運行編譯器的情況下確定是否存在。 – Mojca

0

lscpu應該工作。
例如:

 
# lscpu 
Architecture:   mips 
Byte Order:   Little Endian 
CPU(s):    4 
On-line CPU(s) list: 0-3 
Thread(s) per core: 2 
Core(s) per socket: 2 
Socket(s):    1