forked from Minki/linux
c889ba801d
Refactor the relocs tool so that the same tool can handle 32- and 64-bit ELF. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Cc: Kees Cook <keescook@chromium.org> Link: http://lkml.kernel.org/r/1365797627-20874-5-git-send-email-keescook@chromium.org
77 lines
1.5 KiB
C
77 lines
1.5 KiB
C
#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|--text|--realmode] vmlinux\n");
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int show_absolute_syms, show_absolute_relocs;
|
|
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;
|
|
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, "--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);
|
|
else
|
|
process_32(fp, use_real_mode, as_text,
|
|
show_absolute_syms, show_absolute_relocs);
|
|
fclose(fp);
|
|
return 0;
|
|
}
|