mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
elf: Rewrite long RESOLVE_MAP macro to an always_inline static function
An __always_inline static function is better to find where exactly a crash happens, so one can step into the function with GDB. Reviewed-by: Fangrui Song <maskray@google.com>
This commit is contained in:
parent
748df8126a
commit
a8b11bd1f8
@ -162,29 +162,41 @@ _dl_nothread_init_static_tls (struct link_map *map)
|
||||
}
|
||||
#endif /* !PTHREAD_IN_LIBC */
|
||||
|
||||
static __always_inline lookup_t
|
||||
resolve_map (lookup_t l, struct r_scope_elem *scope[], const ElfW(Sym) **ref,
|
||||
const struct r_found_version *version, unsigned long int r_type)
|
||||
{
|
||||
if (ELFW(ST_BIND) ((*ref)->st_info) == STB_LOCAL
|
||||
|| __glibc_unlikely (dl_symbol_visibility_binds_local_p (*ref)))
|
||||
return l;
|
||||
|
||||
if (__glibc_unlikely (*ref == l->l_lookup_cache.sym)
|
||||
&& elf_machine_type_class (r_type) == l->l_lookup_cache.type_class)
|
||||
{
|
||||
bump_num_cache_relocations ();
|
||||
*ref = l->l_lookup_cache.ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
const int tc = elf_machine_type_class (r_type);
|
||||
l->l_lookup_cache.type_class = tc;
|
||||
l->l_lookup_cache.sym = *ref;
|
||||
const char *undef_name
|
||||
= (const char *) D_PTR (l, l_info[DT_STRTAB]) + (*ref)->st_name;
|
||||
const struct r_found_version *v = NULL;
|
||||
if (version != NULL && version->hash != 0)
|
||||
v = version;
|
||||
lookup_t lr = _dl_lookup_symbol_x (
|
||||
undef_name, l, ref, scope, v, tc,
|
||||
DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_FOR_RELOCATE, NULL);
|
||||
l->l_lookup_cache.ret = *ref;
|
||||
l->l_lookup_cache.value = lr;
|
||||
}
|
||||
return l->l_lookup_cache.value;
|
||||
}
|
||||
|
||||
/* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code. */
|
||||
#define RESOLVE_MAP(l, scope, ref, version, r_type) \
|
||||
((ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL \
|
||||
&& __glibc_likely (!dl_symbol_visibility_binds_local_p (*ref))) \
|
||||
? ((__glibc_unlikely ((*ref) == l->l_lookup_cache.sym) \
|
||||
&& elf_machine_type_class (r_type) == l->l_lookup_cache.type_class) \
|
||||
? (bump_num_cache_relocations (), \
|
||||
(*ref) = l->l_lookup_cache.ret, \
|
||||
l->l_lookup_cache.value) \
|
||||
: ({ lookup_t _lr; \
|
||||
int _tc = elf_machine_type_class (r_type); \
|
||||
l->l_lookup_cache.type_class = _tc; \
|
||||
l->l_lookup_cache.sym = (*ref); \
|
||||
const struct r_found_version *v = NULL; \
|
||||
if ((version) != NULL && (version)->hash != 0) \
|
||||
v = (version); \
|
||||
_lr = _dl_lookup_symbol_x ((const char *) D_PTR (l, l_info[DT_STRTAB]) + (*ref)->st_name, \
|
||||
l, (ref), scope, v, _tc, \
|
||||
DL_LOOKUP_ADD_DEPENDENCY \
|
||||
| DL_LOOKUP_FOR_RELOCATE, NULL); \
|
||||
l->l_lookup_cache.ret = (*ref); \
|
||||
l->l_lookup_cache.value = _lr; })) \
|
||||
: l)
|
||||
#define RESOLVE_MAP resolve_map
|
||||
|
||||
#include "dynamic-link.h"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user