Existe um comando do sistema, no Linux, que relata o endianness?

30

Alguém sabe de um comando que reporte se um sistema é Big Endian ou Little Endian, ou a melhor opção é uma técnica como esta usando Perl ou uma cadeia 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

Referências

slm
fonte
O que há de errado com o odmétodo? É simples e funciona em qualquer lugar. Foi o que pensei antes de ler o corpo da sua pergunta.
Gilles 'SO- stop be evil' (
@ Gilles - nada realmente, parece um pouco como um hack (pelo menos para mim). É verdade que parece portátil em outros sistemas, como o Solaris + AIX, mas parecia que o Endianness de um sistema deveria ser um pouco mais explicitamente determinado como 32 bits vs. 64 bits, então fiquei um pouco surpreso por não ter sido ' t. O lscpumétodo mais novo é mais o que eu esperava.
slm
O endianness é, na prática, mais fácil de determinar do que o tamanho das palavras, porque é difícil encontrar plataformas que não sejam little-endian ou big-endian (pelo menos para números inteiros, floats são outra questão), enquanto há muitas misturas. entre 32 e 64 bits (CPU, kernel, área do usuário, um determinado processo).
Gilles 'SO- stop be evil'
@ Gilles - sim, minha visão do mundo provavelmente é menosprezada, porque eu cresci principalmente com Solaris ou Linux. Não muito além disso.
slm
a odabordagem deve funcionar na maioria dos sistemas abertos, não apenas no linux, o que seria o caso do uso lscpu. Então, o que é "melhor" depende das circunstâncias.
Matt Bianco

Respostas:

40

lscpu

O lscpucomando mostra (entre outras coisas):

Byte Order:            Little Endian

Sistemas em que se sabe trabalhar em

  • CentOS 6
  • Ubuntu (12.04, 12.10, 13.04, 13.10, 14.04)
  • Fedora (17,18,19)
  • ArchLinux 2012+
  • Linux Mint Debian (portanto, assumindo os testes do Debian também).

Sistemas que se sabe não funcionarem

  • Fedora 14
  • CentOS 5 (assumindo RHEL5 por causa disso)

Por que as aparentes diferenças entre as distribuições?

Depois de muita pesquisa, descobri o porquê. Parece que a versão util-linux versão 2.19 foi a primeira versão que incluiu o recurso em que lscpumostra a saída que relata o Endianness do seu sistema.

Como teste, compilei as versões 2.18 e 2.19 no meu sistema Fedora 14 e a saída abaixo mostra as diferenças:

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

As versões acima foram baixadas do site kernel.org .

David Baggerman
fonte
Obrigado David, eu senti falta disso quando estava lendo esse arquivo. Deve ficar cego 8-)
slm
Eu vejo porque eu perdi. Meus sistemas Fedora 14 lscpunão mostram esse valor, no entanto, meu sistema Ubuntu 12.10 mostra. Se você não se importa, eu posso pegar sua resposta e dividi-la em seções para os diferentes sistemas e maneiras de fazê-lo em cada um.
slm
@slm Claro, vá em frente. Para referência, também lscpufunciona no Archlinux.
David Baggerman
Qual versão do Arch?
slm
Arch não tem versões; é um lançamento ...
jasonwryan
6

Um método que encontrei nos sistemas Debian / Ubuntu é executar 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

Isso mostrará as palavras pequeno ou grande, dependendo da arquitetura em que seu sistema é composto:

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

Usando python:

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

ou:

printf '\1' | od -dAn
1

onde 1é para little endian e 00256para big endian.

Ou usando uma perlversão mais curta :

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

Uma solução 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

fonte
1

Se você estiver em um sistema que não possui 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
fonte
O que não gosta de VAX middle-endian?
thrig
Bem localizado, eu estava tão absorvido nos meus problemas atuais de Intel-> PowerPC, que não tinha concebido algo tão horrível.
Mt V Carey