1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <elf.h> 5 6 int 7 main(int argc, char **argv) 8 { 9 unsigned char ei[EI_NIDENT]; 10 union { short s; char c[2]; } endian_test; 11 12 if (fread(ei, 1, EI_NIDENT, stdin) != EI_NIDENT) { 13 fprintf(stderr, "Error: input truncated\n"); 14 return 1; 15 } 16 if (memcmp(ei, ELFMAG, SELFMAG) != 0) { 17 fprintf(stderr, "Error: not ELF\n"); 18 return 1; 19 } 20 switch (ei[EI_CLASS]) { 21 case ELFCLASS32: 22 printf("#define KERNEL_ELFCLASS ELFCLASS32\n"); 23 break; 24 case ELFCLASS64: 25 printf("#define KERNEL_ELFCLASS ELFCLASS64\n"); 26 break; 27 default: 28 exit(1); 29 } 30 switch (ei[EI_DATA]) { 31 case ELFDATA2LSB: 32 printf("#define KERNEL_ELFDATA ELFDATA2LSB\n"); 33 break; 34 case ELFDATA2MSB: 35 printf("#define KERNEL_ELFDATA ELFDATA2MSB\n"); 36 break; 37 default: 38 exit(1); 39 } 40 41 if (sizeof(unsigned long) == 4) { 42 printf("#define HOST_ELFCLASS ELFCLASS32\n"); 43 } else if (sizeof(unsigned long) == 8) { 44 printf("#define HOST_ELFCLASS ELFCLASS64\n"); 45 } 46 47 endian_test.s = 0x0102; 48 if (memcmp(endian_test.c, "\x01\x02", 2) == 0) 49 printf("#define HOST_ELFDATA ELFDATA2MSB\n"); 50 else if (memcmp(endian_test.c, "\x02\x01", 2) == 0) 51 printf("#define HOST_ELFDATA ELFDATA2LSB\n"); 52 else 53 exit(1); 54 55 return 0; 56 } 57