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:
Nicholas Guriev 2022-05-23 12:06:44 -07:00 committed by Fangrui Song
parent 748df8126a
commit a8b11bd1f8

View File

@ -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"