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