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 (argc != 2) { 13 fprintf(stderr, "Error: no arch\n"); 14 } 15 if (fread(ei, 1, EI_NIDENT, stdin) != EI_NIDENT) { 16 fprintf(stderr, "Error: input truncated\n"); 17 return 1; 18 } 19 if (memcmp(ei, ELFMAG, SELFMAG) != 0) { 20 fprintf(stderr, "Error: not ELF\n"); 21 return 1; 22 } 23 switch (ei[EI_CLASS]) { 24 case ELFCLASS32: 25 printf("#define KERNEL_ELFCLASS ELFCLASS32\n"); 26 break; 27 case ELFCLASS64: 28 printf("#define KERNEL_ELFCLASS ELFCLASS64\n"); 29 break; 30 default: 31 exit(1); 32 } 33 switch (ei[EI_DATA]) { 34 case ELFDATA2LSB: 35 printf("#define KERNEL_ELFDATA ELFDATA2LSB\n"); 36 break; 37 case ELFDATA2MSB: 38 printf("#define KERNEL_ELFDATA ELFDATA2MSB\n"); 39 break; 40 default: 41 exit(1); 42 } 43 44 if (sizeof(unsigned long) == 4) { 45 printf("#define HOST_ELFCLASS ELFCLASS32\n"); 46 } else if (sizeof(unsigned long) == 8) { 47 printf("#define HOST_ELFCLASS ELFCLASS64\n"); 48 } 49 50 endian_test.s = 0x0102; 51 if (memcmp(endian_test.c, "\x01\x02", 2) == 0) 52 printf("#define HOST_ELFDATA ELFDATA2MSB\n"); 53 else if (memcmp(endian_test.c, "\x02\x01", 2) == 0) 54 printf("#define HOST_ELFDATA ELFDATA2LSB\n"); 55 else 56 exit(1); 57 58 if ((strcmp(argv[1], "v850") == 0) || (strcmp(argv[1], "h8300") == 0) 59 || (strcmp(argv[1], "blackfin") == 0)) 60 printf("#define MODULE_SYMBOL_PREFIX \"_\"\n"); 61 else 62 printf("#define MODULE_SYMBOL_PREFIX \"\"\n"); 63 64 return 0; 65 } 66 67