Biraz farklı gereksinim: Derleme hedef makinesinin kod çalıştırmadan bit veya küçük endian olup olmadığını belirlemek için bir program build configure betiğinde böyle bir teste ihtiyacım var . Script #define HAVE_LITTLE_ENDIAN 1
bir config.h
başlığa veya başka bir başlığa bırakılmalıdır #define HAVE_LITTLE_ENDIAN 0
.
Derleme hedef makinesi, derleme makinesinden farklı olabilir, çünkü çapraz derleme yapabiliriz; bu da testin neden derlenmiş bir kod çalıştırmayı denememesi gerektiğini açıklar. printf
Cevabı yayan bir ifade ile küçük bir C programının olması söz konusu değildir.
Muhtemel bir çözüm budur. Bunu conftest.c
içeren bir dosya üretiyoruz :
#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
};
Şimdi, bunu conftest.o
kullanmak için derledik:
$ /path/to/cross-compiling/cc conftest.c -c
Sonra koşuyoruz:
$ strings conftest.o
PSILXINUEROCMIWD
Dize PSILXINUEROCMIWD
oluşursa, hedef küçük-endian. Dize LISPUNIXCOREDWIM
oluşursa, büyük endian. Her iki dize de ortaya çıkmazsa veya daha da şaşırtıcı bir şekilde, ikisi de olmazsa, test başarısız olmuştur.
Bu yaklaşım işe yarıyor, çünkü programda hesaplanan "fourcc" sabitleri, birbirinden bağımsız olarak aynı tam sayıları belirten, makineden bağımsız değerlere sahip. Nesne dosyasındaki depo gösterimleri, hedef sistemin bütünlüğünü izler ve bu, altındaki karakter tabanlı görünümle görülebilir strings
.
İki sıfır koruma kelimesi, dizenin izole edilmesini sağlar. Bu kesinlikle gerekli değildir, ancak aradığımız dizginin başka bir dizgeye gömülmemesini sağlar, yani strings
onu bir satırda tek başına çıkartacaktır.
PS USPELL
makrosu argüman eklerini parantez içine almaz, çünkü tekrar kullanım için değil, bu özel amaç için hazırlanmış.