diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-03-26 05:55:17 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-03-26 05:55:17 +0000 |
commit | 697119d670d6ec1283fff84eccf405a4851e83a6 (patch) | |
tree | d66e57b656a074b0f5297eb2ccd5aa94febf7eff /elf | |
parent | 42374865bc5e53253f96191db3c2778f78fe26f8 (diff) | |
download | glibc-697119d670d6ec1283fff84eccf405a4851e83a6.zip glibc-697119d670d6ec1283fff84eccf405a4851e83a6.tar.gz glibc-697119d670d6ec1283fff84eccf405a4851e83a6.tar.bz2 |
Update.
2003-03-25 H.J. Lu <hjl@gnu.org>
* elf/dl-lookup.c (_dl_lookup_symbol): Avoid looking up protected
symbols twice.
(_dl_lookup_versioned_symbol): Likewise.
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-lookup.c | 68 |
1 files changed, 47 insertions, 21 deletions
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; + } } } |