xref: /linux/scripts/mod/mk_elfconfig.c (revision 5e2aa2ed08e2e280121dc7cf5609c87d464f12ef)
11da177e4SLinus Torvalds #include <stdio.h>
21da177e4SLinus Torvalds #include <stdlib.h>
31da177e4SLinus Torvalds #include <string.h>
41da177e4SLinus Torvalds #include <elf.h>
51da177e4SLinus Torvalds 
61da177e4SLinus Torvalds int
71da177e4SLinus Torvalds main(int argc, char **argv)
81da177e4SLinus Torvalds {
91da177e4SLinus Torvalds 	unsigned char ei[EI_NIDENT];
101da177e4SLinus Torvalds 	union { short s; char c[2]; } endian_test;
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds 	if (fread(ei, 1, EI_NIDENT, stdin) != EI_NIDENT) {
131da177e4SLinus Torvalds 		fprintf(stderr, "Error: input truncated\n");
141da177e4SLinus Torvalds 		return 1;
151da177e4SLinus Torvalds 	}
161da177e4SLinus Torvalds 	if (memcmp(ei, ELFMAG, SELFMAG) != 0) {
171da177e4SLinus Torvalds 		fprintf(stderr, "Error: not ELF\n");
181da177e4SLinus Torvalds 		return 1;
191da177e4SLinus Torvalds 	}
201da177e4SLinus Torvalds 	switch (ei[EI_CLASS]) {
211da177e4SLinus Torvalds 	case ELFCLASS32:
221da177e4SLinus Torvalds 		printf("#define KERNEL_ELFCLASS ELFCLASS32\n");
231da177e4SLinus Torvalds 		break;
241da177e4SLinus Torvalds 	case ELFCLASS64:
251da177e4SLinus Torvalds 		printf("#define KERNEL_ELFCLASS ELFCLASS64\n");
261da177e4SLinus Torvalds 		break;
271da177e4SLinus Torvalds 	default:
28*6803dc0eSSam Ravnborg 		exit(1);
291da177e4SLinus Torvalds 	}
301da177e4SLinus Torvalds 	switch (ei[EI_DATA]) {
311da177e4SLinus Torvalds 	case ELFDATA2LSB:
321da177e4SLinus Torvalds 		printf("#define KERNEL_ELFDATA ELFDATA2LSB\n");
331da177e4SLinus Torvalds 		break;
341da177e4SLinus Torvalds 	case ELFDATA2MSB:
351da177e4SLinus Torvalds 		printf("#define KERNEL_ELFDATA ELFDATA2MSB\n");
361da177e4SLinus Torvalds 		break;
371da177e4SLinus Torvalds 	default:
38*6803dc0eSSam Ravnborg 		exit(1);
391da177e4SLinus Torvalds 	}
401da177e4SLinus Torvalds 
411da177e4SLinus Torvalds 	if (sizeof(unsigned long) == 4) {
421da177e4SLinus Torvalds 		printf("#define HOST_ELFCLASS ELFCLASS32\n");
431da177e4SLinus Torvalds 	} else if (sizeof(unsigned long) == 8) {
441da177e4SLinus Torvalds 		printf("#define HOST_ELFCLASS ELFCLASS64\n");
451da177e4SLinus Torvalds 	}
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds 	endian_test.s = 0x0102;
481da177e4SLinus Torvalds 	if (memcmp(endian_test.c, "\x01\x02", 2) == 0)
491da177e4SLinus Torvalds 		printf("#define HOST_ELFDATA ELFDATA2MSB\n");
501da177e4SLinus Torvalds 	else if (memcmp(endian_test.c, "\x02\x01", 2) == 0)
511da177e4SLinus Torvalds 		printf("#define HOST_ELFDATA ELFDATA2LSB\n");
521da177e4SLinus Torvalds 	else
53*6803dc0eSSam Ravnborg 		exit(1);
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds 	return 0;
561da177e4SLinus Torvalds }
57