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