Skip to content

Commit d65283f

Browse files
committed
ARC: module: elide loop to save reference to .eh_frame
The loop was really needed in .debug_frame regime where wanted make it as SH_ALLOC so that apply_relocate_add() would process it. That's not needed for .eh_frame, so we check this in apply_relocate_add() which gets called for each section. Note that we need to save reference to "section name strings" section in module_frob_arch_sections() since apply_relocate_add() doesn't get that Signed-off-by: Vineet Gupta <[email protected]>
1 parent f644e36 commit d65283f

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

arch/arc/include/asm/module.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
struct mod_arch_specific {
1919
void *unw_info;
2020
int unw_sec_idx;
21+
const char *secstr;
2122
};
2223
#endif
2324

arch/arc/kernel/module.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,9 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
3030
char *secstr, struct module *mod)
3131
{
3232
#ifdef CONFIG_ARC_DW2_UNWIND
33-
int i;
34-
3533
mod->arch.unw_sec_idx = 0;
3634
mod->arch.unw_info = NULL;
37-
38-
for (i = 1; i < hdr->e_shnum; i++) {
39-
if (strcmp(secstr+sechdrs[i].sh_name, ".eh_frame") == 0) {
40-
mod->arch.unw_sec_idx = i;
41-
break;
42-
}
43-
}
35+
mod->arch.secstr = secstr;
4436
#endif
4537
return 0;
4638
}
@@ -66,8 +58,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
6658
Elf32_Addr location;
6759
Elf32_Addr sec_to_patch;
6860
int relo_type;
61+
unsigned int tgtsec;
6962

70-
sec_to_patch = sechdrs[sechdrs[relsec].sh_info].sh_addr;
63+
tgtsec = sechdrs[relsec].sh_info;
64+
sec_to_patch = sechdrs[tgtsec].sh_addr;
7165
sym_sec = (Elf32_Sym *) sechdrs[symindex].sh_addr;
7266
n = sechdrs[relsec].sh_size / sizeof(*rel_entry);
7367

@@ -111,6 +105,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
111105
goto relo_err;
112106

113107
}
108+
109+
if (strcmp(module->arch.secstr+sechdrs[tgtsec].sh_name, ".eh_frame") == 0)
110+
module->arch.unw_sec_idx = tgtsec;
111+
114112
return 0;
115113

116114
relo_err:

0 commit comments

Comments
 (0)