0001
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 }