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