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
Unified · Split
| @@ -18,6 +18,7 @@ · 17 unmodified lines | ||
| 18 | 18 | struct mod_arch_specific { |
| 19 | 19 | void *unw_info; |
| 20 | 20 | int unw_sec_idx; |
| 21 | + const char *secstr; | |
| 21 | 22 | }; |
| 22 | 23 | #endif |
| 23 | 24 | |
| @@ -30,17 +30,9 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, · 29 unmodified lines | ||
| 30 | 30 | char *secstr, struct module *mod) |
| 31 | 31 | { |
| 32 | 32 | #ifdef CONFIG_ARC_DW2_UNWIND |
| 33 | − int i; | |
| 34 | − | |
| 35 | 33 | mod->arch.unw_sec_idx = 0; |
| 36 | 34 | 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; | |
| 44 | 36 | #endif |
| 45 | 37 | return 0; |
| 46 | 38 | } |
| @@ -66,8 +58,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, · 19 unmodified lines | ||
| 66 | 58 | Elf32_Addr location; |
| 67 | 59 | Elf32_Addr sec_to_patch; |
| 68 | 60 | int relo_type; |
| 61 | + unsigned int tgtsec; | |
| 69 | 62 | |
| 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; | |
| 71 | 65 | sym_sec = (Elf32_Sym *) sechdrs[symindex].sh_addr; |
| 72 | 66 | n = sechdrs[relsec].sh_size / sizeof(*rel_entry); |
| 73 | 67 | |
| @@ -111,6 +105,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, · 37 unmodified lines | ||
| 111 | 105 | goto relo_err; |
| 112 | 106 | |
| 113 | 107 | } |
| 108 | + | |
| 109 | + if (strcmp(module->arch.secstr+sechdrs[tgtsec].sh_name, ".eh_frame") == 0) | |
| 110 | + module->arch.unw_sec_idx = tgtsec; | |
| 111 | + | |
| 114 | 112 | return 0; |
| 115 | 113 | |
| 116 | 114 | relo_err: |