Linux 시스템이 빅 엔디안인지 리틀 엔디안인지 확인하는 방법은 무엇입니까?


91

특정 프로세서는 Big Endian이고 다른 프로세서는 Little Endian이라는 것을 알고 있습니다. 그러나 시스템이 Big Endian인지 Little Endian인지 확인하기 위해 명령 줄에서 사용할 수있는 명령, bash 스크립트, python 스크립트 또는 일련의 명령이 있습니까? 다음과 같은 것 :

if <some code> then
    echo Big Endian
else
    echo Little Endian
fi

아니면 시스템이 어떤 프로세서를 사용하고 있는지 판단하여 엔디안을 결정하는 것이 더 간단합니까?


다음은 perl을 사용하는 솔루션입니다. stackoverflow.com/questions/2610849/…
slu

답변:


110

빅 엔디안 시스템 (Solaris on SPARC)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 

0

리틀 엔디안 시스템 (x86의 Linux)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 

1


위의 솔루션은 영리하며 Linux * 86 및 Solaris Sparc에 적합합니다.

AIX / Power 및 HPUX / Itanium에서도 작동하는 쉘 전용 (Perl 없음) 솔루션이 필요했습니다. 불행히도 마지막 두 가지는 좋지 않습니다. AIX는 "6"을보고하고 HPUX는 빈 줄을 제공합니다.

귀하의 솔루션을 사용하여 모든 유닉스 시스템에서 작동하는 것을 만들 수있었습니다.

$ echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6

누군가가 게시 한 Python 솔루션과 관련하여 JVM은 모든 것을 Big으로 취급하기 때문에 Jython에서는 작동하지 않습니다. 누구나 자이 썬에서 작동시킬 수 있다면 게시하십시오!

또한 다양한 플랫폼의 엔디안을 설명하는 이것을 발견했습니다. 일부 하드웨어는 O / S 선택에 따라 두 모드 중 하나로 작동 할 수 있습니다. http://labs.hoffmanlabs.com/node/544


awk를 사용하려는 경우이 줄을 다음과 같이 단순화 할 수 있습니다.

echo -n I | od -to2 | awk '{ print substr($2,6,1); exit}'

'od'(예 : OpenWrt)가없는 작은 Linux 상자의 경우 'hexdump'를 시도하십시오.

echo -n I | hexdump -o | awk '{ print substr($2,6,1); exit}'

2
그건 그렇고 I소문자 l(ell)가 아니라 대문자 (눈) 입니다.
Dennis Williamson

1
Sparc> = V9는 bi endian이지만 (Solaris)-> (Solaris, Sparc)입니다.
Cristian Ciupitu

1
그것이 어떻게 작동하는지 설명해 주시겠습니까?
Massimo

이것은 안드로이드 (Nexus 5)에서는 작동하지 않는 것 같습니다. 확실하지 않은 이유는 ...
wjandrea

printf "\x1" | od -to2 | awk 'NR==1{print$2==1}'
Kaz

35

상당히 최근의 Linux 머신 (2012 년 이후 대부분) 에 있다면 다음 lscpu정보가 포함됩니다.

$ lscpu | grep Endian
Byte Order:            Little Endian

이것은 lscpu버전 2.19에서 추가 되었으며 Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04에 있습니다.

나는에서이 대답을 발견합니다 Unix.SE에이 훌륭한 대답을 . 그 대답은 많은 관련 정보를 가지고 있으며,이 게시물은 그 정보를 요약 한 것입니다.


31

더 우아한 파이썬 한 줄 스크립트가 있습니다.

python -c "import sys;sys.exit(0 if sys.byteorder=='big' else 1)"

종료 코드 0는 빅 엔디안을 1의미하며 리틀 엔디안을 의미합니다

아니면 그냥 변경 sys.exitprint인쇄 가능한 출력


4
Python 2.4.x를 실행하는 RHEL 5.x / CentOS 5.x 시스템에서는 작동하지 않습니다. python -c "import sys;sys.exit(int(sys.byteorder!='big'))"
JPaget

10

주요 답변은 다음을 사용하여 약간 단순화 할 수 있습니다 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

최신 리눅스 커널

util-linux 패키지 버전 2.19 lscpu부터 Endianness 관련 필드를 포함 하여 명령이 시작되었습니다. 이제이 명령을 사용하여 간단히 찾을 수 있습니다.

$ lscpu | grep -i byte
Byte Order:            Little Endian

이것은 Ubuntu 12.10 및 CentOS 6에서 확인되었습니다. 따라서 대부분의 3.0+ Linux 커널이 현재 이것을 제공한다고 가정합니다.

데비안 / 우분투 시스템에서는 언제 사용할 수 있는지 확실하지 않은이 명령을 사용할 수도 있습니다.

$ dpkg-architecture | grep -i end
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little

참고 문헌


9

이 파이썬 스크립트는 당신을 위해 작동해야합니다 :

