¿Hay un comando del sistema, en Linux, que informa la endianness?


30

¿Alguien sabe de un comando que informe si un sistema es Big Endian o Little Endian, o es la mejor opción una técnica como esta usando Perl o una cadena de comandos?

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

Referencias


¿Qué hay de malo con el odmétodo? Es simple y funciona en todas partes. Es lo que pensé antes de leer el cuerpo de tu pregunta.
Gilles 'SO- deja de ser malvado'

@Gilles: nada realmente, se siente un poco como un truco (al menos para mí). Es cierto que parece ser portátil en otros sistemas como Solaris + AIX, pero parecía que el Endianness de un sistema debería determinarse un poco más explícitamente como 32 bits frente a 64 bits, por lo que me sorprendió un poco que no t. El lscpumétodo más nuevo es más de lo que esperaría.
slm

Endianness es en la práctica más fácil de determinar que el tamaño de la palabra, porque tendrá dificultades para encontrar plataformas que no sean little-endian o big-endian (al menos para enteros, los flotantes son otra cuestión), mientras que hay muchas mezclas entre 32 bits y 64 bits (CPU, kernel, userland, un proceso dado).
Gilles 'SO- deja de ser malvado'

@Gilles: sí, mi visión del mundo probablemente haya disminuido ya que crecí principalmente con Solaris o Linux. No mucho más allá de eso.
slm

El odenfoque debería funcionar en la mayoría de los sistemas abiertos, no solo en Linux, que sería el caso con el uso lscpu. Entonces, lo que es "mejor" depende de las circunstancias.
MattBianco

Respuestas:


40

lscpu

El lscpucomando muestra (entre otras cosas):

Byte Order:            Little Endian

Sistemas en los que se sabe que funcionan

  • CentOS 6
  • Ubuntu (12.04, 12.10, 13.04, 13.10, 14.04)
  • Fedora (17,18,19)
  • ArchLinux 2012+
  • Linux Mint Debian (por lo tanto, suponiendo también las pruebas de Debian).

Se sabe que los sistemas no funcionan en

  • Fedora 14
  • CentOS 5 (suponiendo RHEL5 debido a esto)

¿Por qué las aparentes diferencias entre las distribuciones?

Después de mucho cavar descubrí por qué. Parece que la versión util-linux versión 2.19 fue la primera versión que incluyó la función donde lscpumuestra la salida que informa la Endianness de su sistema.

Como prueba, compilé las versiones 2.18 y 2.19 en mi sistema Fedora 14 y el resultado a continuación muestra las diferencias:

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

Las versiones anteriores se descargaron del sitio web kernel.org .


Gracias David, me perdí eso cuando estaba buscando ese archivo. Debe quedar ciego 8-)
slm

Ya veo por qué me lo perdí. Mi sistema Fedora 14 lscpuno muestra ese valor, sin embargo, mi sistema Ubuntu 12.10 sí. Si no le importa, podría tomar su respuesta y dividirla en secciones para los diferentes sistemas y formas de hacerlo en cada uno.
slm

@slm Claro, adelante. Como referencia, también lscpufunciona en Archlinux.
David Baggerman el

¿Qué versión de Arch?
slm

Arch no tiene versiones; A la función rodando ...
jasonwryan

6

Un método que encontré en los sistemas Debian / Ubuntu es ejecutar este 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

Esto le mostrará las palabras pequeño o grande dependiendo de la arquitectura de su sistema:

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

6

Utilizando python:

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

o:

printf '\1' | od -dAn
1

donde 1es para little endian y 00256para big endian.

O usando una perlversión más corta :

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

5

Una solución 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

Si está en un sistema que no tiene 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;
}

¿Qué no hay amor para VAX middle-endian?
thrig

Bien visto, estaba tan absorto en mis problemas actuales de Intel-> PowerPC, que no había concebido algo tan horrible.
Matthew V Carey el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.