From e08025cea9237cd642766ab92053bc1181ae1f41 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 4 Apr 2003 00:03:13 -0800 Subject: [PATCH] [SPARC]: Implement STT_REGISTER sparc support more cleanly. --- arch/sparc/kernel/module.c | 21 ++++++++++++++++++++- arch/sparc64/kernel/module.c | 21 ++++++++++++++++++++- kernel/module.c | 5 ----- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index 2bf605fbdfef3..99183d7f24bf9 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c @@ -36,12 +36,31 @@ void module_free(struct module *mod, void *module_region) table entries. */ } -/* We don't need anything special. */ +/* Make generic code ignore STT_REGISTER dummy undefined symbols. */ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, char *secstrings, struct module *mod) { + unsigned int symidx; + Elf32_Sym *sym; + const char *strtab; + int i; + + for (symidx = 0; sechdrs[symidx].sh_type != SHT_SYMTAB; symidx++) { + if (symidx == hdr->e_shnum-1) { + printk("%s: no symtab found.\n", mod->name); + return -ENOEXEC; + } + } + sym = (Elf32_Sym *)sechdrs[symidx].sh_addr; + strtab = (char *)sechdrs[sechdrs[symidx].sh_link].sh_addr; + + for (i = 1; i < sechdrs[symidx].sh_size / sizeof(Elf_Sym); i++) { + if (sym[i].st_shndx == SHN_UNDEF && + ELF32_ST_TYPE(sym[i].st_info) == STT_REGISTER) + sym[i].st_shndx = SHN_ABS; + } return 0; } diff --git a/arch/sparc64/kernel/module.c b/arch/sparc64/kernel/module.c index b70ddbafb8375..9918b76c62805 100644 --- a/arch/sparc64/kernel/module.c +++ b/arch/sparc64/kernel/module.c @@ -143,12 +143,31 @@ void module_free(struct module *mod, void *module_region) table entries. */ } -/* We don't need anything special. */ +/* Make generic code ignore STT_REGISTER dummy undefined symbols. */ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, char *secstrings, struct module *mod) { + unsigned int symidx; + Elf64_Sym *sym; + const char *strtab; + int i; + + for (symidx = 0; sechdrs[symidx].sh_type != SHT_SYMTAB; symidx++) { + if (symidx == hdr->e_shnum-1) { + printk("%s: no symtab found.\n", mod->name); + return -ENOEXEC; + } + } + sym = (Elf64_Sym *)sechdrs[symidx].sh_addr; + strtab = (char *)sechdrs[sechdrs[symidx].sh_link].sh_addr; + + for (i = 1; i < sechdrs[symidx].sh_size / sizeof(Elf_Sym); i++) { + if (sym[i].st_shndx == SHN_UNDEF && + ELF64_ST_TYPE(sym[i].st_info) == STT_REGISTER) + sym[i].st_shndx = SHN_ABS; + } return 0; } diff --git a/kernel/module.c b/kernel/module.c index b867bf84c5f18..dbb503b729ee2 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -974,11 +974,6 @@ static int simplify_symbols(Elf_Shdr *sechdrs, /* Ok if weak. */ if (ELF_ST_BIND(sym[i].st_info) == STB_WEAK) break; -#if defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64) - /* Ok if Sparc register directive. */ - if (ELF_ST_TYPE(sym[i].st_info) == STT_REGISTER) - break; -#endif printk(KERN_WARNING "%s: Unknown symbol %s\n", mod->name, strtab + sym[i].st_name); -- 2.53.0