Вопрос: Как узнать, является ли система 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


Источник


Вот решение, использующее perl: stackoverflow.com/questions/2610849/... - slu


Ответы:


В Большой Эндиан-Системе (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



Это верхний регистр I (глаз), а не в нижнем регистре l (элл) кстати. - Dennis Williamson
(Solaris) -> (Solaris, Sparc), хотя Sparc> = V9 является бинарным. - Cristian Ciupitu
Позаботьтесь, чтобы объяснить, как это работает? - Massimo
Это не работает на Android (Nexus 5). Не знаю, почему ... - wjandrea
printf "\x1" | od -to2 | awk 'NR==1{print$2==1}' - Kaz


Вот более элегантный однострочный скрипт 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



Это не будет работать на системах RHEL 5.x / CentOS 5.x, на которых запущен Python 2.4.x. Вот исправление: python -c "import sys;sys.exit(int(sys.byteorder!='big'))" - JPaget


Если вы находитесь на довольно недавней машине 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 "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))", Код выхода равен 0 для большого endian и 1 для little endian. - Cristian Ciupitu
Ха! Довольно аккуратно! Спасибо, парни! - Viet


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



Это в точку что мне нужно. Благодаря! - Vasily G
Я думаю, вы имеете в виду произвольный ELF ... Поскольку существуют другие исполняемые типы, включая сценарии оболочки, perl, python и т. Д. Не говоря о том, что вы ошибаетесь иначе, просто говоря, что стоит помнить, что существуют другие исполняемые типы (и для интереса код находится в текстовом сегменте, поэтому ошибка загрузки старого текстового файла). - Pryftan
@Pryftan Спасибо, что указали это. Исправлено! - Tong Zhou
@TongZhou Добро пожаловать; Рад помочь! - Pryftan


Однострочная команда, основанная на формате ELF:
hexdump -s 5 -n 1 /bin/sh


0
2018-04-01 11:36



Изменить: -n 1, извините;) - fae
Это тот же самый метод, что и предыдущий ответ, который также предоставил более подробную информацию, чем ваша. - kasperd


Немного разные требования. Мне нужен тест, подобный этому, в скрипте конфигурации сборки программы, чтобы определить, компилировать целевую машину бит или немного 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



Не то, что это необходимо для всех проектов, но autoconf / automake не имеет этой проверки? Мои проекты всегда достаточно малы, где я могу создавать свои собственные Make-файлы (хотя и не всегда основные), поэтому я не знаю этих инструментов, кроме внесения некоторых изменений, когда это необходимо, и общего интерфейса. Но я действительно задаюсь вопросом, есть ли у них обнаружение. Возможно, вам это не нужно, даже если это так, просто подумал, что я выбрал бы эту возможность. - Pryftan