처리기 매크로는 컴파일 된 오브젝트 파일에 표시되지 않습니다 - 그들은 전혀 컴파일러에 의해 볼 수없는 것입니다. 당신이 방금 #define
을 가지고 있고 그것을 어디에서도 사용하지 않았다면 그것의 흔적은 없을 것입니다.
어딘가에서 코드에서 사용한 경우 명령 (예 : 레지스터 또는 메모리에 상수를로드)에서 상수로 표시 될 수 있습니다. 위를 컴파일하고 데이터 세그먼트를 보면
// Global variable definition
#define BOOTSIGNATURE 0xAA55
uint16_t my_global = BOOTSIGNATURE;
, 그것은 다음과 같습니다 :
$ gcc -c test.c
$ objdump -s test.o
[...]
Contents of section .data:
0000 55aa0000 U...
정적 데이터를 초기화하는 데 사용되는 경우, 데이터 세그먼트에서 상수로 표시 할
두 바이트는 리틀 엔디안 순서 55 AA
으로 메모리에 저장됩니다 (선두 0000
은 16 진수의 세그먼트 오프셋 임).
당신이 다음 명시 적으로 바이트 배열로 저장, 데이터의 엔디안을 제어하려면 :
uint8_t my_global[] = {0xAA, 0x55};
이 항상 지정된 순서에 바이트를 저장합니다.
x86이 리틀 엔디안이므로 GCC가 왜 이것이 원하는 동작이라고 생각하는지 알 수 있습니다. 그러나, 나를 위해, AA55 바이트의 문자열처럼, 그 특정 순서로 필요합니다. 필요한 행동을 어떻게 성취 할 수 있습니까? –
단일 정수 대신 바이트의 문자열 (배열)로 정의 할 수 있습니다.나는 당신이 그것을 어떻게 사용하고 있는지 모르기 때문에 다른 수정 없이는 작동 할 지 모른다. '#define BOOTSIGNATURE ((char []) {0xAA, 0x55})'. 또한 아키텍처를 확인하고 순서를 전환하여 의견을 남겨 이유를 알 수 있습니다. – ughoavgfhw
바이너리는 머신과 동일한 엔디안 방식으로 작성됩니다. 다시 읽어 들일 때 걱정할 필요가있는 경우 올바르게 읽습니다. – iabdalkader