linux - 当缺少 dpkg 架构时,如何区分 linux 上的 mips cpu 类型?

标签 linux architecture mips endianness mips64

简短的问题:如何在任何 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。它通常可以切换,但 OS 只能在一种模式下运行,并且 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 发行版中。

这里已经解决了第一个问题:How to determine whether a given Linux is 32 bit or 64 bit?

命令

getconf LONG_BIT

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

但是如何判断是大端还是小端呢?

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

那里的 LSB 代表最低有效字节,意思是小端。给定 big-endian 二进制文件的输出将是 MSB,最高有效字节。

请注意,MIPS 有 3 个 ABI(实际上更多),其中一个是 n32。 n32 具有 native 64 位整数,但只有 32 位指针(并且需要 64 位内核)。

对于 n32 二进制文件 file 仍将报告 32 位:

ELF 32-bit LSB executable, MIPS, N32 MIPS-III version 1 (SYSV)

o32(debian 使用什么):

ELF 32-bit LSB executable, MIPS, MIPS-III version 1 (SYSV)

n64:

ELF 64-bit LSB executable, MIPS, MIPS-III version 1 (SYSV)

关于linux - 当缺少 dpkg 架构时,如何区分 linux 上的 mips cpu 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7101038/

相关文章:

linux - Asterisk 立即终止 WebRTC (JSSIP) 调用

architecture - 洋葱结构与六边形相比

visual-studio - 防止 .NET Core 嵌套项目引用

assembly - $ 在 MIPS 程序集中是什么意思?

c - 程序中的变量是否连续存储在内存中?

linux - 哪个gfortran编译器在science linux 6下支持 "real*16 or real(kind=16)"?

c - 从 socket 到管道的接头卡住

arrays - 向地址添加直接值

linux - 如果 linux 中的任何 PID 超过某个限制,如何发出警报?

database - 寻找进行大规模集合比较的最佳工具