From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from cmx-mtlrgo002.bell.net (mta-mtl-002.bell.net [209.71.208.12]) by sourceware.org (Postfix) with ESMTP id CF1793858D20 for ; Tue, 8 Feb 2022 14:41:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CF1793858D20 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=bell.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=bell.net X-RG-CM-BuS: 0 X-RG-CM-SC: 0 X-RG-CM: Clean X-Originating-IP: [70.50.7.94] X-RG-Env-Sender: dave.anglin@bell.net X-RG-Rigid: 61FC0C23006F6EF6 X-CM-Envelope: MS4xfIdOvPo6Kgfmi7PHC5MZPQF7UywodUrSjOHNcCDu6rtyhFrKebW5JCHwXs9hQlYFnCGf/l2Pe63PuoxlvhXuUaGybuSoxU0rpO3DhAbjVRMxM9f3NePr uW0fF5nNzhk5TGSagn/Pk+tuWYT7C8UX6zZtbGlfWtoSLL/kvvhQhnLFMyWGlOpoeZZmRT5Wezdqpt55LTBUV/O7yojHLWPct5mMQG0/Et2+8iG1/7U+dZtm qD2HykMFgPJFWbNTNGXKvawtTizrLp54BVWuQfCWOWhfqmtz9Rd2wRrasT7SD8yXAWr6vRpvYUWmGLm/q9cXJw== X-CM-Analysis: v=2.4 cv=WtFIjfTv c=1 sm=1 tr=0 ts=62028136 a=9k1bCY7nR7m1ZFzoCuQ56g==:117 a=9k1bCY7nR7m1ZFzoCuQ56g==:17 a=IkcTkHD0fZMA:10 a=FBHGMhGWAAAA:8 a=-0C-WoyXvBWl-lBoAQMA:9 a=QEXdDO2ut3YA:10 a=9gvnlMMaQFpL9xblJ6ne:22 Received: from [192.168.2.49] (70.50.7.94) by cmx-mtlrgo002.bell.net (5.8.716.03) (authenticated as dave.anglin@bell.net) id 61FC0C23006F6EF6; Tue, 8 Feb 2022 09:41:58 -0500 Message-ID: <839639ae-ebe1-3d68-1fcc-898a44353cea@bell.net> Date: Tue, 8 Feb 2022 09:41:59 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.5.1 Subject: Re: [PATCH v4] hppa: Fix bind-now audit (BZ #28857) Content-Language: en-US To: Adhemerval Zanella , libc-alpha@sourceware.org, John David Anglin References: <20220207170946.2913046-1-adhemerval.zanella@linaro.org> From: John David Anglin In-Reply-To: <20220207170946.2913046-1-adhemerval.zanella@linaro.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-8.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_STOCKGEN, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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-List-Received-Date: Tue, 08 Feb 2022 14:42:02 -0000 Works for me. On 2022-02-07 12:09 p.m., Adhemerval Zanella wrote: > 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 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. > --- > v4: Use uintptr_t on cast, remove semicolon. > v3: Remove _dl_lookup_address usage. > --- > 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-lookupcfg.h | 8 +++++--- > 6 files changed, 15 insertions(+), 8 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-lookupcfg.h b/sysdeps/hppa/dl-lookupcfg.h > index 8da2412fea..27d2cd5e0e 100644 > --- a/sysdeps/hppa/dl-lookupcfg.h > +++ b/sysdeps/hppa/dl-lookupcfg.h > @@ -79,7 +79,9 @@ void attribute_hidden _dl_unmap (struct link_map *map); > /* Extract the code address from a fixup value */ > #define DL_FIXUP_VALUE_CODE_ADDR(value) ((value).ip) > #define DL_FIXUP_VALUE_ADDR(value) ((uintptr_t) &(value)) > -#define DL_FIXUP_ADDR_VALUE(addr) (*(struct fdesc *) (addr)) > +/* Clear the plabel bit to get the actual address of the descriptor. */ > +#define DL_FIXUP_ADDR_VALUE(addr) \ > + (*(DL_FIXUP_VALUE_TYPE *) ((uintptr_t) (addr) & ~2)) > #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) = *(DL_FIXUP_VALUE_TYPE *) ((uintptr_t) (new_value) & ~2) -- John David Anglin dave.anglin@bell.net