Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs...
[pandora-kernel.git] / scripts / mod / mk_elfconfig.c
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