简短的问题:如何在任何Linux发行版上可靠地区分mips,mipsel,mips64和mips64el?
更长的解释:
我们为许多架构提供静态构建/发行独立的二进制文件(用于TeX)。安装脚本通常运行uname -s
和uname -m
以确定操作系统和体系结构。然后根据该决定从服务器获取二进制文件,因此它需要可靠地工作。确实如此。除了Mac OS X 10.6和Debian,几乎所有地方。 Mac将在运行64位应用程序的OS上报告i386,而Debian将报告32位OS的mips64。
mips64上的Debian可以正确报告处理器类型,但这至少有两个原因不能帮助我:
以下是系统命令的一些输出:
$ 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/