#!/usr/bin/env python
from struct import pack
if pack('@h', 1) == pack('<h', 1):
    print "Little Endian"
else:
    print "Big Endian"

4
하나의 라이너 : python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))". 종료 코드는 빅 엔디안의 경우 0이고 리틀 엔디안의 경우 1입니다.
Cristian Ciupitu


6

ELF 파일 형식을 활용하여 시스템의 엔디안을 결정할 수 있습니다. 예를 들어, 임의의 ELF 파일의 처음 6 바이트를 16 진수로 인쇄하십시오.

xxd -c 1 -l 6 /bin/ls

0000000: 7f . 0000001: 45 E 0000002: 4c L 0000003: 46 F 0000004: 02 . 0000005: 01 .

ELF 형식 에 따라 마지막 행 (육각 바이트)이 01 인 경우 01은 리틀 엔디안이고 02는 빅 엔디안입니다.

xxd상자에 기능 이 없으면 (비지 박스가있는 경우) 다음을 시도하십시오.

hexdump -s 5 -n 1 -C /bin/busybox


나는 당신이 임의의 ELF를 의미한다고 생각합니다 ... 쉘 스크립트, perl, python 등을 포함한 다른 실행 유형이 있기 때문에 그렇지 않다고 말하는 것은 아닙니다. 다른 실행 유형이 있다는 것을 기억할 가치가 있다고 말합니다 흥미롭게도 코드는 텍스트 세그먼트에 있으므로 이전 텍스트 파일 사용 중 오류가 발생합니다).
Pryftan

1
@Pryftan 지적 해 주셔서 감사합니다. 수정했습니다!
Tong Zhou

@ 통주 환영합니다; 도움이되어 기쁘다!
Pryftan

대박! 비지 박스 기반 임베디드 OS에서 작동하는 첫 번째 방법입니다.
ogurets

3

자이 썬에서 할 수있는 방법을 찾았습니다. Jython (JVM의 Python)은 VM에서 실행되므로 하드웨어에 관계없이 항상 빅 엔디안을보고합니다.

이 솔루션은 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

2

ELF 형식을 기반으로 한 줄 명령 :
hexdump -s 5 -n 1 /bin/sh


편집 : -n 1, 죄송합니다;)
fae

1
이것은 이전 답변 과 똑같은 방법 이며, 귀하의 것보다 자세한 내용도 제공합니다.
kasperd

0

약간 다른 요구 사항 : 코드를 실행하지 않고 컴파일 대상 시스템 이 비트 또는 리틀 엔디안 인지 여부를 확인하려면 프로그램 빌드 구성 스크립트에서 이와 같은 테스트가 필요합니다 . 이 스크립트는 예금해야 에 다른 헤더, 또는 .#define HAVE_LITTLE_ENDIAN 1config.h#define HAVE_LITTLE_ENDIAN 0

크로스 컴파일이 가능하기 때문에 컴파일 대상 머신은 빌드 머신과 다를 수 있으며, 테스트에서 컴파일 된 코드를 실행하지 않아야하는 이유도 설명합니다. printf대답을 내뱉는 진술 이있는 작은 C 프로그램을 갖는 것은 의심의 여지가 없습니다 .

가능한 해결책은 이것입니다. 다음 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발생하면 빅 엔디안입니다. 문자열이 발생하지 않거나 더 놀랍게도 둘 다 수행되지 않으면 테스트에 실패한 것입니다.

이 방법은 프로그램에서 계산 된 "fourcc"상수에 엔디안과 상관없이 동일한 정수를 나타내는 기계 독립적 인 값이 있기 때문에 작동합니다. 오브젝트 파일의 스토리지 표시는 대상 시스템의 엔디안을 따르며 아래의 문자 기반보기를 통해 볼 수 있습니다 strings.

두 개의 제로 가드 단어는 스트링이 분리되도록합니다. 그것은 꼭 필요한 것은 아니지만, 우리가 찾고있는 문자열이 다른 문자열에 포함되지 않도록 보장합니다. 즉, strings자체적으로 한 줄로 출력합니다.

추신 : USPELL매크로는 인수 삽입을 괄호로 묶지 않습니다. 인수 삽입은 재사용이 아닌이 특정 목적을 위해 만들어 졌기 때문입니다.


모든 프로젝트에 필요한 것은 아니지만 autoconf / automake에이 검사가 없습니까? 내 프로젝트는 항상 자체 메이크 파일을 만들 수있을 정도로 충분히 작습니다 (항상 기본은 아니지만). 필요할 때 약간의 수정과 일반적인 인터페이스 이외의 도구를 실제로 알지 못합니다. 그러나 탐지가 있는지 궁금합니다. 아마도 당신은 그것이 필요하더라도 그것을 필요로하지 않았을 것입니다. 단지 가능성을 버릴 것이라고 생각했습니다.
Pryftan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.