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 1ke config.hheader, 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 printfpernyataan yang mengeluarkan jawabannya.
Solusi yang mungkin adalah ini. Kami menghasilkan file bernama conftest.cyang 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.omenggunakan:
$ /path/to/cross-compiling/cc conftest.c -c
Lalu kita jalankan:
$ strings conftest.o
PSILXINUEROCMIWD
Jika string PSILXINUEROCMIWDterjadi, targetnya adalah little-endian. Jika string LISPUNIXCOREDWIMterjadi, 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 stringsakan menampilkannya pada sebuah baris dengan sendirinya.
PS USPELLmakro tidak mengurung sisipan argumen karena dibuat untuk tujuan khusus ini, bukan untuk digunakan kembali.