Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include "relocs.h"
0003 
0004 void die(char *fmt, ...)
0005 {
0006     va_list ap;
0007     va_start(ap, fmt);
0008     vfprintf(stderr, fmt, ap);
0009     va_end(ap);
0010     exit(1);
0011 }
0012 
0013 static void usage(void)
0014 {
0015     die("relocs [--abs-syms|--abs-relocs|--reloc-info|--text|--realmode]" \
0016         " vmlinux\n");
0017 }
0018 
0019 int main(int argc, char **argv)
0020 {
0021     int show_absolute_syms, show_absolute_relocs, show_reloc_info;
0022     int as_text, use_real_mode;
0023     const char *fname;
0024     FILE *fp;
0025     int i;
0026     unsigned char e_ident[EI_NIDENT];
0027 
0028     show_absolute_syms = 0;
0029     show_absolute_relocs = 0;
0030     show_reloc_info = 0;
0031     as_text = 0;
0032     use_real_mode = 0;
0033     fname = NULL;
0034     for (i = 1; i < argc; i++) {
0035         char *arg = argv[i];
0036         if (*arg == '-') {
0037             if (strcmp(arg, "--abs-syms") == 0) {
0038                 show_absolute_syms = 1;
0039                 continue;
0040             }
0041             if (strcmp(arg, "--abs-relocs") == 0) {
0042                 show_absolute_relocs = 1;
0043                 continue;
0044             }
0045             if (strcmp(arg, "--reloc-info") == 0) {
0046                 show_reloc_info = 1;
0047                 continue;
0048             }
0049             if (strcmp(arg, "--text") == 0) {
0050                 as_text = 1;
0051                 continue;
0052             }
0053             if (strcmp(arg, "--realmode") == 0) {
0054                 use_real_mode = 1;
0055                 continue;
0056             }
0057         }
0058         else if (!fname) {
0059             fname = arg;
0060             continue;
0061         }
0062         usage();
0063     }
0064     if (!fname) {
0065         usage();
0066     }
0067     fp = fopen(fname, "r");
0068     if (!fp) {
0069         die("Cannot open %s: %s\n", fname, strerror(errno));
0070     }
0071     if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT) {
0072         die("Cannot read %s: %s", fname, strerror(errno));
0073     }
0074     rewind(fp);
0075     if (e_ident[EI_CLASS] == ELFCLASS64)
0076         process_64(fp, use_real_mode, as_text,
0077                show_absolute_syms, show_absolute_relocs,
0078                show_reloc_info);
0079     else
0080         process_32(fp, use_real_mode, as_text,
0081                show_absolute_syms, show_absolute_relocs,
0082                show_reloc_info);
0083     fclose(fp);
0084     return 0;
0085 }