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