From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7814) id 4D9683858D32; Mon, 23 May 2022 19:06:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4D9683858D32 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Fangrui Song To: glibc-cvs@sourceware.org Subject: [glibc] elf: Rewrite long RESOLVE_MAP macro to an always_inline static function X-Act-Checkin: glibc X-Git-Author: Nicholas Guriev X-Git-Refname: refs/heads/master X-Git-Oldrev: 748df8126ac69e68e0b94e236ea3c2e11b1176cb X-Git-Newrev: a8b11bd1f8dc68795b377138b5d94638ef75a50d Message-Id: <20220523190646.4D9683858D32@sourceware.org> Date: Mon, 23 May 2022 19:06:46 +0000 (GMT) X-BeenThere: glibc-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Glibc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 May 2022 19:06:46 -0000 https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=a8b11bd1f8dc68795b377138b5d94638ef75a50d commit a8b11bd1f8dc68795b377138b5d94638ef75a50d Author: Nicholas Guriev Date: Mon May 23 12:06:44 2022 -0700 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 Diff: --- elf/dl-reloc.c | 56 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c index 771a34bd14..4267c2efb6 100644 --- a/elf/dl-reloc.c +++ b/elf/dl-reloc.c @@ -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"