From 06535ae9487708dad9048552c9c92828d998a897 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 23 Jul 1999 22:58:50 +0000 Subject: Update. * posix/unistd.h: Move declaration of __libc_enable_secure to... * include/unistd.h: ...here. * elf/dl-open.c (dl_open_worker): If DST is used in SUID program punt. * elf/dl-deps.c (expand_dst): Likewise. * elf/dynamic-link.h: Set DT_SYMBOLIC, DT_TEXTREL, and DT_BIND_NOW based on DT_FLAGS value. * elf/do-lookup.h: Remove reference_name parameter, add undef_map. Add test for symbols marked STV_HIDDEN. * elf/dl-lookup.c (_dl_lookup_symbol): Remove reference_name parameter, add undef_map. Compute reference_name locally. Update call to do_lookup. (_dl_lookup_symbol_skip): Likewise. (_dl_lookup_versioned_symbol): Likewise. (_dl_lookup_versioned_symbol_skip): Likewise. * elf/dl-libc.c: Update call to _dl_lookup_*symbol. * elf/dl-runtime.c: Likewise. * elf/dl-sym.c: Likewise. * elf/dl-symbol.c: Likewise. * elf/ldsodefs.h: Adjust prototypes. * elf/dl-reloc.c (RESOLV): Add test for STV_PROTECTED flag set and handle appropriately. Add comment about DT_TEXTREL. * elf/dl-runtime.c: Likewise. --- elf/dl-lookup.c | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) (limited to 'elf/dl-lookup.c') diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 16173c9068..4120cb1e64 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -75,11 +75,11 @@ unsigned long int _dl_num_relocations; ElfW(Addr) internal_function -_dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref, - struct r_scope_elem *symbol_scope[], - const char *reference_name, +_dl_lookup_symbol (const char *undef_name, struct link_map *undef_map, + const ElfW(Sym) **ref, struct r_scope_elem *symbol_scope[], int reloc_type) { + const char *reference_name = undef_map ? undef_map->l_name : NULL; const unsigned long int hash = _dl_elf_hash (undef_name); struct sym_val current_value = { NULL, NULL }; struct r_scope_elem **scope; @@ -88,8 +88,8 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref, /* Search the relevant loaded objects for a definition. */ for (scope = symbol_scope; *scope; ++scope) - if (do_lookup (undef_name, hash, *ref, ¤t_value, - *scope, 0, reference_name, NULL, reloc_type)) + if (do_lookup (undef_name, undef_map, hash, *ref, ¤t_value, + *scope, 0, NULL, reloc_type)) break; if (current_value.s == NULL) @@ -125,11 +125,12 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref, SKIP_MAP is only skipped. */ ElfW(Addr) internal_function -_dl_lookup_symbol_skip (const char *undef_name, const ElfW(Sym) **ref, +_dl_lookup_symbol_skip (const char *undef_name, + struct link_map *undef_map, const ElfW(Sym) **ref, struct r_scope_elem *symbol_scope[], - const char *reference_name, struct link_map *skip_map) { + const char *reference_name = undef_map ? undef_map->l_name : NULL; const unsigned long int hash = _dl_elf_hash (undef_name); struct sym_val current_value = { NULL, NULL }; struct r_scope_elem **scope; @@ -143,11 +144,11 @@ _dl_lookup_symbol_skip (const char *undef_name, const ElfW(Sym) **ref, assert (i < (*scope)->r_nduplist); if (i >= (*scope)->r_nlist - || ! do_lookup (undef_name, hash, *ref, ¤t_value, - *scope, i, reference_name, skip_map, 0)) + || ! do_lookup (undef_name, undef_map, hash, *ref, ¤t_value, + *scope, i, skip_map, 0)) while (*++scope) - if (do_lookup (undef_name, hash, *ref, ¤t_value, - *scope, 0, reference_name, skip_map, 0)) + if (do_lookup (undef_name, undef_map, hash, *ref, ¤t_value, + *scope, 0, skip_map, 0)) break; if (current_value.s == NULL) @@ -177,12 +178,13 @@ _dl_lookup_symbol_skip (const char *undef_name, const ElfW(Sym) **ref, XXX We'll see whether we need this separate function. */ ElfW(Addr) internal_function -_dl_lookup_versioned_symbol (const char *undef_name, const ElfW(Sym) **ref, +_dl_lookup_versioned_symbol (const char *undef_name, + struct link_map *undef_map, const ElfW(Sym) **ref, struct r_scope_elem *symbol_scope[], - const char *reference_name, const struct r_found_version *version, int reloc_type) { + const char *reference_name = undef_map ? undef_map->l_name : NULL; const unsigned long int hash = _dl_elf_hash (undef_name); struct sym_val current_value = { NULL, NULL }; struct r_scope_elem **scope; @@ -192,8 +194,8 @@ _dl_lookup_versioned_symbol (const char *undef_name, const ElfW(Sym) **ref, /* Search the relevant loaded objects for a definition. */ for (scope = symbol_scope; *scope; ++scope) { - int res = do_lookup_versioned (undef_name, hash, *ref, ¤t_value, - *scope, 0, reference_name, version, NULL, + int res = do_lookup_versioned (undef_name, undef_map, hash, *ref, + ¤t_value, *scope, 0, version, NULL, reloc_type); if (res > 0) break; @@ -250,12 +252,13 @@ _dl_lookup_versioned_symbol (const char *undef_name, const ElfW(Sym) **ref, ElfW(Addr) internal_function _dl_lookup_versioned_symbol_skip (const char *undef_name, + struct link_map *undef_map, const ElfW(Sym) **ref, struct r_scope_elem *symbol_scope[], - const char *reference_name, const struct r_found_version *version, struct link_map *skip_map) { + const char *reference_name = undef_map ? undef_map->l_name : NULL; const unsigned long int hash = _dl_elf_hash (undef_name); struct sym_val current_value = { NULL, NULL }; struct r_scope_elem **scope; @@ -269,11 +272,13 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name, assert (i < (*scope)->r_nduplist); if (i >= (*scope)->r_nlist - || ! do_lookup_versioned (undef_name, hash, *ref, ¤t_value, *scope, - i, reference_name, version, skip_map, 0)) + || ! do_lookup_versioned (undef_name, undef_map, hash, *ref, + ¤t_value, *scope, i, version, skip_map, + 0)) while (*++scope) - if (do_lookup_versioned (undef_name, hash, *ref, ¤t_value, *scope, - 0, reference_name, version, skip_map, 0)) + if (do_lookup_versioned (undef_name, undef_map, hash, *ref, + ¤t_value, *scope, 0, version, skip_map, + 0)) break; if (current_value.s == NULL) -- cgit v1.2.3