From patchwork Mon Jun 6 04:37:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fangrui Song X-Patchwork-Id: 54819 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 7974E3853577 for ; Mon, 6 Jun 2022 04:37:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7974E3853577 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1654490260; bh=H0Gph2d3WqTiJZl+VOBxZ1C1gDdu3inEbqFVhizG8lM=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Kka7ZRGm0MKplxTHUA3eHIrYmHy6Swl0NFMyi37+NhB9ouWvOSOJjUAeFhzuQzhk5 Dak1pKFV4pHTIfLnXkO8QkiBZHhyeDVRgSSofhbtlzTnjDQEF8bBa81nFPNQfbiHUU kEqmu6dPYMhwABakcXQiiGzE2O0lGRgp2anmwUSM= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by sourceware.org (Postfix) with ESMTPS id 2897438582BD for ; Mon, 6 Jun 2022 04:37:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2897438582BD Received: by mail-yb1-xb49.google.com with SMTP id n201-20020a2540d2000000b0065cbae85d67so11469189yba.11 for ; Sun, 05 Jun 2022 21:37:19 -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=H0Gph2d3WqTiJZl+VOBxZ1C1gDdu3inEbqFVhizG8lM=; b=xue7IFnjoPOM0K2tu29FfSaGd6LZQRvxy73le4toRTWJ2fSQyq6YN2gJsBJAHOm6RQ ZpFxDXPDINw8y8Jpzvedlz+JdLBhSRh1v9QGEtzkjw9SvzQXAzX21DY8fNHZ0BsQNTrs kXDp/91wkcUG6gzbieS/XRCLboQbC4mGMmCaioz1j7Olfi4hFaFTTUyiMV5lI/SkQIH/ bsswv+p/XYr3KAcMm08eXgduQHAobmsfzv85M2uf080/5DKBJGapTBYXkSPgihvXolzo Dfk6z6JhMTDVlhZ8OuLhYv4nXG39icBLtowDvIenrJPQ6jqb6Hl0NVoycmaTdA/RqNFI HPNA== X-Gm-Message-State: AOAM531DcFG6oJyyciGuynwOKE0AIK5ZKKwyjk2Eje473IgiOSZpW4sa vfTt3hI4L67aIh+0VqN0sohJOnBI6V2N3k7AJ6rGZ9cfGuytseyWpOe/6tfjcDxh6+o5Qc0cgfZ +zUXhueB54QGjUpC+9cYDXA6zKixSEmlmOOxHiYZxQmOBxqHmRoEBPug5yXZLu2EvmJOB X-Google-Smtp-Source: ABdhPJxfAp96fmfmAyk5k36V/3xJ9l0BiMDZjgKJhSHKcc2AyNDEKPOSs8WtU9Daj+WFxQS8hHgY5Zqez7wD X-Received: from maskray1.svl.corp.google.com ([2620:15c:2ce:200:88f0:b4af:a3af:a0a3]) (user=maskray job=sendgmr) by 2002:a25:5208:0:b0:663:98af:882c with SMTP id g8-20020a255208000000b0066398af882cmr3237536ybb.650.1654490238455; Sun, 05 Jun 2022 21:37:18 -0700 (PDT) Date: Sun, 5 Jun 2022 21:37:09 -0700 Message-Id: <20220606043709.3065173-1-maskray@google.com> Mime-Version: 1.0 Subject: [PATCH] aarch64: Handle fewer relocations for RTLD_BOOTSTRAP To: libc-alpha@sourceware.org X-Spam-Status: No, score=-19.2 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_STOCKGEN, 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.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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" The RTLD_BOOTSTRAP branch is used to relocate ld.so itself. It only needs to handle RELATIVE, GLOB_DAT, and JUMP_SLOT. Tested on aarch64-linux-gnu. --- sysdeps/aarch64/dl-machine.h | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h index 292abe5152..ae8b14425a 100644 --- a/sysdeps/aarch64/dl-machine.h +++ b/sysdeps/aarch64/dl-machine.h @@ -178,7 +178,9 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], return; else { +# ifndef RTLD_BOOTSTRAP const ElfW(Sym) *const refsym = sym; +# endif struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type); ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true); @@ -191,6 +193,18 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], switch (r_type) { + case AARCH64_R(GLOB_DAT): + case AARCH64_R(JUMP_SLOT): + *reloc_addr = value + reloc->r_addend; + break; + +# ifndef RTLD_BOOTSTRAP + case AARCH64_R(ABS32): +# ifdef __LP64__ + case AARCH64_R(ABS64): +# endif + *reloc_addr = value + reloc->r_addend; + break; case AARCH64_R(COPY): if (sym == NULL) break; @@ -210,30 +224,17 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], ? sym->st_size : refsym->st_size); break; - case AARCH64_R(RELATIVE): - case AARCH64_R(GLOB_DAT): - case AARCH64_R(JUMP_SLOT): - case AARCH64_R(ABS32): -#ifdef __LP64__ - case AARCH64_R(ABS64): -#endif - *reloc_addr = value + reloc->r_addend; - break; - case AARCH64_R(TLSDESC): { struct tlsdesc volatile *td = (struct tlsdesc volatile *)reloc_addr; -#ifndef RTLD_BOOTSTRAP if (! sym) { td->arg = (void*)reloc->r_addend; td->entry = _dl_tlsdesc_undefweak; } else -#endif { -#ifndef RTLD_BOOTSTRAP # ifndef SHARED CHECK_STATIC_TLS (map, sym_map); # else @@ -245,7 +246,6 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], } else # endif -#endif { td->arg = (void*)(sym->st_value + sym_map->l_tls_offset + reloc->r_addend); @@ -256,14 +256,10 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], } case AARCH64_R(TLS_DTPMOD): -#ifdef RTLD_BOOTSTRAP - *reloc_addr = 1; -#else if (sym_map != NULL) { *reloc_addr = sym_map->l_tls_modid; } -#endif break; case AARCH64_R(TLS_DTPREL): @@ -286,6 +282,7 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], value = elf_ifunc_invoke (value); *reloc_addr = value; break; +# endif /* !RTLD_BOOTSTRAP */ default: _dl_reloc_bad_type (map, r_type, 0);