Apakah ada perintah sistem, di Linux, yang melaporkan endianness?

30

Adakah yang tahu tentang perintah yang melaporkan apakah suatu sistem adalah Big Endian atau Little Endian, atau apakah opsi terbaik adalah teknik seperti ini menggunakan Perl atau serangkaian perintah?

Perl

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

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

od | awk

# 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

Referensi

slm
sumber
Apa yang salah dengan odmetodenya? Sederhana dan berfungsi di mana-mana. Itu yang saya pikirkan sebelum membaca isi pertanyaan Anda.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles - tidak ada yang benar-benar terasa seperti hack (setidaknya bagi saya). Benar itu akan tampak portabel pada sistem lain seperti Solaris + AIX, tetapi sepertinya Endianness suatu sistem harus sedikit lebih eksplisit ditentukan seperti 32-bit vs 64-bit, jadi saya sedikit terkejut bahwa itu bukan t. lscpuMetode yang lebih baru lebih sesuai dengan yang saya harapkan.
slm
Endianness dalam praktiknya lebih mudah ditentukan daripada ukuran kata, karena Anda akan kesulitan menemukan platform yang tidak sedikit-endian atau big-endian (setidaknya untuk bilangan bulat, float adalah masalah lain) sedangkan ada banyak campuran antara 32-bit dan 64-bit (CPU, kernel, userland, proses yang diberikan).
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles - ya pandangan saya tentang dunia mungkin diremehkan karena saya terutama tumbuh dengan Solaris atau Linux. Tidak lebih dari itu.
slm
yang odpendekatan harus bekerja pada kebanyakan sistem terbuka, tidak hanya linux, yang akan menjadi kasus dengan menggunakan lscpu. Jadi apa yang "terbaik" tergantung pada keadaan.
MattBianco

Jawaban:

40

lscpu

The lscpuperintah show (antara lain):

Byte Order:            Little Endian

Sistem yang dikenal berfungsi

  • CentOS 6
  • Ubuntu (12.04, 12.10, 13.04, 13.10, 14.04)
  • Fedora (17,18,19)
  • ArchLinux 2012+
  • Linux Mint Debian (oleh karena itu mengasumsikan pengujian Debian juga).

Sistem ini diketahui tidak berfungsi

  • Fedora 14
  • CentOS 5 (dengan asumsi RHEL5 karena ini)

Mengapa perbedaan nyata di seluruh distro?

Setelah banyak menggali saya menemukan alasannya. Sepertinya versi util-linux versi 2.19 adalah versi pertama yang menyertakan fitur yang lscpumenunjukkan output melaporkan Endianness sistem Anda.

Sebagai ujian saya mengkompilasi kedua versi 2.18 dan 2.19 pada sistem Fedora 14 saya dan output di bawah ini menunjukkan perbedaan:

util-linux 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

util-linux 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

Versi di atas diunduh dari situs web kernel.org .

David Baggerman
sumber
Terima kasih David, saya melewatkan itu ketika saya sedang mengambil file itu. Harus buta 8-)
slm
Saya mengerti mengapa saya melewatkannya. Sistem Fedora 14 saya lscputidak menunjukkan nilai itu, namun sistem Ubuntu 12.10 saya tidak. Jika Anda tidak keberatan, saya mungkin mengambil jawaban Anda dan membaginya menjadi beberapa bagian untuk berbagai sistem dan cara untuk melakukannya pada masing-masing.
slm
@lm Tentu, silakan. Untuk referensi, lscpuberfungsi di Archlinux juga.
David Baggerman
Versi Arch yang mana?
slm
Arch tidak memiliki versi; ini rilis yang bergulir ...
jasonwryan
6

Salah satu metode yang saya temukan pada sistem Debian / Ubuntu adalah menjalankan perintah ini:

$ 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

Ini akan menunjukkan kepada Anda kata-kata sedikit atau besar tergantung pada arsitektur sistem Anda terdiri dari:

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

Menggunakan python:

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

atau:

printf '\1' | od -dAn
1

di mana 1untuk endian kecil dan 00256untuk big endian.

Atau menggunakan perlversi yang lebih pendek :

$ perl -V:byteorder
byteorder='12345678';
cuonglm
sumber
5

Solusi 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

sumber
1

Jika Anda menggunakan sistem yang tidak memiliki 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;
}
Matthew V Carey
sumber
Apa tidak ada cinta untuk VAX mid-endian?
thrig
Terlihat dengan baik, saya begitu asyik dengan masalah-masalah Intel-> PowerPC saya saat ini, saya belum memikirkan sesuatu yang begitu mengerikan.
Matthew V Carey