162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include "relocs.h" 362306a36Sopenharmony_ci 462306a36Sopenharmony_civoid die(char *fmt, ...) 562306a36Sopenharmony_ci{ 662306a36Sopenharmony_ci va_list ap; 762306a36Sopenharmony_ci va_start(ap, fmt); 862306a36Sopenharmony_ci vfprintf(stderr, fmt, ap); 962306a36Sopenharmony_ci va_end(ap); 1062306a36Sopenharmony_ci exit(1); 1162306a36Sopenharmony_ci} 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistatic void usage(void) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci die("relocs [--abs-syms|--abs-relocs|--reloc-info|--text|--realmode]" \ 1662306a36Sopenharmony_ci " vmlinux\n"); 1762306a36Sopenharmony_ci} 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ciint main(int argc, char **argv) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci int show_absolute_syms, show_absolute_relocs, show_reloc_info; 2262306a36Sopenharmony_ci int as_text, use_real_mode; 2362306a36Sopenharmony_ci const char *fname; 2462306a36Sopenharmony_ci FILE *fp; 2562306a36Sopenharmony_ci int i; 2662306a36Sopenharmony_ci unsigned char e_ident[EI_NIDENT]; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci show_absolute_syms = 0; 2962306a36Sopenharmony_ci show_absolute_relocs = 0; 3062306a36Sopenharmony_ci show_reloc_info = 0; 3162306a36Sopenharmony_ci as_text = 0; 3262306a36Sopenharmony_ci use_real_mode = 0; 3362306a36Sopenharmony_ci fname = NULL; 3462306a36Sopenharmony_ci for (i = 1; i < argc; i++) { 3562306a36Sopenharmony_ci char *arg = argv[i]; 3662306a36Sopenharmony_ci if (*arg == '-') { 3762306a36Sopenharmony_ci if (strcmp(arg, "--abs-syms") == 0) { 3862306a36Sopenharmony_ci show_absolute_syms = 1; 3962306a36Sopenharmony_ci continue; 4062306a36Sopenharmony_ci } 4162306a36Sopenharmony_ci if (strcmp(arg, "--abs-relocs") == 0) { 4262306a36Sopenharmony_ci show_absolute_relocs = 1; 4362306a36Sopenharmony_ci continue; 4462306a36Sopenharmony_ci } 4562306a36Sopenharmony_ci if (strcmp(arg, "--reloc-info") == 0) { 4662306a36Sopenharmony_ci show_reloc_info = 1; 4762306a36Sopenharmony_ci continue; 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci if (strcmp(arg, "--text") == 0) { 5062306a36Sopenharmony_ci as_text = 1; 5162306a36Sopenharmony_ci continue; 5262306a36Sopenharmony_ci } 5362306a36Sopenharmony_ci if (strcmp(arg, "--realmode") == 0) { 5462306a36Sopenharmony_ci use_real_mode = 1; 5562306a36Sopenharmony_ci continue; 5662306a36Sopenharmony_ci } 5762306a36Sopenharmony_ci } 5862306a36Sopenharmony_ci else if (!fname) { 5962306a36Sopenharmony_ci fname = arg; 6062306a36Sopenharmony_ci continue; 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci usage(); 6362306a36Sopenharmony_ci } 6462306a36Sopenharmony_ci if (!fname) { 6562306a36Sopenharmony_ci usage(); 6662306a36Sopenharmony_ci } 6762306a36Sopenharmony_ci fp = fopen(fname, "r"); 6862306a36Sopenharmony_ci if (!fp) { 6962306a36Sopenharmony_ci die("Cannot open %s: %s\n", fname, strerror(errno)); 7062306a36Sopenharmony_ci } 7162306a36Sopenharmony_ci if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT) { 7262306a36Sopenharmony_ci die("Cannot read %s: %s", fname, strerror(errno)); 7362306a36Sopenharmony_ci } 7462306a36Sopenharmony_ci rewind(fp); 7562306a36Sopenharmony_ci if (e_ident[EI_CLASS] == ELFCLASS64) 7662306a36Sopenharmony_ci process_64(fp, use_real_mode, as_text, 7762306a36Sopenharmony_ci show_absolute_syms, show_absolute_relocs, 7862306a36Sopenharmony_ci show_reloc_info); 7962306a36Sopenharmony_ci else 8062306a36Sopenharmony_ci process_32(fp, use_real_mode, as_text, 8162306a36Sopenharmony_ci show_absolute_syms, show_absolute_relocs, 8262306a36Sopenharmony_ci show_reloc_info); 8362306a36Sopenharmony_ci fclose(fp); 8462306a36Sopenharmony_ci return 0; 8562306a36Sopenharmony_ci} 86