Une exigence légèrement différente : J'ai besoin d'un test comme celui-ci dans un programme build configure script afin de déterminer si le compiler la machine cible est bit ou little endian, sans exécuter de code . Le script doit déposer #define HAVE_LITTLE_ENDIAN 1
en un config.h
ou bien #define HAVE_LITTLE_ENDIAN 0
.
La machine cible de la compilation peut être différente de la machine de construction, puisque nous pouvons faire de la compilation croisée, ce qui explique aussi pourquoi le test ne doit pas essayer d'exécuter un code compilé. Il est hors de question d'avoir un petit programme en C avec un printf
qui donne la réponse.
Une solution possible est la suivante. Nous générons un fichier appelé conftest.c
qui contient ceci :
#define USPELL(C0, C1, C2, C3) \
((unsigned) C0 << 24 | \
(unsigned) C1 << 16 | \
(unsigned) C2 << 8 | (unsigned) C3)
unsigned x[6] = {
0,
USPELL('L', 'I', 'S', 'P'),
USPELL('U', 'N', 'I', 'X'),
USPELL('C', 'O', 'R', 'E'),
USPELL('D', 'W', 'I', 'M'),
0
};
Maintenant, nous compilons ceci en conftest.o
en utilisant :
$ /path/to/cross-compiling/cc conftest.c -c
Alors on court :
$ strings conftest.o
PSILXINUEROCMIWD
Si la chaîne PSILXINUEROCMIWD
se produit, la cible est little-endian. Si la chaîne LISPUNIXCOREDWIM
se produit, il est big-endian. Si aucune des deux chaînes n'apparaît ou, plus étonnant encore, si les deux apparaissent, alors le test a échoué.
Cette approche fonctionne parce que les constantes "fourcc" calculées dans le programme ont des valeurs indépendantes de la machine, désignant les mêmes entiers indépendamment de l'endienneté. Leur représentation de stockage dans le fichier objet suit l'endianness du système cible, et cela est visible via la vue basée sur les caractères sous strings
.
Les deux mots de garde zéro garantissent que la chaîne est isolée. Ce n'est pas strictement nécessaire, mais cela permet de s'assurer que la chaîne que nous recherchons n'est pas intégrée dans une autre chaîne, ce qui signifie que strings
l'affichera sur une ligne à part.
P.S. le USPELL
ne met pas les insertions d'arguments entre parenthèses car elle est conçue dans ce but précis, et non pour être réutilisée.