Persyaratan yang sedikit berbeda: Saya perlu tes seperti ini dalam program build configure script untuk menentukan apakah mesin target kompilasi sedikit atau sedikit endian, tanpa mengeksekusi kode . Script harus disetor #define HAVE_LITTLE_ENDIAN 1
ke config.h
header, atau yang lain #define HAVE_LITTLE_ENDIAN 0
.
Mesin target kompilasi mungkin berbeda dari mesin build, karena kami mungkin mengkompilasi silang, yang juga menjelaskan mengapa pengujian tidak boleh mencoba menjalankan kode yang dikompilasi. Adalah tidak mungkin untuk memiliki program C kecil dengan printf
pernyataan yang mengeluarkan jawabannya.
Solusi yang mungkin adalah ini. Kami menghasilkan file bernama conftest.c
yang berisi ini:
#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
};
Sekarang, kami kompilasi ini untuk conftest.o
menggunakan:
$ /path/to/cross-compiling/cc conftest.c -c
Lalu kita jalankan:
$ strings conftest.o
PSILXINUEROCMIWD
Jika string PSILXINUEROCMIWD
terjadi, targetnya adalah little-endian. Jika string LISPUNIXCOREDWIM
terjadi, itu adalah big-endian. Jika tidak ada senar yang muncul atau, yang lebih mengejutkan, keduanya terjadi, maka pengujian gagal.
Pendekatan ini bekerja karena konstanta "fourcc" yang dihitung dalam program memiliki nilai mesin-independen, menunjukkan bilangan bulat yang sama terlepas dari endianness. Representasi penyimpanan mereka dalam file objek mengikuti endianness dari sistem target, dan itu terlihat melalui tampilan berbasis karakter di bawah strings
.
Dua kata nol guard memastikan bahwa string terisolasi. Itu tidak sepenuhnya diperlukan, tetapi memastikan bahwa string yang kita cari tidak tertanam dalam beberapa string lain, yang berarti strings
akan menampilkannya pada sebuah baris dengan sendirinya.
PS USPELL
makro tidak mengurung sisipan argumen karena dibuat untuk tujuan khusus ini, bukan untuk digunakan kembali.