Etwas andere Anforderung: Ich benötige einen Test wie diesen in einem Programmbuild-Konfigurationsskript, um festzustellen, ob der Kompilierungszielcomputer Bit oder Little Endian ist, ohne Code auszuführen . Das Skript muss #define HAVE_LITTLE_ENDIAN 1
in einem config.h
Header abgelegt werden , sonst #define HAVE_LITTLE_ENDIAN 0
.
Die Kompilierungszielmaschine unterscheidet sich möglicherweise von der Buildmaschine, da es sich möglicherweise um eine Kreuzkompilierung handelt. Dies erklärt auch, warum der Test nicht versuchen darf, kompilierten Code auszuführen. Es steht außer Frage, ein kleines C-Programm mit einer printf
Aussage zu haben, die die Antwort ausspuckt.
Eine mögliche Lösung ist dies. Wir generieren eine Datei mit dem Namen conftest.c
:
#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
};
Nun kompilieren wir dies conftest.o
mit:
$ /path/to/cross-compiling/cc conftest.c -c
Dann laufen wir:
$ strings conftest.o
PSILXINUEROCMIWD
Wenn die Zeichenfolge PSILXINUEROCMIWD
vorkommt, ist das Ziel Little Endian. Wenn die Zeichenfolge LISPUNIXCOREDWIM
vorkommt, ist es Big-Endian. Wenn keine der beiden Zeichenfolgen vorkommt oder erstaunlicherweise beide, ist der Test fehlgeschlagen.
Dieser Ansatz funktioniert, weil die im Programm berechneten "fourcc" -Konstanten maschinenunabhängige Werte haben, die unabhängig von der Endianzahl dieselben Ganzzahlen bezeichnen. Ihre Speicherdarstellung in der Objektdatei folgt der Endianität des Zielsystems und ist über die zeichenbasierte Ansicht unter sichtbar strings
.
Die zwei Null-Schutzwörter stellen sicher, dass die Zeichenfolge isoliert ist. Dies ist nicht unbedingt erforderlich, stellt jedoch sicher, dass die gesuchte Zeichenfolge nicht in eine andere Zeichenfolge eingebettet ist, sodass strings
sie in einer eigenen Zeile ausgegeben wird.
PS: Das USPELL
Makro setzt die Argumenteinfügungen nicht in Klammern, da es für diesen speziellen Zweck erstellt wurde und nicht für die Wiederverwendung.