diff options
author | Bernd Schmidt <bernds_cb1@t-online.de> | 2007-12-03 22:54:16 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds_cb1@t-online.de> | 2007-12-03 22:54:16 +0000 |
commit | 95586b5663e51548e91fdbde34037886fb1eb07c (patch) | |
tree | d29cf66e07de417b715e84cbd04e4b38f0f96c40 /ldso/ldso | |
parent | 3d2a55e7a31cbb50ca1677d09791ca147368b62a (diff) |
Blackfin FD-PIC patch 3/6.
Change _dl_find_hash to _dl_lookup_hash, as on the NPTL branch.
_dl_find_hash is now a wrapper function around it; unlike on the NPTL branch,
it retains the old interface so that not all callers need to be changed.
_dl_lookup_hash can optionally give its caller a pointer to the module where
the symbol was found.
Introduce ELF_RTYPE_CLASS_DLSYM for lookups from libdl.
Spelling fixes in the Blackfin port, since Alex Oliva's original version of
these patches used _dl_find_hash_mod as the name of the function rather than
_dl_lookup_hash.
Diffstat (limited to 'ldso/ldso')
-rw-r--r-- | ldso/ldso/bfin/elfinterp.c | 8 | ||||
-rw-r--r-- | ldso/ldso/dl-hash.c | 35 |
2 files changed, 32 insertions, 11 deletions
diff --git a/ldso/ldso/bfin/elfinterp.c b/ldso/ldso/bfin/elfinterp.c index 02d250d97..d003e2e71 100644 --- a/ldso/ldso/bfin/elfinterp.c +++ b/ldso/ldso/bfin/elfinterp.c @@ -72,11 +72,9 @@ _dl_linux_resolver (struct elf_resolve *tpnt, int reloc_entry) got_entry = (struct funcdesc_value *) DL_RELOC_ADDR(tpnt->loadaddr, this_reloc->r_offset); /* Get the address to be used to fill in the GOT entry. */ - new_addr = _dl_find_hash_mod(symname, tpnt->symbol_scope, NULL, 0, - &new_tpnt); + new_addr = _dl_lookup_hash(symname, tpnt->symbol_scope, NULL, 0, &new_tpnt); if (!new_addr) { - new_addr = _dl_find_hash_mod(symname, NULL, NULL, 0, - &new_tpnt); + new_addr = _dl_lookup_hash(symname, NULL, NULL, 0, &new_tpnt); if (!new_addr) { _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname); @@ -188,7 +186,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, } else { symbol_addr = (unsigned long) - _dl_find_hash_mod(symname, scope, NULL, 0, &symbol_tpnt); + _dl_lookup_hash(symname, scope, NULL, 0, &symbol_tpnt); /* * We want to allow undefined references to weak symbols - this might diff --git a/ldso/ldso/dl-hash.c b/ldso/ldso/dl-hash.c index c85035ba8..daa407597 100644 --- a/ldso/ldso/dl-hash.c +++ b/ldso/ldso/dl-hash.c @@ -257,7 +257,12 @@ _dl_lookup_sysv_hash(struct elf_resolve *tpnt, ElfW(Sym) *symtab, unsigned long * This function resolves externals, and this is either called when we process * relocations or when we call an entry in the PLT table for the first time. */ -char *_dl_find_hash(const char *name, struct dyn_elf *rpnt, struct elf_resolve *mytpnt, int type_class) +char *_dl_lookup_hash(const char *name, struct dyn_elf *rpnt, + struct elf_resolve *mytpnt, int type_class +#ifdef __FDPIC__ + , struct elf_resolve **tpntp +#endif + ) { struct elf_resolve *tpnt = NULL; ElfW(Sym) *symtab; @@ -265,7 +270,8 @@ char *_dl_find_hash(const char *name, struct dyn_elf *rpnt, struct elf_resolve * unsigned long elf_hash_number = 0xffffffff; const ElfW(Sym) *sym = NULL; - char *weak_result = NULL; + const ElfW(Sym) *weak_sym = 0; + struct elf_resolve *weak_tpnt = 0; #ifdef __LDSO_GNU_HASH_SUPPORT__ unsigned long gnu_hash_number = _dl_gnu_hash((const unsigned char *)name); @@ -326,15 +332,32 @@ char *_dl_find_hash(const char *name, struct dyn_elf *rpnt, struct elf_resolve * #if 0 /* Perhaps we should support old style weak symbol handling * per what glibc does when you export LD_DYNAMIC_WEAK */ - if (!weak_result) - weak_result = (char *) DL_RELOC_ADDR(tpnt->loadaddr, sym->st_value); + if (!weak_sym) { + weak_tpnt = tpnt; + weak_sym = sym; + } break; #endif case STB_GLOBAL: - return (char*) DL_RELOC_ADDR(tpnt->loadaddr, sym->st_value); +#ifdef __FDPIC__ + if (tpntp) + *tpntp = tpnt; +#endif + return DL_FIND_HASH_VALUE (tpnt, type_class, sym); default: /* Local symbols not handled here */ break; } } - return weak_result; + if (weak_sym) { +#ifdef __FDPIC__ + if (tpntp) + *tpntp = weak_tpnt; +#endif + return DL_FIND_HASH_VALUE (weak_tpnt, type_class, weak_sym); + } +#ifdef __FDPIC__ + if (tpntp) + *tpntp = NULL; +#endif + return NULL; } |