Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
[linux-2.6] / 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 (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                 abort();
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                 abort();
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                 abort();
57
58         if ((strcmp(argv[1], "v850") == 0) || (strcmp(argv[1], "h8300") == 0))
59                 printf("#define MODULE_SYMBOL_PREFIX \"_\"\n");
60         else
61                 printf("#define MODULE_SYMBOL_PREFIX \"\"\n");
62
63         return 0;
64 }
65