summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/ia64/ia64/elf_machdep.c15
-rw-r--r--sys/kern/link_elf.c12
-rw-r--r--sys/kern/link_elf_obj.c12
-rw-r--r--sys/sys/linker.h1
4 files changed, 36 insertions, 4 deletions
diff --git a/sys/ia64/ia64/elf_machdep.c b/sys/ia64/ia64/elf_machdep.c
index 4977e6ef98f1..5b2bc2eec3a1 100644
--- a/sys/ia64/ia64/elf_machdep.c
+++ b/sys/ia64/ia64/elf_machdep.c
@@ -95,18 +95,25 @@ extern Elf_Addr fptr_storage[];
static Elf_Addr
lookup_fdesc(linker_file_t lf, Elf_Word symidx)
{
+ linker_file_t top;
Elf_Addr addr;
+ const char *symname;
int i;
static int eot = 0;
addr = elf_lookup(lf, symidx, 0);
if (addr == 0) {
- for (i = 0; i < lf->ndeps; i++) {
- addr = lookup_fdesc(lf->deps[i], symidx);
+ top = lf;
+ symname = elf_get_symname(top, symidx);
+ for (i = 0; i < top->ndeps; i++) {
+ lf = top->deps[i];
+ addr = (Elf_Addr)linker_file_lookup_symbol(lf,
+ symname, 0);
if (addr != 0)
- return (addr);
+ break;
}
- return (0);
+ if (addr == 0)
+ return (0);
}
if (eot)
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 83fbe17af215..a2ba84e339e7 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -1198,6 +1198,18 @@ elf_get_sym(linker_file_t lf, Elf_Word symidx)
return (ef->symtab + symidx);
}
+const char *
+elf_get_symname(linker_file_t lf, Elf_Word symidx)
+{
+ elf_file_t ef = (elf_file_t)lf;
+ const Elf_Sym *sym;
+
+ if (symidx >= ef->nchains)
+ return (NULL);
+ sym = ef->symtab + symidx;
+ return (ef->strtab + sym->st_name);
+}
+
/*
* Symbol lookup function that can be used when the symbol index is known (ie
* in relocations). It uses the symbol index instead of doing a fully fledged
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
index 83fbe17af215..a2ba84e339e7 100644
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -1198,6 +1198,18 @@ elf_get_sym(linker_file_t lf, Elf_Word symidx)
return (ef->symtab + symidx);
}
+const char *
+elf_get_symname(linker_file_t lf, Elf_Word symidx)
+{
+ elf_file_t ef = (elf_file_t)lf;
+ const Elf_Sym *sym;
+
+ if (symidx >= ef->nchains)
+ return (NULL);
+ sym = ef->symtab + symidx;
+ return (ef->strtab + sym->st_name);
+}
+
/*
* Symbol lookup function that can be used when the symbol index is known (ie
* in relocations). It uses the symbol index instead of doing a fully fledged
diff --git a/sys/sys/linker.h b/sys/sys/linker.h
index bd45a698438e..d15a3872e53a 100644
--- a/sys/sys/linker.h
+++ b/sys/sys/linker.h
@@ -231,6 +231,7 @@ extern int kld_debug;
int elf_reloc(linker_file_t _lf, const void *_rel, int _type);
Elf_Addr elf_lookup(linker_file_t, Elf_Word, int);
const Elf_Sym *elf_get_sym(linker_file_t _lf, Elf_Word _symidx);
+const char *elf_get_symname(linker_file_t _lf, Elf_Word _symidx);
/* values for type */
#define ELF_RELOC_REL 1