ARC: module: elide loop to save reference to .eh_frame
authorVineet Gupta <vgupta@synopsys.com>
Tue, 25 Oct 2016 17:43:20 +0000 (10:43 -0700)
committerVineet Gupta <vgupta@synopsys.com>
Fri, 28 Oct 2016 17:10:28 +0000 (10:10 -0700)
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 <vgupta@synopsys.com>
arch/arc/include/asm/module.h
arch/arc/kernel/module.c

index 518222b..6e91d8b 100644 (file)
@@ -18,6 +18,7 @@
 struct mod_arch_specific {
        void *unw_info;
        int unw_sec_idx;
+       const char *secstr;
 };
 #endif
 
index 9a28497..24bd2ff 100644 (file)
@@ -30,17 +30,9 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
                              char *secstr, struct module *mod)
 {
 #ifdef CONFIG_ARC_DW2_UNWIND
-       int i;
-
        mod->arch.unw_sec_idx = 0;
        mod->arch.unw_info = NULL;
-
-       for (i = 1; i < hdr->e_shnum; i++) {
-               if (strcmp(secstr+sechdrs[i].sh_name, ".eh_frame") == 0) {
-                       mod->arch.unw_sec_idx = i;
-                       break;
-               }
-       }
+       mod->arch.secstr = secstr;
 #endif
        return 0;
 }
@@ -66,8 +58,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
        Elf32_Addr location;
        Elf32_Addr sec_to_patch;
        int relo_type;
+       unsigned int tgtsec;
 
-       sec_to_patch = sechdrs[sechdrs[relsec].sh_info].sh_addr;
+       tgtsec = sechdrs[relsec].sh_info;
+       sec_to_patch = sechdrs[tgtsec].sh_addr;
        sym_sec = (Elf32_Sym *) sechdrs[symindex].sh_addr;
        n = sechdrs[relsec].sh_size / sizeof(*rel_entry);
 
@@ -111,6 +105,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
                        goto relo_err;
 
        }
+
+       if (strcmp(module->arch.secstr+sechdrs[tgtsec].sh_name, ".eh_frame") == 0)
+               module->arch.unw_sec_idx = tgtsec;
+
        return 0;
 
 relo_err: