xref: /linux/scripts/mod/mk_elfconfig.c (revision b6ebbac51bedf9e98e837688bc838f400196da5e)
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