Esiste un comando di sistema, in Linux, che segnala l'endianness?


30

Qualcuno sa di un comando che segnala se un sistema è Big Endian o Little Endian, o è l'opzione migliore una tecnica come questa che utilizza Perl o una stringa di comandi?

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

Riferimenti


Cosa c'è che non va nel odmetodo? È semplice e funziona ovunque. È quello che ho pensato prima di leggere il corpo della tua domanda.
Gilles 'SO- smetti di essere malvagio' il

@Gilles - niente di veramente, sembra un po 'come un hack (almeno per me). È vero che sembrerebbe portatile su altri sistemi come Solaris + AIX, ma sembrava che l'Endianness di un sistema dovesse essere un po 'più esplicitamente determinato come 32 bit contro 64 bit, quindi sono rimasto un po' sorpreso che non fosse t. Il lscpumetodo più recente è più quello che mi sarei aspettato.
slm

L'endianness è in pratica più facile da determinare rispetto alla dimensione della parola, perché avrai difficoltà a trovare piattaforme che non sono né little-endian né big-endian (almeno per gli interi, i float sono un'altra cosa) mentre ci sono molti mix tra 32 e 64 bit (CPU, kernel, userland, un determinato processo).
Gilles 'SO- smetti di essere malvagio' il

@Gilles - sì, la mia visione del mondo è probabilmente sbiadita da quando sono cresciuto principalmente con Solaris o Linux. Non molto oltre.
slm

l' odapproccio dovrebbe funzionare sulla maggior parte dei sistemi aperti, non solo su Linux, come nel caso dell'utilizzo lscpu. Quindi, ciò che è "migliore" dipende dalle circostanze.
MattBianco,

Risposte:


40

lscpu

Il lscpucomando mostra (tra le altre cose):

Byte Order:            Little Endian

Sistemi su cui è noto lavorare

  • CentOS 6
  • Ubuntu (12.04, 12.10, 13.04, 13.10, 14.04)
  • Fedora (17,18,19)
  • ArchLinux 2012+
  • Linux Mint Debian (assumendo quindi anche i test Debian).

Sistemi su cui questo non funziona

  • Fedora 14
  • CentOS 5 (presupponendo RHEL5 per questo)

Perché le differenze apparenti tra le distro?

Dopo molte ricerche ho scoperto il perché. Sembra che la versione util-linux versione 2.19 sia stata la prima versione che includeva la funzione in cui lscpumostra l'output che riporta l'Endianness del sistema.

Come test ho compilato entrambe le versioni 2.18 e 2.19 sul mio sistema Fedora 14 e l'output seguente mostra le differenze:

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

Le versioni precedenti sono state scaricate dal sito Web kernel.org .


Grazie David, mi è mancato quando stavo giocando quel file. Deve diventare cieco Cool
slm

Capisco perché l'ho perso. Il mio sistema Fedora 14 lscpunon mostra quel valore, tuttavia il mio sistema Ubuntu 12.10 lo fa. Se non ti dispiace potrei prendere la tua risposta e dividerla in sezioni per i diversi sistemi e modi per farlo su ciascuno.
slm

@slm Certo, vai avanti. Per riferimento, lscpufunziona anche su Archlinux.
David Baggerman,

Quale versione di Arch?
slm

Arch non ha versioni; è un rilascio
progressivo

6

Un metodo che ho trovato sui sistemi Debian / Ubuntu è quello di eseguire questo comando:

$ 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

Questo ti mostrerà le parole piccole o grandi a seconda dell'architettura che comprende il tuo sistema:

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

6

Utilizzando python:

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

o:

printf '\1' | od -dAn
1

dove 1è per little endian e 00256per big endian.

O usando una perlversione più breve :

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

5

Una soluzione 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

Se si utilizza un sistema che non ha 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;
}

Cosa non c'è amore per il mid end-end VAX?
thrig

Ben notato, ero così assorbito dai miei attuali problemi Intel-> PowerPC, che non avevo concepito qualcosa di così orribile.
Matthew V Carey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.