Немного другое требование: мне нужен такой тест в скрипте конфигурации сборки программы, чтобы определить, является ли целевой компьютер компиляции битовым или младшим, без выполнения кода . Скрипт должен быть помещен #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
макрос не заключает в скобки аргументы вставки, потому что он создан для этой конкретной цели, а не для повторного использования.