简短的问题:如何在任何Linux发行版上可靠地区分mips,mipsel,mips64和mips64el?

更长的解释:

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

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

  • OS是32位的,而不是顾名思义的64位。
  • 它以低字节序模式运行。 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命令告诉您:

    那里的LSB代表最低有效字节,表示小尾数。给定一个大端二进制文件的文件输出将是MSB(最高有效字节)。
    请注意,MIPS具有3个ABI(实际上更多),其中一个是n32。 n32具有 native 64位整数,但只有32位指针(并且需要64位内核)。
    对于n32二进制文件,file仍将报告32位:

    o32(debian使用什么):

    n64:

    关于linux - dpkg体系结构不存在时,如何区分Linux上的mips cpu类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7101038/

    10-10 13:59
    查看更多