From patchwork Fri Feb 4 20:08:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 50812 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 368FC3858419 for ; Fri, 4 Feb 2022 20:09:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 368FC3858419 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1644005360; bh=xtXJIyCrsBAak5vo7io0khHAjIt5DPHad3G5VvG3e4A=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=x2gFYAoaKsa3DIweL7dRJcpfENuck4chyFIzQeS811VaGe+Wt4iDC47lplDIbCFs/ VKeUq5p2xQDHDqTYN5oNpfToq6g52XKyS+XHkIf002WBUOiioyQnX/LCpA71ah2YQ4 RcVmMgl+w4c/cq6Wazqgkps9uBR2tmDUhnibFo4Q= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-ua1-x936.google.com (mail-ua1-x936.google.com [IPv6:2607:f8b0:4864:20::936]) by sourceware.org (Postfix) with ESMTPS id 5A67C3858D28 for ; Fri, 4 Feb 2022 20:08:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5A67C3858D28 Received: by mail-ua1-x936.google.com with SMTP id e17so12693919uad.9 for ; Fri, 04 Feb 2022 12:08:57 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=xtXJIyCrsBAak5vo7io0khHAjIt5DPHad3G5VvG3e4A=; b=1pgXVwbeM6TEA/cOge8L2NQXasCh2UXkaglvPydpVXQUR4Mwl1p/qyinDNCNJd1waP d7XUiEG3gc+Zw2HCWeuKd0MusmeTDL6Kcf4elnKqSImC5J+ucLirrNWUNe8pdX3+XWRL XqBGEPplcfPpN7lX0h9TfIGMlIjNqV+AwhDJ4SBKTAUx9Z8z3uqwkxtDkfrGEs3g8RIb NHJ45eeOwjFjl/gq+ZJoXVIQdOCu/lSa70R6YxBcTBp/6ATsa+DZrIPRvXoM3OlxaLPp NK/46jT85Y1y7Gm9OTRYEPCxr1ZIruK3SoVGKToWavDHaa+jV5t5gdJ+xP125K8GpJ5O 9Iqw== X-Gm-Message-State: AOAM530h7BvpMQ3nLC4gMArB0qcZFWDLar3Qud8+ck2gnBYCzmkfxslC Oh5vvocFgM+xIT9pZCXV5gvphYLg1T98ig== X-Google-Smtp-Source: ABdhPJxAYf01NETgdLkt32qEz+wiGzHYdwnwUEtwoLiyXbjJFQ5NP/CbKdRdodZZwGiNUMuydZ6Q3w== X-Received: by 2002:a9f:24c6:: with SMTP id 64mr237514uar.59.1644005336708; Fri, 04 Feb 2022 12:08:56 -0800 (PST) Received: from birita.. ([2804:431:c7ca:709a:5d1d:7038:55b6:a222]) by smtp.gmail.com with ESMTPSA id y65sm862165vsy.5.2022.02.04.12.08.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Feb 2022 12:08:56 -0800 (PST) To: libc-alpha@sourceware.org, John David Anglin Subject: [PATCH] hppa: Fix bind-now audit (BZ #28857) Date: Fri, 4 Feb 2022 17:08:53 -0300 Message-Id: <20220204200853.2799635-1-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, 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 autolearn=unavailable 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: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" On hppa, a function pointer returned by la_symbind is actually a function descriptor has the plabel bit set (bit 30). This must be cleared to get the actual address of the descriptor. If the descriptor has been bound, the first word of the descriptor is the physical address of theA function, otherwise, the first word of the descriptor points to a trampoline in the PLT. This is handle already by '_dl_lookup_address', so it is used on DL_FIXUP_BINDNOW_RELOC to setup the instruction pointer in the relocation address. This patch also adds a workaround on tests because on hppa (and it seems to be the only ABI I have see it), some shared library adds a dynamic PLT relocation to am empty symbol name: $ readelf -r elf/tst-audit25mod1.so [...] Relocation section '.rela.plt' at offset 0x464 contains 6 entries: Offset Info Type Sym.Value Sym. Name + Addend 00002008 00000081 R_PARISC_IPLT 508 [...] It breaks some assumptions on the test, where a symbol with an empty name ("") is passed on la_symbind. Checked on x86_64-linux-gnu and hppa-linux-gnu. --- elf/Makefile | 2 +- elf/dl-audit.c | 3 ++- elf/tst-auditmod24a.c | 4 +++- elf/tst-auditmod24d.c | 4 +++- elf/tst-auditmod25.c | 2 +- sysdeps/hppa/dl-fptr.c | 1 + sysdeps/hppa/dl-lookupcfg.h | 8 ++++++-- 7 files changed, 17 insertions(+), 7 deletions(-) diff --git a/elf/Makefile b/elf/Makefile index 5bdf0a383d..7372cb191c 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -2210,7 +2210,7 @@ $(objpfx)tst-audit24c.out: $(objpfx)tst-auditmod24c.so $(objpfx)tst-audit24c: $(objpfx)tst-audit24amod1.so \ $(objpfx)tst-audit24amod2.so tst-audit24c-ENV = LD_BIND_NOW=1 LD_AUDIT=$(objpfx)tst-auditmod24c.so -LDFLAGS-tst-audit24b = -Wl,-z,lazy +LDFLAGS-tst-audit24c = -Wl,-z,lazy $(objpfx)tst-audit24d.out: $(objpfx)tst-auditmod24d.so $(objpfx)tst-audit24d: $(objpfx)tst-audit24dmod1.so \ diff --git a/elf/dl-audit.c b/elf/dl-audit.c index 794bfd45cd..efc0492474 100644 --- a/elf/dl-audit.c +++ b/elf/dl-audit.c @@ -257,7 +257,8 @@ _dl_audit_symbind (struct link_map *l, struct reloc_result *reloc_result, reloc_result->flags = flags; } - DL_FIXUP_BINDNOW_RELOC (value, new_value, sym.st_value); + if (flags & LA_SYMB_ALTVALUE) + DL_FIXUP_BINDNOW_RELOC (value, new_value, sym.st_value); } void diff --git a/elf/tst-auditmod24a.c b/elf/tst-auditmod24a.c index d8e88f3984..3075dfae2f 100644 --- a/elf/tst-auditmod24a.c +++ b/elf/tst-auditmod24a.c @@ -110,5 +110,7 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx, return sym->st_value; } - abort (); + if (symname[0] != '\0') + abort (); + return sym->st_value; } diff --git a/elf/tst-auditmod24d.c b/elf/tst-auditmod24d.c index 8c803ecc0a..badc6be451 100644 --- a/elf/tst-auditmod24d.c +++ b/elf/tst-auditmod24d.c @@ -116,5 +116,7 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx, } } - abort (); + if (symname[0] != '\0') + abort (); + return sym->st_value; } diff --git a/elf/tst-auditmod25.c b/elf/tst-auditmod25.c index 526f5c54bc..20640a8daf 100644 --- a/elf/tst-auditmod25.c +++ b/elf/tst-auditmod25.c @@ -72,7 +72,7 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx, unsigned int *flags, const char *symname) #endif { - if (*refcook != -1 && *defcook != -1) + if (*refcook != -1 && *defcook != -1 && symname[0] != '\0') fprintf (stderr, "la_symbind: %s %u\n", symname, *flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT) ? 1 : 0); return sym->st_value; diff --git a/sysdeps/hppa/dl-fptr.c b/sysdeps/hppa/dl-fptr.c index 2584557c4f..4cc2cb21b1 100644 --- a/sysdeps/hppa/dl-fptr.c +++ b/sysdeps/hppa/dl-fptr.c @@ -407,3 +407,4 @@ _dl_lookup_address (const void *address) return (ElfW(Addr)) desc[0]; } +rtld_hidden_def (_dl_lookup_address) diff --git a/sysdeps/hppa/dl-lookupcfg.h b/sysdeps/hppa/dl-lookupcfg.h index 8da2412fea..3929fc84ae 100644 --- a/sysdeps/hppa/dl-lookupcfg.h +++ b/sysdeps/hppa/dl-lookupcfg.h @@ -30,6 +30,7 @@ rtld_hidden_proto (_dl_symbol_address) #define DL_SYMBOL_ADDRESS(map, ref) _dl_symbol_address(map, ref) Elf32_Addr _dl_lookup_address (const void *address); +rtld_hidden_proto (_dl_lookup_address) #define DL_LOOKUP_ADDRESS(addr) _dl_lookup_address ((const void *) addr) @@ -81,5 +82,8 @@ void attribute_hidden _dl_unmap (struct link_map *map); #define DL_FIXUP_VALUE_ADDR(value) ((uintptr_t) &(value)) #define DL_FIXUP_ADDR_VALUE(addr) (*(struct fdesc *) (addr)) #define DL_FIXUP_BINDNOW_ADDR_VALUE(addr) (addr) -#define DL_FIXUP_BINDNOW_RELOC(value, new_value, st_value) \ - (*value) = *(struct fdesc *) (st_value) +#define DL_FIXUP_BINDNOW_RELOC(value, new_value, st_value) \ + ({ \ + value->ip = _dl_lookup_address ((void *) new_value); \ + value->gp = ((struct fdesc *) (new_value))->gp; \ + })