aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVineet Gupta <vgupta@synopsys.com>2016-10-25 14:23:19 -0400
committerVineet Gupta <vgupta@synopsys.com>2016-10-28 13:10:29 -0400
commitb75dcd9c7d352c7d9ea9010e95c708595094896a (patch)
treeea93f43853fb22b32e60ff745a88a963b7f29ac3
parentd65283f7b695b5d04ca1ab58b6bb41f443b96286 (diff)
ARC: module: print pretty section names
Now that we have referece to section name string table in apply_relocate_add(), use it to - print the name of section being relocated - print symbol with NULL name (since it refers to a section) before | Section to fixup 7000a060 | ========================================================= | rela->r_off | rela->addend | sym->st_value | ADDR | VALUE | ========================================================= | 1c 0 7000e000 7000a07c 7000e000 [] | 40 0 7000a000 7000a0a0 7000a000 [] after | Section to fixup .eh_frame @7000a060 | ========================================================= | r_off r_add st_value ADDRESS VALUE | ========================================================= | 1c 0 7000e000 7000a07c 7000e000 [.init.text] | 40 0 7000a000 7000a0a0 7000a000 [.exit.text] Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
-rw-r--r--arch/arc/kernel/module.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/arch/arc/kernel/module.c b/arch/arc/kernel/module.c
index 24bd2ffb90b7..42e964db2967 100644
--- a/arch/arc/kernel/module.c
+++ b/arch/arc/kernel/module.c
@@ -51,31 +51,33 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
51 unsigned int relsec, /* sec index for relo sec */ 51 unsigned int relsec, /* sec index for relo sec */
52 struct module *module) 52 struct module *module)
53{ 53{
54 int i, n; 54 int i, n, relo_type;
55 Elf32_Rela *rel_entry = (void *)sechdrs[relsec].sh_addr; 55 Elf32_Rela *rel_entry = (void *)sechdrs[relsec].sh_addr;
56 Elf32_Sym *sym_entry, *sym_sec; 56 Elf32_Sym *sym_entry, *sym_sec;
57 Elf32_Addr relocation; 57 Elf32_Addr relocation, location, tgt_addr;
58 Elf32_Addr location;
59 Elf32_Addr sec_to_patch;
60 int relo_type;
61 unsigned int tgtsec; 58 unsigned int tgtsec;
62 59
60 /*
61 * @relsec has relocations e.g. .rela.init.text
62 * @tgtsec is section to patch e.g. .init.text
63 */
63 tgtsec = sechdrs[relsec].sh_info; 64 tgtsec = sechdrs[relsec].sh_info;
64 sec_to_patch = sechdrs[tgtsec].sh_addr; 65 tgt_addr = sechdrs[tgtsec].sh_addr;
65 sym_sec = (Elf32_Sym *) sechdrs[symindex].sh_addr; 66 sym_sec = (Elf32_Sym *) sechdrs[symindex].sh_addr;
66 n = sechdrs[relsec].sh_size / sizeof(*rel_entry); 67 n = sechdrs[relsec].sh_size / sizeof(*rel_entry);
67 68
68 pr_debug("\n========== Module Sym reloc ===========================\n"); 69 pr_debug("\nSection to fixup %s @%x\n",
69 pr_debug("Section to fixup %x\n", sec_to_patch); 70 module->arch.secstr + sechdrs[tgtsec].sh_name, tgt_addr);
70 pr_debug("=========================================================\n"); 71 pr_debug("=========================================================\n");
71 pr_debug("rela->r_off | rela->addend | sym->st_value | ADDR | VALUE\n"); 72 pr_debug("r_off\tr_add\tst_value ADDRESS VALUE\n");
72 pr_debug("=========================================================\n"); 73 pr_debug("=========================================================\n");
73 74
74 /* Loop thru entries in relocation section */ 75 /* Loop thru entries in relocation section */
75 for (i = 0; i < n; i++) { 76 for (i = 0; i < n; i++) {
77 const char *s;
76 78
77 /* This is where to make the change */ 79 /* This is where to make the change */
78 location = sec_to_patch + rel_entry[i].r_offset; 80 location = tgt_addr + rel_entry[i].r_offset;
79 81
80 /* This is the symbol it is referring to. Note that all 82 /* This is the symbol it is referring to. Note that all
81 undefined symbols have been resolved. */ 83 undefined symbols have been resolved. */
@@ -83,10 +85,15 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
83 85
84 relocation = sym_entry->st_value + rel_entry[i].r_addend; 86 relocation = sym_entry->st_value + rel_entry[i].r_addend;
85 87
86 pr_debug("\t%x\t\t%x\t\t%x %x %x [%s]\n", 88 if (sym_entry->st_name == 0 && ELF_ST_TYPE (sym_entry->st_info) == STT_SECTION) {
87 rel_entry[i].r_offset, rel_entry[i].r_addend, 89 s = module->arch.secstr + sechdrs[sym_entry->st_shndx].sh_name;
88 sym_entry->st_value, location, relocation, 90 } else {
89 strtab + sym_entry->st_name); 91 s = strtab + sym_entry->st_name;
92 }
93
94 pr_debug(" %x\t%x\t%x %x %x [%s]\n",
95 rel_entry[i].r_offset, rel_entry[i].r_addend,
96 sym_entry->st_value, location, relocation, s);
90 97
91 /* This assumes modules are built with -mlong-calls 98 /* This assumes modules are built with -mlong-calls
92 * so any branches/jumps are absolute 32 bit jmps 99 * so any branches/jumps are absolute 32 bit jmps