当dpkg-architecture不存在时,如何区分linux上的mips cpu类型?

时间:2011-08-18 00:17:45

标签: linux architecture mips endianness mips64

简短的问题:如何在任何linux上可靠地区分 mips mipsel mips64 mips64el 分配

更长的解释:

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

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

  1. 操作系统是32位,而不是名称可能暗示的64位。
  2. 它以little-endian模式运行。 Debian称之为 mipsel ,而不是 mips 。它通常可以切换,但操作系统只能在一种模式下运行,而mips软件通常与mipsel不兼容。
  3. 以下是系统命令的一些输出:

    $ 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 的事实。

3 个答案:

答案 0 :(得分:5)

file命令告诉你:

  

$ 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代表最低有效字节,意味着小端。给定big-endian二进制文件的文件输出将是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)

答案 1 :(得分:0)

我意识到这是一个老问题,但是没有答案,所以这里就是。

你已经知道了比特大小,所以你肯定可以检查:

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

答案 2 :(得分:0)

ArticleService应该有效 例如:

# lscpu
Architecture:          mips
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1