Немного другое требование: мне нужен такой тест в скрипте конфигурации сборки программы, чтобы определить, является ли целевой компьютер компиляции битовым или младшим, без выполнения кода . Скрипт должен быть помещен #define HAVE_LITTLE_ENDIAN 1в config.hзаголовок или иначе #define HAVE_LITTLE_ENDIAN 0.
Целевая машина компиляции может отличаться от машины сборки, поскольку мы можем выполнять кросс-компиляцию, что также объясняет, почему тест не должен пытаться запустить какой-либо скомпилированный код. Не может быть и речи о том, чтобы иметь небольшую C-программу с printfутверждением, которое выплевывает ответ.
Возможное решение заключается в следующем. Мы создаем файл с именем, 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
};
Теперь мы скомпилируем это с conftest.oиспользованием:
$ /path/to/cross-compiling/cc conftest.c -c
Затем мы запускаем:
$ strings conftest.o
PSILXINUEROCMIWD
Если строка PSILXINUEROCMIWDвстречается, цель имеет младший порядок. Если строка LISPUNIXCOREDWIMвстречается, она имеет порядок байтов. Если ни одна строка не встречается или, что еще более удивительно, обе встречаются, то тест не пройден.
Этот подход работает, потому что константы fourcc, рассчитанные в программе, имеют машинно-независимые значения, обозначающие одинаковые целые числа независимо от порядка следования. Их представление хранения в объектном файле следует за порядком конечной системы, и это видно через представление на основе символов в strings.
Два нулевых защитных слова гарантируют, что строка изолирована. Это не является строго необходимым, но это гарантирует, что искомая строка не будет встроена в какую-либо другую строку, то есть stringsона сама выведет ее на строку.
PS USPELLмакрос не заключает в скобки аргументы вставки, потому что он создан для этой конкретной цели, а не для повторного использования.