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, fmt, ap); 9 va_end(ap); 10 exit(1); 11 } 12 13 static void usage(void) 14 { 15 die("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(arg, "--abs-syms") == 0) { 38 show_absolute_syms = 1; 39 continue; 40 } 41 if (strcmp(arg, "--abs-relocs") == 0) { 42 show_absolute_relocs = 1; 43 continue; 44 } 45 if (strcmp(arg, "--reloc-info") == 0) { 46 show_reloc_info = 1; 47 continue; 48 } 49 if (strcmp(arg, "--text") == 0) { 50 as_text = 1; 51 continue; 52 } 53 if (strcmp(arg, "--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(fname, "r"); 68 if (!fp) { 69 die("Cannot open %s: %s\n", fname, strerror(errno)); 70 } 71 if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT) { 72 die("Cannot read %s: %s", fname, strerror(errno)); 73 } 74 rewind(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(fp); 84 return 0; 85 } 86