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