短い質問: Linux ディストリビューションでmips、mipsel、mips64、およびmips64elを確実に区別するにはどうすればよいですか?
より長い説明:
多くのアーキテクチャ向けに、静的にビルドされた/ディストリビューションに依存しないバイナリ (TeX 用) を提供しています。インストール スクリプトは通常実行され、オペレーティング システムuname -s
とuname -m
アーキテクチャを決定します。次に、その決定に基づいてサーバーからバイナリがフェッチされるため、確実に機能する必要があります。そして、そうです。Mac OS X 10.6 と Debian を除くほぼすべての場所。Mac は64 ビット アプリケーションを実行する OS でi386を報告しますが、Debian は32 ビット OS でmips64を報告します。
mips64 のDebianはプロセッサの種類を正しく報告しますが、少なくとも 2 つの理由で役に立ちません。
- OSはその名の通り64ビットではなく、32ビットです。
- リトルエンディアンモードで動作しています。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を誤って報告します。