5

简短的问题:如何在任何 Linux 发行版上可靠地区分mipsmipselmips64mips64el ?

更长的解释:

我们为许多架构提供静态构建/分发独立的二进制文件(用于 TeX)。安装脚本通常运行uname -suname -m确定操作系统和体系结构。然后根据该决定从服务器获取二进制文件,因此它需要可靠地工作。它确实如此。几乎无处不在,除了 Mac OS X 10.6 和 Debian。Mac 会在运行 64 位应用程序的操作系统上报告i386 ,而 Debian 会在 32 位操作系统上报告mips64 。

mips64上的 Debian正确报告处理器类型,但这对我没有帮助,至少有两个原因:

  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-architecture 将非常适合该任务,除了它不存在于其他 Linux 发行版上。

第一个问题已经在这里解决了:如何确定给定的 Linux 是 32 位还是 64 位?

命令

getconf LONG_BIT

在我的系统上正确报告 32。

但是我如何确定它是大端还是小端呢?

我发现 config.guess 可以确定差异,但它是通过运行最终用户计算机上可能不存在的编译器来确定的。除此之外 config.guess 完全忽略了操作系统在 32 位模式下工作并错误地报告mips64el而不是mipsel的事实。

4

3 回答 3

8

文件命令告诉你:

$ 文件 my_binary_name

my_binary_name:ELF 32 位LSB可执行文件,MIPS,MIPS-I 版本 1 (SYSV),动态链接(使用共享库),用于 GNU/Linux 2.6.18,具有未知功能 0xf41 = 0x756e6700,具有未知功能 0x70100 = 0x1040000,剥离

那里的 LSB 代表最低有效字节,意思是小端。给定大端二进制文件的输出将是 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)

于 2012-05-17T04:59:46.093 回答
3

lscpu应该管用。
例如:

#lscpu
架构:mips
字节顺序:小尾数
CPU:4
在线 CPU(s) 列表:0-3
每个内核的线程数:2
每个插槽的核心数:2
插座:1
于 2016-10-22T18:15:03.293 回答
-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 回答