xref: /openbmc/linux/arch/x86/tools/relocs_common.c (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2c889ba80SH. Peter Anvin #include "relocs.h"
3c889ba80SH. Peter Anvin 
die(char * fmt,...)4c889ba80SH. Peter Anvin void die(char *fmt, ...)
5c889ba80SH. Peter Anvin {
6c889ba80SH. Peter Anvin 	va_list ap;
7c889ba80SH. Peter Anvin 	va_start(ap, fmt);
8c889ba80SH. Peter Anvin 	vfprintf(stderr, fmt, ap);
9c889ba80SH. Peter Anvin 	va_end(ap);
10c889ba80SH. Peter Anvin 	exit(1);
11c889ba80SH. Peter Anvin }
12c889ba80SH. Peter Anvin 
usage(void)13c889ba80SH. Peter Anvin static void usage(void)
14c889ba80SH. Peter Anvin {
15214a8876SMichael Davidson 	die("relocs [--abs-syms|--abs-relocs|--reloc-info|--text|--realmode]" \
16214a8876SMichael Davidson 	    " vmlinux\n");
17c889ba80SH. Peter Anvin }
18c889ba80SH. Peter Anvin 
main(int argc,char ** argv)19c889ba80SH. Peter Anvin int main(int argc, char **argv)
20c889ba80SH. Peter Anvin {
21214a8876SMichael Davidson 	int show_absolute_syms, show_absolute_relocs, show_reloc_info;
22c889ba80SH. Peter Anvin 	int as_text, use_real_mode;
23c889ba80SH. Peter Anvin 	const char *fname;
24c889ba80SH. Peter Anvin 	FILE *fp;
25c889ba80SH. Peter Anvin 	int i;
26c889ba80SH. Peter Anvin 	unsigned char e_ident[EI_NIDENT];
27c889ba80SH. Peter Anvin 
28c889ba80SH. Peter Anvin 	show_absolute_syms = 0;
29c889ba80SH. Peter Anvin 	show_absolute_relocs = 0;
30214a8876SMichael Davidson 	show_reloc_info = 0;
31c889ba80SH. Peter Anvin 	as_text = 0;
32c889ba80SH. Peter Anvin 	use_real_mode = 0;
33c889ba80SH. Peter Anvin 	fname = NULL;
34c889ba80SH. Peter Anvin 	for (i = 1; i < argc; i++) {
35c889ba80SH. Peter Anvin 		char *arg = argv[i];
36c889ba80SH. Peter Anvin 		if (*arg == '-') {
37c889ba80SH. Peter Anvin 			if (strcmp(arg, "--abs-syms") == 0) {
38c889ba80SH. Peter Anvin 				show_absolute_syms = 1;
39c889ba80SH. Peter Anvin 				continue;
40c889ba80SH. Peter Anvin 			}
41c889ba80SH. Peter Anvin 			if (strcmp(arg, "--abs-relocs") == 0) {
42c889ba80SH. Peter Anvin 				show_absolute_relocs = 1;
43c889ba80SH. Peter Anvin 				continue;
44c889ba80SH. Peter Anvin 			}
45214a8876SMichael Davidson 			if (strcmp(arg, "--reloc-info") == 0) {
46214a8876SMichael Davidson 				show_reloc_info = 1;
47214a8876SMichael Davidson 				continue;
48214a8876SMichael Davidson 			}
49c889ba80SH. Peter Anvin 			if (strcmp(arg, "--text") == 0) {
50c889ba80SH. Peter Anvin 				as_text = 1;
51c889ba80SH. Peter Anvin 				continue;
52c889ba80SH. Peter Anvin 			}
53c889ba80SH. Peter Anvin 			if (strcmp(arg, "--realmode") == 0) {
54c889ba80SH. Peter Anvin 				use_real_mode = 1;
55c889ba80SH. Peter Anvin 				continue;
56c889ba80SH. Peter Anvin 			}
57c889ba80SH. Peter Anvin 		}
58c889ba80SH. Peter Anvin 		else if (!fname) {
59c889ba80SH. Peter Anvin 			fname = arg;
60c889ba80SH. Peter Anvin 			continue;
61c889ba80SH. Peter Anvin 		}
62c889ba80SH. Peter Anvin 		usage();
63c889ba80SH. Peter Anvin 	}
64c889ba80SH. Peter Anvin 	if (!fname) {
65c889ba80SH. Peter Anvin 		usage();
66c889ba80SH. Peter Anvin 	}
67c889ba80SH. Peter Anvin 	fp = fopen(fname, "r");
68c889ba80SH. Peter Anvin 	if (!fp) {
69c889ba80SH. Peter Anvin 		die("Cannot open %s: %s\n", fname, strerror(errno));
70c889ba80SH. Peter Anvin 	}
71c889ba80SH. Peter Anvin 	if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT) {
72c889ba80SH. Peter Anvin 		die("Cannot read %s: %s", fname, strerror(errno));
73c889ba80SH. Peter Anvin 	}
74c889ba80SH. Peter Anvin 	rewind(fp);
75c889ba80SH. Peter Anvin 	if (e_ident[EI_CLASS] == ELFCLASS64)
76c889ba80SH. Peter Anvin 		process_64(fp, use_real_mode, as_text,
77214a8876SMichael Davidson 			   show_absolute_syms, show_absolute_relocs,
78214a8876SMichael Davidson 			   show_reloc_info);
79c889ba80SH. Peter Anvin 	else
80c889ba80SH. Peter Anvin 		process_32(fp, use_real_mode, as_text,
81214a8876SMichael Davidson 			   show_absolute_syms, show_absolute_relocs,
82214a8876SMichael Davidson 			   show_reloc_info);
83c889ba80SH. Peter Anvin 	fclose(fp);
84c889ba80SH. Peter Anvin 	return 0;
85c889ba80SH. Peter Anvin }
86