aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/tools/relocs.c
diff options
context:
space:
mode:
authorMichael Davidson <md@google.com>2014-01-21 15:32:23 -0500
committerH. Peter Anvin <hpa@linux.intel.com>2014-01-22 07:21:45 -0500
commit214a88768d34079b70e0f2ba37b91a3b717fddbb (patch)
treeb06bc0b6da796e31aa9bf5536a991c85f2f88fe3 /arch/x86/tools/relocs.c
parent6f34152f54bcf63a49ea701643c81f5b2168fec8 (diff)
x86, relocs: Add manual debug mode
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>
Diffstat (limited to 'arch/x86/tools/relocs.c')
-rw-r--r--arch/x86/tools/relocs.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
index f7bab68a4b83..9c2ab06dc4f2 100644
--- a/arch/x86/tools/relocs.c
+++ b/arch/x86/tools/relocs.c
@@ -1015,6 +1015,29 @@ static void emit_relocs(int as_text, int use_real_mode)
1015 } 1015 }
1016} 1016}
1017 1017
1018/*
1019 * As an aid to debugging problems with different linkers
1020 * print summary information about the relocs.
1021 * Since different linkers tend to emit the sections in
1022 * different orders we use the section names in the output.
1023 */
1024static int do_reloc_info(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
1025 const char *symname)
1026{
1027 printf("%s\t%s\t%s\t%s\n",
1028 sec_name(sec->shdr.sh_info),
1029 rel_type(ELF_R_TYPE(rel->r_info)),
1030 symname,
1031 sec_name(sym->st_shndx));
1032 return 0;
1033}
1034
1035static void print_reloc_info(void)
1036{
1037 printf("reloc section\treloc type\tsymbol\tsymbol section\n");
1038 walk_relocs(do_reloc_info);
1039}
1040
1018#if ELF_BITS == 64 1041#if ELF_BITS == 64
1019# define process process_64 1042# define process process_64
1020#else 1043#else
@@ -1022,7 +1045,8 @@ static void emit_relocs(int as_text, int use_real_mode)
1022#endif 1045#endif
1023 1046
1024void process(FILE *fp, int use_real_mode, int as_text, 1047void process(FILE *fp, int use_real_mode, int as_text,
1025 int show_absolute_syms, int show_absolute_relocs) 1048 int show_absolute_syms, int show_absolute_relocs,
1049 int show_reloc_info)
1026{ 1050{
1027 regex_init(use_real_mode); 1051 regex_init(use_real_mode);
1028 read_ehdr(fp); 1052 read_ehdr(fp);
@@ -1040,5 +1064,9 @@ void process(FILE *fp, int use_real_mode, int as_text,
1040 print_absolute_relocs(); 1064 print_absolute_relocs();
1041 return; 1065 return;
1042 } 1066 }
1067 if (show_reloc_info) {
1068 print_reloc_info();
1069 return;
1070 }
1043 emit_relocs(as_text, use_real_mode); 1071 emit_relocs(as_text, use_real_mode);
1044} 1072}