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