135 votes

Comment savoir si un système Linux est big endian ou little endian ?

Je sais que certains processeurs sont Big Endian et que d'autres sont Little Endian. Mais existe-t-il une commande, bash script, Python script ou une série de commandes qui peuvent être utilisées à la ligne de commande pour déterminer si un système est Big Endian ou Little Endian ? Quelque chose comme :

if <some code> then
    echo Big Endian
else
    echo Little Endian
fi

Ou est-il plus simple de déterminer le processeur utilisé par le système et de s'en servir pour déterminer son Endienneté ?

155voto

Sheila Points 61

Sur un système Big Endian (Solaris sur SPARC)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 

0

Sur un système little endian (Linux sur x86)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 

1


La solution ci-dessus est astucieuse et fonctionne parfaitement pour Linux *86 et Solaris Sparc.

J'avais besoin d'une solution Shell uniquement (pas de Perl) qui fonctionne également sur AIX/Power et HPUX/Itanium. Malheureusement, les deux derniers ne jouent pas franc jeu : AIX rapporte "6" et HPUX donne une ligne vide.

En utilisant votre solution, j'ai pu créer quelque chose qui fonctionnait sur tous ces systèmes Unix :

$ echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6

En ce qui concerne la solution Python que quelqu'un a postée, elle ne fonctionne pas en Jython car la JVM traite tout comme un Big. Si quelqu'un parvient à la faire fonctionner en Jython, merci de le signaler !

J'ai également trouvé ceci, qui explique l'endiannité des différentes plateformes. Certains matériels peuvent fonctionner dans l'un ou l'autre mode en fonction de ce que le système d'exploitation sélectionne : http://labs.hoffmanlabs.com/node/544


Si vous utilisez l'awk, cette ligne peut être simplifiée :

echo -n I | od -to2 | awk '{ print substr($2,6,1); exit}'

Pour les petites machines Linux qui n'ont pas de 'od' (comme OpenWrt), essayez 'hexdump' :

echo -n I | hexdump -o | awk '{ print substr($2,6,1); exit}'

75voto

dotancohen Points 2350

Si vous êtes sur une machine Linux assez récente (la plupart des choses après 2012) puis lscpu contient désormais ces informations :

$ lscpu | grep Endian
Byte Order:            Little Endian

Ceci a été ajouté à lscpu dans la version 2.19, qui se trouve dans Fedora >= 17, CentOS >= 6.0, Ubuntu >= 12.04.

Notez que j'ai trouvé cette réponse à partir de cette formidable réponse sur Unix.SE . Cette réponse contient beaucoup d'informations pertinentes, ce billet n'en est qu'un résumé.

35voto

YenTheFirst Points 1227

Voici un script Python plus élégant en une ligne

python -c "import sys;sys.exit(0 if sys.byteorder=='big' else 1)"

code de sortie 0 signifie big endian et 1 signifie little endian

ou simplement changer sys.exit a print pour une sortie imprimable

17voto

Tong Zhou Points 231

Vous pouvez tirer parti du format de fichier ELF pour déterminer le caractère endianné de votre système. Par exemple, imprimez les six premiers octets d'un fichier ELF arbitraire en hexadécimal :

xxd -c 1 -l 6 /bin/ls

0000000: 7f . 0000001: 45 E 0000002: 4c L 0000003: 46 F 0000004: 02 . 0000005: 01 .

Si la dernière ligne (le sixième octet) est 01, selon Format ELF 01 est little endian et 02 est big endian.

Si vous n'avez pas de xxd sur votre boîte (et que vous avez busybox), essayez ceci :

hexdump -s 5 -n 1 -C /bin/busybox

12voto

nex3 Points 4309

La réponse principale peut être légèrement simplifiée en utilisant awk :

Sur un système Big Endian (Solaris, SPARC)

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

Sur un système Little Endian (Linux, Intel)

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

Noyaux Linux plus récents

À partir de la version 2.19 du paquetage util-linux, la commande lscpu a commencé à inclure un champ lié à l'Endianness. Vous pouvez donc maintenant utiliser cette commande pour le découvrir :

$ lscpu | grep -i byte
Byte Order:            Little Endian

Cela a été confirmé sur Ubuntu 12.10 et CentOS 6. Je suis donc prêt à supposer que la plupart des noyaux Linux 3.0+ offrent maintenant cette fonctionnalité.

Sur les systèmes Debian/Ubuntu, vous pouvez également utiliser cette commande, je ne suis pas sûr de la date à laquelle elle est devenue disponible :

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

Références

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X