Simplify symtab logic From: Pavel Roskin --- include/grub/dl.h | 5 ----- kern/dl.c | 4 +++- kern/i386/dl.c | 4 +--- kern/powerpc/dl.c | 4 +--- kern/sparc64/dl.c | 4 +--- kern/x86_64/dl.c | 4 +--- 6 files changed, 7 insertions(+), 18 deletions(-) diff --git a/include/grub/dl.h b/include/grub/dl.h index fbd77b2..b507989 100644 --- a/include/grub/dl.h +++ b/include/grub/dl.h @@ -85,12 +85,7 @@ struct grub_dl int ref_count; grub_dl_dep_t dep; grub_dl_segment_t segment; -#ifdef GRUB_MODULES_MACHINE_READONLY Elf_Sym *symtab; -#define get_symtab() mod->symtab -#else -#define get_symtab() ((Elf_Sym *) ((char *) e + s->sh_offset)) -#endif void (*init) (struct grub_dl *mod); void (*fini) (void); }; diff --git a/kern/dl.c b/kern/dl.c index ce1e269..0ee4649 100644 --- a/kern/dl.c +++ b/kern/dl.c @@ -314,8 +314,10 @@ grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e) #ifdef GRUB_MODULES_MACHINE_READONLY mod->symtab = grub_malloc (size); memcpy (mod->symtab, (char *) e + s->sh_offset, size); +#else + mod->symtab = ((Elf_Sym *) ((char *) e + s->sh_offset)); #endif - sym = get_symtab (); + sym = mod->symtab; s = (Elf_Shdr *) ((char *) e + e->e_shoff + e->e_shentsize * s->sh_link); str = (char *) e + s->sh_offset; diff --git a/kern/i386/dl.c b/kern/i386/dl.c index 6d5b95a..a17f175 100644 --- a/kern/i386/dl.c +++ b/kern/i386/dl.c @@ -43,7 +43,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) { Elf32_Ehdr *e = ehdr; Elf32_Shdr *s; - Elf32_Sym *symtab; Elf32_Word entsize; unsigned i; @@ -57,7 +56,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) if (i == e->e_shnum) return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found"); - symtab = get_symtab (); entsize = s->sh_entsize; for (i = 0, s = (Elf32_Shdr *) ((char *) e + e->e_shoff); @@ -89,7 +87,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) "reloc offset is out of the segment"); addr = (Elf32_Word *) ((char *) seg->addr + rel->r_offset); - sym = (Elf32_Sym *) ((char *) symtab + sym = (Elf32_Sym *) ((char *) mod->symtab + entsize * ELF32_R_SYM (rel->r_info)); switch (ELF32_R_TYPE (rel->r_info)) diff --git a/kern/powerpc/dl.c b/kern/powerpc/dl.c index a85ceef..9b1cb14 100644 --- a/kern/powerpc/dl.c +++ b/kern/powerpc/dl.c @@ -44,7 +44,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) { Elf32_Ehdr *e = ehdr; Elf32_Shdr *s; - Elf32_Sym *symtab; Elf32_Word entsize; unsigned i; @@ -58,7 +57,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) if (i == e->e_shnum) return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found"); - symtab = get_symtab (); entsize = s->sh_entsize; for (i = 0, s = (Elf32_Shdr *) ((char *) e + e->e_shoff); @@ -91,7 +89,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) "reloc offset is out of the segment"); addr = (Elf32_Word *) ((char *) seg->addr + rel->r_offset); - sym = (Elf32_Sym *) ((char *) symtab + sym = (Elf32_Sym *) ((char *) mod->symtab + entsize * ELF32_R_SYM (rel->r_info)); /* On the PPC the value does not have an explicit diff --git a/kern/sparc64/dl.c b/kern/sparc64/dl.c index e427468..5334896 100644 --- a/kern/sparc64/dl.c +++ b/kern/sparc64/dl.c @@ -44,7 +44,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) { Elf64_Ehdr *e = ehdr; Elf64_Shdr *s; - Elf64_Sym *symtab; Elf64_Word entsize; unsigned i; @@ -58,7 +57,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) if (i == e->e_shnum) return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found"); - symtab = get_symtab (); entsize = s->sh_entsize; for (i = 0, s = (Elf64_Shdr *) ((char *) e + e->e_shoff); @@ -91,7 +89,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) "reloc offset is out of the segment"); addr = (Elf64_Word *) ((char *) seg->addr + rel->r_offset); - sym = (Elf64_Sym *) ((char *) symtab + sym = (Elf64_Sym *) ((char *) mod->symtab + entsize * ELF64_R_SYM (rel->r_info)); value = sym->st_value + rel->r_addend; diff --git a/kern/x86_64/dl.c b/kern/x86_64/dl.c index 74ae188..9e5de6e 100644 --- a/kern/x86_64/dl.c +++ b/kern/x86_64/dl.c @@ -43,7 +43,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) { Elf64_Ehdr *e = ehdr; Elf64_Shdr *s; - Elf64_Sym *symtab; Elf64_Word entsize; unsigned i; @@ -57,7 +56,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) if (i == e->e_shnum) return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found"); - symtab = get_symtab (); entsize = s->sh_entsize; for (i = 0, s = (Elf64_Shdr *) ((char *) e + e->e_shoff); @@ -91,7 +89,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) addr32 = (Elf64_Word *) ((char *) seg->addr + rel->r_offset); addr64 = (Elf64_Xword *) addr32; - sym = (Elf64_Sym *) ((char *) symtab + sym = (Elf64_Sym *) ((char *) mod->symtab + entsize * ELF64_R_SYM (rel->r_info)); switch (ELF64_R_TYPE (rel->r_info))