没有dpkg-architecture时如何区分linux上的mips cpu类型?

Posted

技术标签:

【中文标题】没有dpkg-architecture时如何区分linux上的mips cpu类型?【英文标题】:How to distinguish between mips cpu types on linux when dpkg-architecture is absent? 【发布时间】:2011-10-29 09:15:02 【问题描述】:

小问题:如何在任何 linux 上可靠地区分 mipsmipselmips64mips64el分布?

更长的解释:

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

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

    操作系统是 32 位,而不是顾名思义的 64 位。 它以小端模式运行。 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 发行版上不存在。

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

命令

getconf LONG_BIT

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

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

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

【问题讨论】:

我在下面提供的答案有问题吗?如果没有请接受。 【参考方案1】:

文件命令告诉你:

$ 文件 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)

【讨论】:

因此,当编译器不可用时,最好的办法是简单地执行file $(which file) 之类的操作来检查系统是 32 位还是 64 位以及 LSB 与 HSB?在带有胖二进制文件的 Mac OS X 上,这是行不通的,但我想这是 mips* linux 的唯一选择。感谢您解释有关 n32/o32 的额外信息。为 n32/o32 编译的二进制文件是否相互兼容? 我不知道胖二进制文件的file 输出是什么样的,所以我不能说,但你已经知道 Mac OS X 上的胖二进制文件包含 PowerPC(大端)和 x86 (小端)代码,所以在这种情况下它们没有什么特别有趣的。您关于 MIPS ABI 兼容性的问题让我感到困惑,因为 ABI 或多或少本质上是不兼容的。如果这是您的问题,它们可以在同一系统上共存。 o32 库位于 /lib,n32 位于 /lib32,n64 位于 /lib64【参考方案2】:

lscpu 应该可以工作。 例如:

#lscpu 架构:mips 字节顺序:小尾数 CPU:4 在线 CPU(s) 列表:0-3 每个内核的线程数:2 每个插槽的核心数:2 插座:1

【讨论】:

【参考方案3】:

我知道这是一个老问题,但没有答案,所以就这样吧。

您已经知道位大小,所以您肯定可以检查:

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。

【讨论】:

您是否要回答“如何根据架构名称设置名为 endian 的变量”?因为我要求反过来。问题是我不知道正确的架构名称应该是什么,我想根据字节序确定名称。但我不知道如何在不运行编译器的情况下确定字节序。

以上是关于没有dpkg-architecture时如何区分linux上的mips cpu类型?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:当没有物理列或值用于区分实例时,鉴别器列如何工作?

如何区分不存在的服务或缺少记录?

如何区分 MS Access 完整版和 Access 运行时

如何区分 UIScrollView 中的平移和滚动

吉利g网和l网的区分车型都有哪些

如何在 Postgres 中删除区分大小写?