Skip to content

Commit

Permalink
x86, relocs: Add manual debug mode
Browse files Browse the repository at this point in the history
Improve the debuggability of relocations output. When trying to compare
the output between different linkers, it's handy to be able to see the
section names in output.

Signed-off-by: Michael Davidson <md@google.com>
Link: http://lkml.kernel.org/r/20140121203223.GA12649@www.outflux.net
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
  • Loading branch information
Michael Davidson authored and H. Peter Anvin committed Jan 22, 2014
1 parent 6f34152 commit 214a887
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 8 deletions.
30 changes: 29 additions & 1 deletion arch/x86/tools/relocs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1015,14 +1015,38 @@ static void emit_relocs(int as_text, int use_real_mode)
}
}

/*
* As an aid to debugging problems with different linkers
* print summary information about the relocs.
* Since different linkers tend to emit the sections in
* different orders we use the section names in the output.
*/
static int do_reloc_info(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
const char *symname)
{
printf("%s\t%s\t%s\t%s\n",
sec_name(sec->shdr.sh_info),
rel_type(ELF_R_TYPE(rel->r_info)),
symname,
sec_name(sym->st_shndx));
return 0;
}

static void print_reloc_info(void)
{
printf("reloc section\treloc type\tsymbol\tsymbol section\n");
walk_relocs(do_reloc_info);
}

#if ELF_BITS == 64
# define process process_64
#else
# define process process_32
#endif

void process(FILE *fp, int use_real_mode, int as_text,
int show_absolute_syms, int show_absolute_relocs)
int show_absolute_syms, int show_absolute_relocs,
int show_reloc_info)
{
regex_init(use_real_mode);
read_ehdr(fp);
Expand All @@ -1040,5 +1064,9 @@ void process(FILE *fp, int use_real_mode, int as_text,
print_absolute_relocs();
return;
}
if (show_reloc_info) {
print_reloc_info();
return;
}
emit_relocs(as_text, use_real_mode);
}
7 changes: 4 additions & 3 deletions arch/x86/tools/relocs.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ enum symtype {
};

void process_32(FILE *fp, int use_real_mode, int as_text,
int show_absolute_syms, int show_absolute_relocs);
int show_absolute_syms, int show_absolute_relocs,
int show_reloc_info);
void process_64(FILE *fp, int use_real_mode, int as_text,
int show_absolute_syms, int show_absolute_relocs);

int show_absolute_syms, int show_absolute_relocs,
int show_reloc_info);
#endif /* RELOCS_H */
16 changes: 12 additions & 4 deletions arch/x86/tools/relocs_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@ void die(char *fmt, ...)

static void usage(void)
{
die("relocs [--abs-syms|--abs-relocs|--text|--realmode] vmlinux\n");
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;
int show_absolute_syms, show_absolute_relocs, show_reloc_info;
int as_text, use_real_mode;
const char *fname;
FILE *fp;
Expand All @@ -25,6 +26,7 @@ int main(int argc, char **argv)

show_absolute_syms = 0;
show_absolute_relocs = 0;
show_reloc_info = 0;
as_text = 0;
use_real_mode = 0;
fname = NULL;
Expand All @@ -39,6 +41,10 @@ int main(int argc, char **argv)
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;
Expand Down Expand Up @@ -67,10 +73,12 @@ int main(int argc, char **argv)
rewind(fp);
if (e_ident[EI_CLASS] == ELFCLASS64)
process_64(fp, use_real_mode, as_text,
show_absolute_syms, show_absolute_relocs);
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_absolute_syms, show_absolute_relocs,
show_reloc_info);
fclose(fp);
return 0;
}

0 comments on commit 214a887

Please sign in to comment.