From 95586b5663e51548e91fdbde34037886fb1eb07c Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Mon, 3 Dec 2007 22:54:16 +0000 Subject: 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. --- ldso/include/dl-defs.h | 7 +++++++ ldso/include/dl-elf.h | 5 +++++ ldso/include/dl-hash.h | 18 ++++++++++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) (limited to 'ldso/include') diff --git a/ldso/include/dl-defs.h b/ldso/include/dl-defs.h index 19eab074f..21a66a40f 100644 --- a/ldso/include/dl-defs.h +++ b/ldso/include/dl-defs.h @@ -181,4 +181,11 @@ typedef struct { #define __C_SYMBOL_PREFIX__ "_" #endif +/* Define this if you want to modify the VALUE returned by + _dl_find_hash for this reloc TYPE. TPNT is the module in which the + matching SYM was found. */ +#ifndef DL_FIND_HASH_VALUE +# define DL_FIND_HASH_VALUE(TPNT, TYPE, SYM) (DL_RELOC_ADDR ((SYM)->st_value, (TPNT)->loadaddr)) +#endif + #endif /* _LD_DEFS_H */ diff --git a/ldso/include/dl-elf.h b/ldso/include/dl-elf.h index 3e418622d..320a0f920 100644 --- a/ldso/include/dl-elf.h +++ b/ldso/include/dl-elf.h @@ -183,6 +183,11 @@ void __dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info[], #endif #define ELF_RTYPE_CLASS_PLT (0x1) +/* dlsym() calls _dl_find_hash with this value, that enables + DL_FIND_HASH_VALUE to return something different than the symbol + itself, e.g., a function descriptor. */ +#define ELF_RTYPE_CLASS_DLSYM 0x80000000 + /* Convert between the Linux flags for page protections and the ones specified in the ELF standard. */ diff --git a/ldso/include/dl-hash.h b/ldso/include/dl-hash.h index 5239467c1..e5f9f8806 100644 --- a/ldso/include/dl-hash.h +++ b/ldso/include/dl-hash.h @@ -105,8 +105,22 @@ extern struct elf_resolve * _dl_add_elf_hash_table(const char * libname, DL_LOADADDR_TYPE loadaddr, unsigned long * dynamic_info, unsigned long dynamic_addr, unsigned long dynamic_size); -extern char * _dl_find_hash(const char * name, struct dyn_elf * rpnt1, - struct elf_resolve *mytpnt, int type_class); +extern 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 + ); + +static __always_inline char *_dl_find_hash(const char *name, struct dyn_elf *rpnt, + struct elf_resolve *mytpnt, int type_class) +{ +#ifdef __FDPIC__ + return _dl_lookup_hash(name, rpnt, mytpnt, type_class, NULL); +#else + return _dl_lookup_hash(name, rpnt, mytpnt, type_class); +#endif +} extern int _dl_linux_dynamic_link(void); -- cgit v1.2.3