5

短い質問: Linux ディストリビューションでmipsmipselmips64、およびmips64elを確実に区別するにはどうすればよいですか?

より長い説明:

多くのアーキテクチャ向けに、静的にビルドされた/ディストリビューションに依存しないバイナリ (TeX 用) を提供しています。インストール スクリプトは通常実行され、オペレーティング システムuname -suname -mアーキテクチャを決定します。次に、その決定に基づいてサーバーからバイナリがフェッチされるため、確実に機能する必要があります。そして、そうです。Mac OS X 10.6 と Debian を除くほぼすべての場所。Mac は64 ビット アプリケーションを実行する OS でi386を報告しますが、Debian は32 ビット OS でmips64を報告します。

mips64 のDebianはプロセッサの種類を正しく報告しますが、少なくとも 2 つの理由で役に立ちません。

  1. OSはその名の通り64ビットではなく、32ビットです。
  2. リトルエンディアンモードで動作しています。Debian はこれをmipsではなくmipselと呼んでいます。頻繁に切り替えることができますが、OS は 1 つのモードでしか動作せず、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-architecture は、他の Linux ディストリビューションには存在しないことを除けば、このタスクに最適です。

最初の問題は、ここですでに解決されています:与えられた Linux が 32 ビットか 64 ビットかを判別するにはどうすればよいですか?

コマンド

getconf LONG_BIT

私のシステムでは32を適切に報告します。

しかし、それがビッグ エンディアンかリトル エンディアンかを判断するにはどうすればよいでしょうか。

config.guess が違いを判断できることがわかりましたが、エンドユーザーのコンピューターに存在しない可能性があるコンパイラーを実行することで判断できます。その上、 config.guess は、オペレーティング システムが 32 ビット モードで動作するという事実を完全に無視し、mipselではなくmips64elを誤って報告します。

4

3 に答える 3

8

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 は最下位バイトを表し、リトルエンディアンを意味します。ビッグ エンディアン バイナリが指定された file の出力は、最上位バイトの MSB になります。

MIPS には 3 つの ABI (実際にはそれ以上) があり、そのうちの 1 つが 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)

于 2012-05-17T04:59:46.093 に答える
-1

これは古い質問だと思いますが、答えられていないので、ここに行きます。

ビットサイズはすでにわかっているので、次のことを確認できます。

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

(ここで、 $var は与えられた文字列を保持します: 場合によってはパターンマッチができることに注意してください; 参照: POSIX sh ドキュメント.)

そうでない場合は、autoconf からの定義をテストできるはずです。MIPSELマクロを使用ます。

于 2012-01-31T10:06:08.983 に答える