History

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

Vineet Gupta committed 10 years ago

Commit d65283f1 parent f644e362 files · +9 −10Browse files

Unified · Split

2 files
  1. arch/arc/include/asm/module.h +1 −0
  2. arch/arc/kernel/module.c +8 −10
arch/arc/include/asm/module.h+1−0
@@ -18,6 +18,7 @@ · 17 unmodified lines
18struct mod_arch_specific {18struct mod_arch_specific {
19 void *unw_info;19 void *unw_info;
20 int unw_sec_idx;20 int unw_sec_idx;
21 const char *secstr;
21};22};
22#endif23#endif
23 24
arch/arc/kernel/module.c+8−10
@@ -30,17 +30,9 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, · 29 unmodified lines
30 char *secstr, struct module *mod)30 char *secstr, struct module *mod)
31{31{
32#ifdef CONFIG_ARC_DW2_UNWIND32#ifdef CONFIG_ARC_DW2_UNWIND
33 int i;
34
35 mod->arch.unw_sec_idx = 0;33 mod->arch.unw_sec_idx = 0;
36 mod->arch.unw_info = NULL;34 mod->arch.unw_info = NULL;
37 35 mod->arch.secstr = secstr;
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 }
44#endif36#endif
45 return 0;37 return 0;
46}38}
@@ -66,8 +58,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, · 19 unmodified lines
66 Elf32_Addr location;58 Elf32_Addr location;
67 Elf32_Addr sec_to_patch;59 Elf32_Addr sec_to_patch;
68 int relo_type;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 sym_sec = (Elf32_Sym *) sechdrs[symindex].sh_addr;65 sym_sec = (Elf32_Sym *) sechdrs[symindex].sh_addr;
72 n = sechdrs[relsec].sh_size / sizeof(*rel_entry);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 goto relo_err;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 return 0;112 return 0;
115 113
116relo_err:114relo_err:

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t