약간 다른 요구 사항 : 코드를 실행하지 않고 컴파일 대상 시스템 이 비트 또는 리틀 엔디안 인지 여부를 확인하려면 프로그램 빌드 구성 스크립트에서 이와 같은 테스트가 필요합니다 . 이 스크립트는 예금해야 에 다른 헤더, 또는 .#define HAVE_LITTLE_ENDIAN 1
config.h
#define HAVE_LITTLE_ENDIAN 0
크로스 컴파일이 가능하기 때문에 컴파일 대상 머신은 빌드 머신과 다를 수 있으며, 테스트에서 컴파일 된 코드를 실행하지 않아야하는 이유도 설명합니다. printf
대답을 내뱉는 진술 이있는 작은 C 프로그램을 갖는 것은 의심의 여지가 없습니다 .
가능한 해결책은 이것입니다. 다음 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
자체적으로 한 줄로 출력합니다.
추신 : USPELL
매크로는 인수 삽입을 괄호로 묶지 않습니다. 인수 삽입은 재사용이 아닌이 특정 목적을 위해 만들어 졌기 때문입니다.