]> git.neil.brown.name Git - history.git/commitdiff
[SPARC]: Implement STT_REGISTER sparc support more cleanly.
authorRusty Russell <rusty@rustcorp.com.au>
Fri, 4 Apr 2003 08:03:13 +0000 (00:03 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 4 Apr 2003 08:03:13 +0000 (00:03 -0800)
arch/sparc/kernel/module.c
arch/sparc64/kernel/module.c
kernel/module.c

index 2bf605fbdfef3d9fae5dc5fa0140eb4a53df2cb6..99183d7f24bf9b9762ddeb5295af05e8c8684298 100644 (file)
@@ -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;
 }
 
index b70ddbafb837504bfa255421ae71012da7acff9c..9918b76c628051897b56e110fc830a38f444ed09 100644 (file)
@@ -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;
 }
 
index b867bf84c5f183a55d2bc7488fff0a430732ba21..dbb503b729ee2b1a025c6cf46fdcdc388f605e3d 100644 (file)
@@ -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);