Вопрос: Как узнать, является ли система Linux большой эндией или маленькой?
Я знаю, что некоторые процессоры - Big Endian, а другие - Little Endian. Но есть ли команда, скрипт bash, скрипт python или серия команд, которые могут использоваться в командной строке, чтобы определить, является ли система Big Endian или Little Endian? Что-то вроде:
if <some code> then
echo Big Endian
else
echo Little Endian
fi
Или проще просто определить, какой процессор использует система, и идти с этим, чтобы определить свою Endianess?
82
2017-07-23 16:58
Источник
Ответы:
В Большой Эндиан-Системе (Solaris на SPARC)
$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6
0
В маленькой системе endian (Linux на x86)
$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6
1
Решение выше умное и отлично работает для Linux * 86 и Solaris Sparc.
Мне понадобилось решение с оболочкой (без Perl), которое также работало на AIX / Power и HPUX / Itanium. К сожалению, последние два не играют хорошо: AIX сообщает «6», а HPUX дает пустую строку.
Используя ваше решение, я смог создать что-то, что работало во всех этих Unix-системах:
$ echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6
Что касается решения Python, которое было опубликовано, оно не работает в Jython, потому что JVM рассматривает все как большое. Если кто-нибудь может заставить его работать в Jython, пожалуйста, напишите!
Кроме того, я нашел это, что объясняет сущность различных платформ. Некоторые аппаратные средства могут работать в любом режиме в зависимости от того, что выбирает O / S: http://labs.hoffmanlabs.com/node/544
Если вы собираетесь использовать awk, эту строку можно упростить, чтобы:
echo -n I | od -to2 | awk '{ print substr($2,6,1); exit}'
Для небольших ящиков Linux, которые не имеют «od» (скажем, OpenWrt), попробуйте «hexdump»:
echo -n I | hexdump -o | awk '{ print substr($2,6,1); exit}'
99
2017-07-23 17:04
Вот более элегантный однострочный скрипт python
python -c "import sys;sys.exit(0 if sys.byteorder=='big' else 1)"
код выхода 0
означает большой эндиан и 1
означает малое число
или просто изменить sys.exit
в print
для вывода на печать
28
2018-05-21 20:26
Если вы находитесь на довольно недавней машине Linux (большинство всего после 2012 года) тогда lscpu
теперь содержит следующую информацию:
$ lscpu | grep Endian
Byte Order: Little Endian
Это было добавлено к lscpu
в версии 2.19, которая находится в Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04.
Обратите внимание, что я нашел этот ответ от этот потрясающий ответ на Unix.SE, Этот ответ содержит много соответствующей информации, этот пост - всего лишь краткое изложение этого.
25
2018-06-15 11:26
Основной ответ можно упростить, используя awk
:
В системе Big Endian (Solaris, SPARC)
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
0
В системе Little Endian (Linux, Intel)
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
1
Новые ядра Linux
Начиная с версии 2.19 пакета util-linux команда lscpu
начал включать поле, относящееся к Endianness. Теперь вы можете просто использовать эту команду, чтобы найти это:
$ lscpu | grep -i byte
Byte Order: Little Endian
Это было подтверждено на Ubuntu 12.10 и CentOS 6. Поэтому я бы согласился предположить, что большинство 3.0+ ядер Linux теперь предлагают это.
В системах Debian / Ubuntu вы также можете использовать эту команду, не зная, когда она станет доступной:
$ dpkg-architecture | grep -i end
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little
Рекомендации
10
2017-08-30 23:41
Этот скрипт Python должен работать на вас:
#!/usr/bin/env python
from struct import pack
if pack('@h', 1) == pack('<h', 1):
print "Little Endian"
else:
print "Big Endian"
9
2017-07-23 17:28
python -c "import sys; print(sys.byteorder)"
Он напечатает окончание системы.
6
2018-05-28 07:17
Я нашел способ сделать это в Jython. Поскольку Jython (Python on JVM) работает на виртуальной машине, он всегда сообщает о большом знаке, независимо от оборудования.
Это решение работает для Linux, Solaris, AIX и HPUX. Не тестировались в Windows:
from java.lang import System
for property, value in dict(System.getProperties()).items():
if property.endswith('cpu.endian'):
return value
3
2017-11-30 22:40
Вы можете использовать формат файла ELF для определения соответствия вашей системы. Например, напечатайте первые шесть байтов произвольного файла ELF в шестнадцатеричном формате:
xxd -c 1 -l 6 /bin/ls
0000000: 7f .
0000001: 45 E
0000002: 4c L
0000003: 46 F
0000004: 02 .
0000005: 01 .
Если последняя строка (смежный байт) равна 01, согласно Формат ELF, 01 немного endian и 02 большой endian.
3
2018-01-15 18:23
Однострочная команда, основанная на формате ELF:
hexdump -s 5 -n 1 /bin/sh
0
2018-04-01 11:36
Немного разные требования. Мне нужен тест, подобный этому, в скрипте конфигурации сборки программы, чтобы определить, компилировать целевую машину бит или немного endian, без выполнения кода, Сценарий должен внести депозит #define HAVE_LITTLE_ENDIAN 1
в config.h
заголовок, или #define HAVE_LITTLE_ENDIAN 0
,
Целевая машина компиляции может отличаться от машины сборки, поскольку мы можем выполнять кросс-компиляцию, что также объясняет, почему тест не должен пытаться запускать скомпилированный код. Не может быть и речи о том, чтобы иметь небольшую программу С с printf
заявление, которое выплевывает ответ.
Возможное решение - это. Мы генерируем файл, называемый conftest.c
который содержит следующее:
#define USPELL(C0, C1, C2, C3) \
((unsigned) C0 << 24 | \
(unsigned) C1 << 16 | \
(unsigned) C2 << 8 | (unsigned) C3)
unsigned x[6] = {
0,
USPELL('L', 'I', 'S', 'P'),
USPELL('U', 'N', 'I', 'X'),
USPELL('C', 'O', 'R', 'E'),
USPELL('D', 'W', 'I', 'M'),
0
};
Теперь мы скомпилируем это conftest.o
с помощью:
$ /path/to/cross-compiling/cc conftest.c -c
Затем мы запускаем:
$ strings conftest.o
PSILXINUEROCMIWD
Если строка PSILXINUEROCMIWD
происходит, мишень малозначительна. Если строка LISPUNIXCOREDWIM
происходит, это big-endian. Если ни одна из строк не возникает или, что еще более удивительно, оба они делают, тест не удался.
Этот подход работает, потому что константы «fourcc», вычисленные в программе, имеют независимые от машины значения, обозначающие одни и те же целые числа, независимо от цели. Их представление хранилища в объектном файле следует за контентом целевой системы, и это видно через характерное представление в strings
,
Два слова с нулевой защитой гарантируют, что строка изолирована. Это не является строго необходимым, но оно гарантирует, что строка, которую мы ищем, не встроена в какую-либо другую строку, что означает, что strings
выведет его на линию самостоятельно.
Постскриптум USPELL
макрос не вставляет в конец вставки аргументов, поскольку он создан для этой конкретной цели, а не для повторного использования.
0
2018-05-26 00:37