xref: /linux/arch/mips/boot/tools/relocs_main.c (revision 294cbd05e32990c3b1a62be27441fc719edebbab)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 #include <stdio.h>
4 #include <stdint.h>
5 #include <stdarg.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <errno.h>
9 #include <endian.h>
10 #include <elf.h>
11 
12 #include "relocs.h"
13 
14 void die(char *fmt, ...)
15 {
16 	va_list ap;
17 
18 	va_start(ap, fmt);
19 	vfprintf(stderr, fmt, ap);
20 	va_end(ap);
21 	exit(1);
22 }
23 
24 static void usage(void)
25 {
26 	die("relocs [--reloc-info|--text|--bin|--keep] vmlinux\n");
27 }
28 
29 int main(int argc, char **argv)
30 {
31 	int show_reloc_info, as_text, as_bin, keep_relocs;
32 	const char *fname;
33 	FILE *fp;
34 	int i;
35 	unsigned char e_ident[EI_NIDENT];
36 
37 	show_reloc_info = 0;
38 	as_text = 0;
39 	as_bin = 0;
40 	keep_relocs = 0;
41 	fname = NULL;
42 	for (i = 1; i < argc; i++) {
43 		char *arg = argv[i];
44 
45 		if (*arg == '-') {
46 			if (strcmp(arg, "--reloc-info") == 0) {
47 				show_reloc_info = 1;
48 				continue;
49 			}
50 			if (strcmp(arg, "--text") == 0) {
51 				as_text = 1;
52 				continue;
53 			}
54 			if (strcmp(arg, "--bin") == 0) {
55 				as_bin = 1;
56 				continue;
57 			}
58 			if (strcmp(arg, "--keep") == 0) {
59 				keep_relocs = 1;
60 				continue;
61 			}
62 		} else if (!fname) {
63 			fname = arg;
64 			continue;
65 		}
66 		usage();
67 	}
68 	if (!fname)
69 		usage();
70 
71 	fp = fopen(fname, "r+");
72 	if (!fp)
73 		die("Cannot open %s: %s\n", fname, strerror(errno));
74 
75 	if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT)
76 		die("Cannot read %s: %s", fname, strerror(errno));
77 
78 	rewind(fp);
79 	if (e_ident[EI_CLASS] == ELFCLASS64)
80 		process_64(fp, as_text,  as_bin, show_reloc_info, keep_relocs);
81 	else
82 		process_32(fp, as_text, as_bin, show_reloc_info, keep_relocs);
83 	fclose(fp);
84 	return 0;
85 }
86