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