diff options
Diffstat (limited to 'arch/x86/tools/relocs_common.c')
| -rw-r--r-- | arch/x86/tools/relocs_common.c | 84 | 
1 files changed, 84 insertions, 0 deletions
diff --git a/arch/x86/tools/relocs_common.c b/arch/x86/tools/relocs_common.c new file mode 100644 index 00000000000..acab636bcb3 --- /dev/null +++ b/arch/x86/tools/relocs_common.c @@ -0,0 +1,84 @@ +#include "relocs.h" + +void die(char *fmt, ...) +{ +	va_list ap; +	va_start(ap, fmt); +	vfprintf(stderr, fmt, ap); +	va_end(ap); +	exit(1); +} + +static void usage(void) +{ +	die("relocs [--abs-syms|--abs-relocs|--reloc-info|--text|--realmode]" \ +	    " vmlinux\n"); +} + +int main(int argc, char **argv) +{ +	int show_absolute_syms, show_absolute_relocs, show_reloc_info; +	int as_text, use_real_mode; +	const char *fname; +	FILE *fp; +	int i; +	unsigned char e_ident[EI_NIDENT]; + +	show_absolute_syms = 0; +	show_absolute_relocs = 0; +	show_reloc_info = 0; +	as_text = 0; +	use_real_mode = 0; +	fname = NULL; +	for (i = 1; i < argc; i++) { +		char *arg = argv[i]; +		if (*arg == '-') { +			if (strcmp(arg, "--abs-syms") == 0) { +				show_absolute_syms = 1; +				continue; +			} +			if (strcmp(arg, "--abs-relocs") == 0) { +				show_absolute_relocs = 1; +				continue; +			} +			if (strcmp(arg, "--reloc-info") == 0) { +				show_reloc_info = 1; +				continue; +			} +			if (strcmp(arg, "--text") == 0) { +				as_text = 1; +				continue; +			} +			if (strcmp(arg, "--realmode") == 0) { +				use_real_mode = 1; +				continue; +			} +		} +		else if (!fname) { +			fname = arg; +			continue; +		} +		usage(); +	} +	if (!fname) { +		usage(); +	} +	fp = fopen(fname, "r"); +	if (!fp) { +		die("Cannot open %s: %s\n", fname, strerror(errno)); +	} +	if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT) { +		die("Cannot read %s: %s", fname, strerror(errno)); +	} +	rewind(fp); +	if (e_ident[EI_CLASS] == ELFCLASS64) +		process_64(fp, use_real_mode, as_text, +			   show_absolute_syms, show_absolute_relocs, +			   show_reloc_info); +	else +		process_32(fp, use_real_mode, as_text, +			   show_absolute_syms, show_absolute_relocs, +			   show_reloc_info); +	fclose(fp); +	return 0; +}  | 
