From patchwork Mon Apr 18 07:37:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fangrui Song X-Patchwork-Id: 53000 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F09D53857341 for ; Mon, 18 Apr 2022 07:37:36 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F09D53857341 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650267457; bh=XEQCxliwobV2qaoRQafVZKxVn0xGqvazyw3UgIYJcCg=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=HGey5G79rmlIR5lJWRoND7b1ZlU0T/vaQ91e0T7Cg4jbqH4axXkLBt0l1EJCPtjmV F15c9J2tzjNAkAxdWObU2mudSjfE2KiYDeHQ/b0qw8nglBejr4MkWrNzbDG1lzDT5T LS6AewCVa/FlxtyA8Qg7XImWpza8b8Vr6OlFJSfE= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by sourceware.org (Postfix) with ESMTPS id 2144B3858C51 for ; Mon, 18 Apr 2022 07:37:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2144B3858C51 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-2f17e110a9bso20573157b3.0 for ; Mon, 18 Apr 2022 00:37:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=XEQCxliwobV2qaoRQafVZKxVn0xGqvazyw3UgIYJcCg=; b=gLW0RlnRXw6NHtWnuAE1Ze8VZHdnmDHIY8QsxQZ6I9JINnrht/hFogo8AXMh7cHO2J dZIgWL9cFQpkaF4cSTaQWgvDbTl2Y7f3XOvDsvcsrWaSdHSl3h7te0unLE1NTJKD5Jy6 w94an24l1/4jqHqwMiZtV8fgnea8UPqBTbSV8GhHsfxm/xy2uZq2ZFlqf3/dVTEAWDV0 GjaHu8vHWXtBmtyKyw7OSlV3XWWEYmvnCeHU4IEUVFQwjqp4UuYZXJVPGX9c2ODglX0v Ei+S+iT1SiOHPfOaiuhbtl5f9iTN1ki5n1r3PoriqNEoaUDFqe3z0gA161ClM7BqHTQ3 U8ow== X-Gm-Message-State: AOAM53220f9MFsJuJCJ+uTaY7RB5mqCudUmoRks78mi21zoe6JX7XjP3 wlrN3BwtQxOAD0qgLEluhwroSMkGqPfncRRykf2AxJqC7VfD8r7MEYuLJpUmt9Xf6Mk2FiEo3iQ Gb7VuZiTuyCuhG7Ts2OBloHxCRC5GtdAuodcmJSaTdhSYXTjtYoOK62t8O4jScjCYeVXi X-Google-Smtp-Source: ABdhPJyuqJESRp9COtJcUtAcyQgtnYsNYt+0JPejGCDXq6kArntG90v0JWH58XMJ8kmXqffh/sxxgokaf9+A X-Received: from maskray1.svl.corp.google.com ([2620:15c:2ce:200:5dd7:766d:215:6e64]) (user=maskray job=sendgmr) by 2002:a05:6902:143:b0:628:7cf1:f2a9 with SMTP id p3-20020a056902014300b006287cf1f2a9mr8474145ybh.51.1650267434478; Mon, 18 Apr 2022 00:37:14 -0700 (PDT) Date: Mon, 18 Apr 2022 00:37:11 -0700 Message-Id: <20220418073711.2471534-1-maskray@google.com> Mime-Version: 1.0 Subject: [PATCH] elf: Move elf_dynamic_do_Rel RTLD_BOOTSTRAP branches outside To: libc-alpha@sourceware.org X-Spam-Status: No, score=-19.4 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Fangrui Song via Libc-alpha From: Fangrui Song Reply-To: Fangrui Song Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" elf_dynamic_do_Rel checks RTLD_BOOTSTRAP in several #ifdef branches. Create an outside RTLD_BOOTSTRAP branch to simplify reasoning about the function at the cost of a few duplicate lines. Since dl_naudit is zero in RTLD_BOOTSTRAP code, the RTLD_BOOTSTRAP branch can avoid _dl_audit_symbind calls to save code size (stripped x86-64 ld.so is 672 bytes smaller). Reviewed-by: Adhemerval Zanella --- elf/do-rel.h | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/elf/do-rel.h b/elf/do-rel.h index d3e022267b..27b9b9f427 100644 --- a/elf/do-rel.h +++ b/elf/do-rel.h @@ -45,15 +45,35 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], __typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative, int lazy, int skip_ifunc) { - const ElfW(Rel) *r = (const void *) reladdr; + const ElfW(Rel) *relative = (const void *) reladdr; + const ElfW(Rel) *r = relative + nrelative; const ElfW(Rel) *end = (const void *) (reladdr + relsize); ElfW(Addr) l_addr = map->l_addr; -# if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP + const ElfW(Sym) *const symtab + = (const void *) D_PTR (map, l_info[DT_SYMTAB]); + +#ifdef RTLD_BOOTSTRAP + for (; relative < r; ++relative) + DO_ELF_MACHINE_REL_RELATIVE (map, l_addr, relative); + + const ElfW (Half) *const version + = (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); + for (; r < end; ++r) + { + ElfW (Half) ndx = version[ELFW (R_SYM) (r->r_info)] & 0x7fff; + const ElfW (Sym) *sym = &symtab[ELFW (R_SYM) (r->r_info)]; + void *const r_addr_arg = (void *) (l_addr + r->r_offset); + const struct r_found_version *rversion = &map->l_versions[ndx]; + + elf_machine_rel (map, scope, r, sym, rversion, r_addr_arg, skip_ifunc); + } +#else /* !RTLD_BOOTSTRAP */ +# if defined ELF_MACHINE_IRELATIVE const ElfW(Rel) *r2 = NULL; const ElfW(Rel) *end2 = NULL; # endif -#if (!defined DO_RELA || !defined ELF_MACHINE_PLT_REL) && !defined RTLD_BOOTSTRAP +#if !defined DO_RELA || !defined ELF_MACHINE_PLT_REL /* We never bind lazily during ld.so bootstrap. Unfortunately gcc is not clever enough to see through all the function calls to realize that. */ @@ -82,12 +102,6 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], else #endif { - const ElfW(Sym) *const symtab = - (const void *) D_PTR (map, l_info[DT_SYMTAB]); - const ElfW(Rel) *relative = r; - r += nrelative; - -#ifndef RTLD_BOOTSTRAP /* This is defined in rtld.c, but nowhere in the static libc.a; make the reference weak so static programs can still link. This declaration cannot be done when compiling rtld.c (i.e. #ifdef @@ -106,16 +120,10 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], memory_loc += l_addr... */ if (l_addr != 0) # endif -#endif for (; relative < r; ++relative) DO_ELF_MACHINE_REL_RELATIVE (map, l_addr, relative); -#ifdef RTLD_BOOTSTRAP - /* The dynamic linker always uses versioning. */ - assert (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL); -#else if (map->l_info[VERSYMIDX (DT_VERSYM)]) -#endif { const ElfW(Half) *const version = (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); @@ -126,7 +134,7 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], const ElfW(Sym) *sym = &symtab[ELFW(R_SYM) (r->r_info)]; void *const r_addr_arg = (void *) (l_addr + r->r_offset); const struct r_found_version *rversion = &map->l_versions[ndx]; -#if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP +#if defined ELF_MACHINE_IRELATIVE if (ELFW(R_TYPE) (r->r_info) == ELF_MACHINE_IRELATIVE) { if (r2 == NULL) @@ -138,7 +146,7 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], elf_machine_rel (map, scope, r, sym, rversion, r_addr_arg, skip_ifunc); -#if defined SHARED && !defined RTLD_BOOTSTRAP +#if defined SHARED if (ELFW(R_TYPE) (r->r_info) == ELF_MACHINE_JMP_SLOT && GLRO(dl_naudit) > 0) { @@ -151,7 +159,7 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], #endif } -#if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP +#if defined ELF_MACHINE_IRELATIVE if (r2 != NULL) for (; r2 <= end2; ++r2) if (ELFW(R_TYPE) (r2->r_info) == ELF_MACHINE_IRELATIVE) @@ -166,7 +174,6 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], } #endif } -#ifndef RTLD_BOOTSTRAP else { for (; r < end; ++r) @@ -184,7 +191,7 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], # endif elf_machine_rel (map, scope, r, sym, NULL, r_addr_arg, skip_ifunc); -# if defined SHARED && !defined RTLD_BOOTSTRAP +# if defined SHARED if (ELFW(R_TYPE) (r->r_info) == ELF_MACHINE_JMP_SLOT && GLRO(dl_naudit) > 0) { @@ -207,8 +214,8 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], skip_ifunc); # endif } -#endif } +#endif /* !RTLD_BOOTSTRAP */ } #undef elf_dynamic_do_Rel