From 697119d670d6ec1283fff84eccf405a4851e83a6 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 26 Mar 2003 05:55:17 +0000 Subject: Update. 2003-03-25 H.J. Lu * elf/dl-lookup.c (_dl_lookup_symbol): Avoid looking up protected symbols twice. (_dl_lookup_versioned_symbol): Likewise. --- elf/dl-lookup.c | 68 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 21 deletions(-) (limited to 'elf') diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 4603761..2b74736 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -273,17 +273,30 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map, { /* It is very tricky. We need to figure out what value to return for the protected symbol. */ - struct sym_val protected_value = { NULL, NULL }; - - for (scope = symbol_scope; *scope; ++scope) - if (_dl_do_lookup (undef_name, hash, *ref, &protected_value, *scope, - 0, flags, NULL, ELF_RTYPE_CLASS_PLT)) - break; - - if (protected_value.s != NULL && protected_value.m != undef_map) + if (type_class == ELF_RTYPE_CLASS_PLT) { - current_value.s = *ref; - current_value.m = undef_map; + if (current_value.s != NULL && current_value.m != undef_map) + { + current_value.s = *ref; + current_value.m = undef_map; + } + } + else + { + struct sym_val protected_value = { NULL, NULL }; + + for (scope = symbol_scope; *scope; ++scope) + if (_dl_do_lookup (undef_name, hash, *ref, + &protected_value, *scope, 0, flags, + NULL, ELF_RTYPE_CLASS_PLT)) + break; + + if (protected_value.s != NULL + && protected_value.m != undef_map) + { + current_value.s = *ref; + current_value.m = undef_map; + } } } @@ -465,18 +478,31 @@ _dl_lookup_versioned_symbol (const char *undef_name, { /* It is very tricky. We need to figure out what value to return for the protected symbol. */ - struct sym_val protected_value = { NULL, NULL }; - - for (scope = symbol_scope; *scope; ++scope) - if (_dl_do_lookup_versioned (undef_name, hash, *ref, &protected_value, - *scope, 0, version, NULL, - ELF_RTYPE_CLASS_PLT)) - break; - - if (protected_value.s != NULL && protected_value.m != undef_map) + if (type_class == ELF_RTYPE_CLASS_PLT) { - current_value.s = *ref; - current_value.m = undef_map; + if (current_value.s != NULL && current_value.m != undef_map) + { + current_value.s = *ref; + current_value.m = undef_map; + } + } + else + { + struct sym_val protected_value = { NULL, NULL }; + + for (scope = symbol_scope; *scope; ++scope) + if (_dl_do_lookup_versioned (undef_name, hash, *ref, + &protected_value, + *scope, 0, version, NULL, + ELF_RTYPE_CLASS_PLT)) + break; + + if (protected_value.s != NULL + && protected_value.m != undef_map) + { + current_value.s = *ref; + current_value.m = undef_map; + } } } -- cgit v1.1