当没有dpkg体系结构时,如何区分linux上的mips cpu类型?

当没有dpkg体系结构时,如何区分linux上的mips cpu类型?,linux,architecture,mips,endianness,mips64,Linux,Architecture,Mips,Endianness,Mips64,简短问题:在任何linux发行版上,如何可靠地区分mips、mipsel、mips64和mips64el 详细解释: 我们为许多体系结构提供静态构建/分发独立的二进制文件(用于TeX)。安装脚本通常运行uname-s和uname-m,以确定操作系统和体系结构。然后根据该决定从服务器获取二进制文件,所以它需要可靠地工作。确实如此。除了MacOSX10.6和Debian之外,几乎所有地方都有。Mac将在运行64位应用程序的操作系统上报告i386,而Debian将在32位操作系统上报告mips64 m

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

详细解释:

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

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

  • OS是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体系结构对于该任务来说是完美的,只是它不存在于其他Linux发行版上

    第一个问题已经在这里解决了:

    命令

    getconf LONG_BIT
    
    在我的系统上正确地报告32

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


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

    我意识到这是一个老问题,但它没有得到回答,所以就这样

    您已经知道位的大小,因此可以检查:

    case "$var" in
    mips64el | mipsel) endian=little;;
    mips64 | mips) endian=big;;  # or: echo big;; if you need to capture it
    
    (其中$var保存给定的字符串:注意,您可以在case中进行模式匹配;请参阅: )


    如果没有,您应该能够从autoconf测试define;使用。

    文件命令告诉您:

    $file我的\u二进制\u名称

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

    那里的LSB代表最低有效字节,表示小尾端。给定大端二进制文件的文件输出将是MSB,即最高有效字节

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

    对于n32二进制文件,文件仍将报告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)


    lscpu
    应该可以工作。
    例如:

    # 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 #lscpu 架构:mips 字节顺序:小端 中央处理器:4 在线CPU列表:0-3 每个芯的螺纹数:2 每个插座的芯数:2 插座:1个
    您是否试图回答“如何根据架构名称设置名为endian的变量”?因为我要的是相反的。问题是我不知道正确的架构名称应该是什么,我想根据endianess来确定名称。但我不知道如何在不运行编译器的情况下确定endianess。我下面提供的答案有问题吗?如果不是,请接受。因此,当编译器不可用时,最好的选择是简单地执行类似于
    文件$(哪个文件)
    的操作,以检查系统是32位还是64位,以及LSB与HSB的比较?在带有胖二进制文件的Mac OS X上,这是不可行的,但我想这是我在mips*linux上的唯一选择。感谢您解释有关n32/o32的额外信息。为n32/o32编译的二进制文件彼此兼容吗?我不知道胖二进制文件的输出是什么样子,所以我不能说,但您已经知道Mac OS X上的胖二进制文件包含PowerPC(big-endian)和x86(little-endian)代码,所以在这种情况下它们没有什么特别有趣的。你关于MIPS ABI兼容性的问题让我困惑,因为ABI或多或少是天生不兼容的。如果这是你的问题,它们可以在同一个系统上共存。o32库位于
    /lib
    中,n32位于
    /lib32
    中,n64位于
    /lib64
    中。