Как отличить типы mips cpu в linux при отсутствии dpkg-архитектуры? - PullRequest
3 голосов
/ 18 августа 2011

Короткий вопрос: как я могу надежно различить mips , mipsel , mips64 и mips64el в любом дистрибутиве Linux?

Более подробное объяснение:

Мы предоставляем статически построенные / независимые двоичные файлы (для TeX) для многих архитектур.Сценарий установки обычно запускает uname -s и uname -m для определения операционной системы и архитектуры.Двоичные файлы затем выбираются с сервера на основе этого решения, поэтому он должен работать надежно.И это так.Почти везде, кроме Mac OS X 10.6 и Debian.Mac будет сообщать i386 в ОС, в которой работают 64-разрядные приложения, а Debian сообщает mips64 для 32-разрядных ОС.

Debian в mips64 правильно сообщает тип процессора, но это не помогает мне по крайней мере по двум причинам:

  1. ОС 32-битная, а не 64-битная, как можно предположить из названия.
  2. Itработает в режиме с прямым порядком байтов.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.

Первая проблема уже была рассмотрена здесь: Как определить, является ли данный Linux 32-битным или 64-битным?

Команда

getconf LONG_BIT

правильно сообщает 32 в моей системе.

Но как мне определить, является ли она прямым или младшим порядковым номером?

Я понял, что config.guess может определить разницу, но это происходит благодаря запуску компилятора, который может отсутствовать на компьютере конечного пользователя.Вдобавок к этому config.guess полностью игнорирует тот факт, что операционная система работает в 32-разрядном режиме и ошибочно сообщает mips64el вместо mipsel .

Ответы [ 3 ]

5 голосов
/ 17 мая 2012

Команда file сообщает вам:

$ file my_binary_name

my_binary_name: 32-битный ELF LSB исполняемый файл, MIPS, MIPS-I версии 1 (SYSV), динамически связанный (использует разделяемые библиотеки), для GNU / Linux 2.6.18, с неизвестной способностью 0xf41 = 0x756e6700, с неизвестной способностью 0x70100 = 0x1040000, раздетой

LSB там означает наименьшийзначащий байт, означающий little-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)

0 голосов
/ 22 октября 2016

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
0 голосов
/ 31 января 2012

Я понимаю, что это старый вопрос, но он остается без ответа.

Вы уже знаете размер бита, так что вы можете проверить:

case "$var" in
mips64el | mipsel) endian=little;;
mips64 | mips) endian=big;;  # or: echo big;; if you need to capture it

(где $ varсодержит вашу строку следующим образом: обратите внимание, что вы можете сопоставить с шаблоном в случае; см .: документация POSIX sh .)

Если нет, вы сможете проверить определение из autoconf;используйте MIPSEL макрос .

...