18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include "relocs.h" 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_civoid die(char *fmt, ...) 58c2ecf20Sopenharmony_ci{ 68c2ecf20Sopenharmony_ci va_list ap; 78c2ecf20Sopenharmony_ci va_start(ap, fmt); 88c2ecf20Sopenharmony_ci vfprintf(stderr, fmt, ap); 98c2ecf20Sopenharmony_ci va_end(ap); 108c2ecf20Sopenharmony_ci exit(1); 118c2ecf20Sopenharmony_ci} 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistatic void usage(void) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci die("relocs [--abs-syms|--abs-relocs|--reloc-info|--text|--realmode]" \ 168c2ecf20Sopenharmony_ci " vmlinux\n"); 178c2ecf20Sopenharmony_ci} 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciint main(int argc, char **argv) 208c2ecf20Sopenharmony_ci{ 218c2ecf20Sopenharmony_ci int show_absolute_syms, show_absolute_relocs, show_reloc_info; 228c2ecf20Sopenharmony_ci int as_text, use_real_mode; 238c2ecf20Sopenharmony_ci const char *fname; 248c2ecf20Sopenharmony_ci FILE *fp; 258c2ecf20Sopenharmony_ci int i; 268c2ecf20Sopenharmony_ci unsigned char e_ident[EI_NIDENT]; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci show_absolute_syms = 0; 298c2ecf20Sopenharmony_ci show_absolute_relocs = 0; 308c2ecf20Sopenharmony_ci show_reloc_info = 0; 318c2ecf20Sopenharmony_ci as_text = 0; 328c2ecf20Sopenharmony_ci use_real_mode = 0; 338c2ecf20Sopenharmony_ci fname = NULL; 348c2ecf20Sopenharmony_ci for (i = 1; i < argc; i++) { 358c2ecf20Sopenharmony_ci char *arg = argv[i]; 368c2ecf20Sopenharmony_ci if (*arg == '-') { 378c2ecf20Sopenharmony_ci if (strcmp(arg, "--abs-syms") == 0) { 388c2ecf20Sopenharmony_ci show_absolute_syms = 1; 398c2ecf20Sopenharmony_ci continue; 408c2ecf20Sopenharmony_ci } 418c2ecf20Sopenharmony_ci if (strcmp(arg, "--abs-relocs") == 0) { 428c2ecf20Sopenharmony_ci show_absolute_relocs = 1; 438c2ecf20Sopenharmony_ci continue; 448c2ecf20Sopenharmony_ci } 458c2ecf20Sopenharmony_ci if (strcmp(arg, "--reloc-info") == 0) { 468c2ecf20Sopenharmony_ci show_reloc_info = 1; 478c2ecf20Sopenharmony_ci continue; 488c2ecf20Sopenharmony_ci } 498c2ecf20Sopenharmony_ci if (strcmp(arg, "--text") == 0) { 508c2ecf20Sopenharmony_ci as_text = 1; 518c2ecf20Sopenharmony_ci continue; 528c2ecf20Sopenharmony_ci } 538c2ecf20Sopenharmony_ci if (strcmp(arg, "--realmode") == 0) { 548c2ecf20Sopenharmony_ci use_real_mode = 1; 558c2ecf20Sopenharmony_ci continue; 568c2ecf20Sopenharmony_ci } 578c2ecf20Sopenharmony_ci } 588c2ecf20Sopenharmony_ci else if (!fname) { 598c2ecf20Sopenharmony_ci fname = arg; 608c2ecf20Sopenharmony_ci continue; 618c2ecf20Sopenharmony_ci } 628c2ecf20Sopenharmony_ci usage(); 638c2ecf20Sopenharmony_ci } 648c2ecf20Sopenharmony_ci if (!fname) { 658c2ecf20Sopenharmony_ci usage(); 668c2ecf20Sopenharmony_ci } 678c2ecf20Sopenharmony_ci fp = fopen(fname, "r"); 688c2ecf20Sopenharmony_ci if (!fp) { 698c2ecf20Sopenharmony_ci die("Cannot open %s: %s\n", fname, strerror(errno)); 708c2ecf20Sopenharmony_ci } 718c2ecf20Sopenharmony_ci if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT) { 728c2ecf20Sopenharmony_ci die("Cannot read %s: %s", fname, strerror(errno)); 738c2ecf20Sopenharmony_ci } 748c2ecf20Sopenharmony_ci rewind(fp); 758c2ecf20Sopenharmony_ci if (e_ident[EI_CLASS] == ELFCLASS64) 768c2ecf20Sopenharmony_ci process_64(fp, use_real_mode, as_text, 778c2ecf20Sopenharmony_ci show_absolute_syms, show_absolute_relocs, 788c2ecf20Sopenharmony_ci show_reloc_info); 798c2ecf20Sopenharmony_ci else 808c2ecf20Sopenharmony_ci process_32(fp, use_real_mode, as_text, 818c2ecf20Sopenharmony_ci show_absolute_syms, show_absolute_relocs, 828c2ecf20Sopenharmony_ci show_reloc_info); 838c2ecf20Sopenharmony_ci fclose(fp); 848c2ecf20Sopenharmony_ci return 0; 858c2ecf20Sopenharmony_ci} 86