Linux에서 엔디안을보고하는 시스템 명령이 있습니까?


30

누구든지 시스템이 Big Endian인지 Little Endian인지보고하는 명령을 알고 있습니까? 아니면 Perl 또는 일련의 명령을 사용하여 이와 같은 기술을 사용하는 것이 가장 좋습니다.

# little
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
12345678

# big
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
87654321

od | 어 wk

# little
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
1

# big
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
0

참고 문헌


od방법에 어떤 문제가 있습니까? 간단하고 어디서나 작동합니다. 그것은 당신의 질문의 본문을 읽기 전에 내가 생각한 것입니다.
Gilles 'SO- 악마 그만해'

@Gilles-실제로는 아무것도 아닙니다 (적어도 나에게는). 사실 그것은 Solaris + AIX와 같은 다른 시스템에서 이식 가능한 것처럼 보이지만 시스템의 엔디안은 32 비트와 64 비트와 같이 좀 더 명확하게 결정되어야하는 것처럼 보였으므로 조금 놀랐습니다. 티. 더 새로운 lscpu방법은 내가 기대할 수있는 것입니다.
slm

엔디안은 실제로 단어 크기보다 결정하기가 쉽습니다. 작은 엔디안이나 빅 엔디안 (최소한 정수, 부동 소수점은 다른 문제)이 아닌 플랫폼을 찾는 데 어려움을 겪기 때문에 많은 혼합이 있습니다. 32 비트와 64 비트 사이 (CPU, 커널, 사용자 영역, 지정된 프로세스)
Gilles 'SO- 악마 그만해'

@Gilles-그렇습니다. 제가 주로 Solaris 나 Linux로 자랐기 때문에 세상에 대한 저의 견해는 아마 미미할 것입니다. 그 이상은 아닙니다.
slm

od접근 방식은 리눅스뿐만 아니라 대부분의 개방형 시스템에서 작동해야합니다 lscpu. "가장 좋은"것은 상황에 따라 다릅니다.
MattBianco

답변:


40

lscpu

lscpu명령은 다음과 같이 표시됩니다.

Byte Order:            Little Endian

이것이 작동하는 것으로 알려진 시스템

  • CentOS 6
  • 우분투 (12.04, 12.10, 13.04, 13.10, 14.04)
  • 페도라 (17,18,19)
  • 아치 리눅스 2012+
  • 리눅스 민트 데비안 (따라서 데비안 테스트도 가정).

작동하지 않는 것으로 알려진 시스템

  • 페도라 14
  • CentOS 5 (이로 인해 RHEL5로 가정)

왜 배포판에 명백한 차이점이 있습니까?

많이 파고 난 후 이유를 알았습니다. util-linux 버전 2.19는 lscpu시스템의 Endianness를보고하는 출력을 보여주는 기능을 포함하는 첫 번째 버전 인 것 같습니다 .

테스트로 Fedora 14 시스템에서 버전 2.18 및 2.19를 모두 컴파일했으며 아래 출력에 차이점이 표시됩니다.

유틸리티 리눅스 2.18

$ util-linux-ng-2.18/sys-utils/lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                4
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               1199.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

유틸리티 리눅스 2.19

$ util-linux-2.19/sys-utils/lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               2667.000
BogoMIPS:              5320.02
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

위의 버전은 kernel.org 웹 사이트 에서 다운로드되었습니다 .


고마워 데이비드, 나는 그 파일을 greping 할 때 그것을 놓쳤다. 맹인이되어야 함 8-)
slm

내가 왜 그리웠는지 봅니다. Fedora 14 시스템 lscpu은 그 값을 보여주지 않지만 Ubuntu 12.10 시스템은 그 값을 보여줍니다. 당신이 마음에 들지 않으면 나는 당신의 대답을 다른 시스템과 각 시스템에서 수행하는 방법에 대한 섹션으로 나눌 수 있습니다.
slm

@slm 물론입니다. 참고 lscpu로 Archlinux에서도 작동합니다.
David Baggerman

어떤 버전의 아치?
slm

아치에는 버전이 없습니다. 그것은 롤링 릴리스입니다 ...
jasonwryan 0

6

데비안 / 우분투 시스템에서 찾은 한 가지 방법은이 명령을 실행하는 것입니다.

$ dpkg-architecture
DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_BITS=64
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_ARCH_ENDIAN=little
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_BUILD_MULTIARCH=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_BITS=64
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_ARCH_ENDIAN=little
DEB_HOST_ARCH_OS=linux
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_MULTIARCH=x86_64-linux-gnu

시스템 구성에 따라 작거나 큰 단어가 표시됩니다.

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

6

사용 python:

$ python -c "import sys;print sys.byteorder"
little

또는:

printf '\1' | od -dAn
1

1리틀 엔디안과 빅 엔디안은 어디에 있습니까 00256?

또는 더 짧은 perl버전을 사용하는 경우 :

$ perl -V:byteorder
byteorder='12345678';

5

POSIX Shell & C 솔루션 :

cat << EOF > foo.c

#include <endian.h>
#include <stdio.h>

int main() {
  printf("Byte Order: ");
  if (BYTE_ORDER == LITTLE_ENDIAN) 
    printf("little");
  else {
    if (BYTE_ORDER == BIG_ENDIAN)
      printf("big");
    else
      printf("unknown");
  }
  printf(" endian.\n");
  return 0;
}
EOF

gcc -D__USE_POSIX foo.c
./a.out

1

다음이없는 시스템 인 경우 endian.h:

#include <stdio.h>

int main() {
  int test = 0;
  char *bytes = (char *) &test;
  *bytes = 0x1;

  printf("Byte Order: ");
  if (test == 1){
    printf("little");
  }
  else {
      printf("big");
  }
  printf(" endian.\n");
  return 0;
}

VAX 미들 엔디안을 좋아하지 않는 것은 무엇입니까?
thrig

잘 알고, 나는 현재 인텔-> PowerPC 문제에 너무 열중하고, 너무 끔찍한 것을 생각하지 못했습니다.
Matthew V Carey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.