From patchwork Fri Feb 11 17:29:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John David Anglin X-Patchwork-Id: 51052 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 6A6DE385803B for ; Fri, 11 Feb 2022 17:30:07 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from cmx-torrgo001.bell.net (mta-tor-001.bell.net [209.71.212.28]) by sourceware.org (Postfix) with ESMTP id C12A23858D1E; Fri, 11 Feb 2022 17:29:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C12A23858D1E 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: 6202A014004CA29A X-CM-Envelope: MS4xfCwYXJlz9p4+LKkHRw7MDZgPgc41U6iCO635u8Z3n42ivkMxzVlM9CowSlVNhrYwUTwTX3wbaGpl99eGRqkV/Z5LFPwC+kZuAMKNwW+7T+9f61xG9LT3 Rro4xQZAZovTiUVmVFhRao5pDtzqxBDLaFMRL3WnRICnute5gmbpOrGED3Tk1LoRPRCZOPGodFZHKnYS+5m7BzrWj5+SgXhSlfC/UkRx1Dm1xOPrsc5BYdRZ wmEPNCIs6QYK19KCanUWlqcZZRgL/OVeQYAMfc64E/ZrrgjqmCVvl1VPuTXE6zrS6gS5fA6wkEqRqq7qNk7Xj3htZd8+9bb3+JXvnQSyRjnP8QnIcqYudimY /mn5Qnl5a5LyL2Ynm1/celv7DT2BwAvoumOsZy86PMiKGg3oyxunGimNWdukjE1rSyrI2GLPeNXTlmCOtJ3Ot5jaKME0Ca3jztSBvGfqgGRF9MwNDuBY3Z0i YJ79gqlmNzyOxJi3m8/j9RzKs39M4Rf092ROT2yoPX5/kIOoeEc1SKdd48XmCxDl5AH7cnbR3pYeSs1JunbymmX4FBf1MTwfuSUhO/FLhsHIvPO2+wpFKTgA RJs= X-CM-Analysis: v=2.4 cv=f44ruM+M c=1 sm=1 tr=0 ts=62069d10 a=9k1bCY7nR7m1ZFzoCuQ56g==:117 a=9k1bCY7nR7m1ZFzoCuQ56g==:17 a=oGFeUVbbRNcA:10 a=YwwAtqrtxheDdSbYzJsA:9 a=CjuIK1q_8ugA:10 a=rRm_j0C8sdc1EMZIwFEA:9 a=FfaGCDsud1wA:10 Received: from mx3210.localdomain (70.50.7.94) by cmx-torrgo001.bell.net (5.8.716.03) (authenticated as dave.anglin@bell.net) id 6202A014004CA29A; Fri, 11 Feb 2022 12:29:52 -0500 Received: by mx3210.localdomain (Postfix, from userid 1000) id 04E7A220115; Fri, 11 Feb 2022 17:29:51 +0000 (UTC) Date: Fri, 11 Feb 2022 17:29:51 +0000 From: John David Anglin To: libc-alpha@sourceware.org Subject: [PATCH] rtld: Add new hook to initialize dp register on hppa Message-ID: MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-9.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, 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: , Cc: carlos Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" The test elf/tst-audit2 fails on hppa with a segmentation fault in the long branch stub used to call malloc from calloc. This occur because the test is not a PIC executable and calloc is called from the dynamic linker before the dp register is initialized in _dl_start_user. The fix is to add a new hook, ELF_MACHINE_AFTER_RTLD_RELOC, in dl_main to allow initialization of the dp register just after relocation is completed. Okay? Dave diff --git a/elf/rtld.c b/elf/rtld.c index 19e328f89e..fcea41cb86 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -2333,6 +2333,10 @@ dl_main (const ElfW(Phdr) *phdr, /* Make sure no new search directories have been added. */ assert (GLRO(dl_init_all_dirs) == GL(dl_all_dirs)); +#ifdef ELF_MACHINE_AFTER_RTLD_RELOC + ELF_MACHINE_AFTER_RTLD_RELOC (main_map); +#endif + if (rtld_multiple_ref) { /* There was an explicit ref to the dynamic linker as a shared lib. diff --git a/sysdeps/hppa/dl-machine.h b/sysdeps/hppa/dl-machine.h index da4d57d2e4..74a81dc1f7 100644 --- a/sysdeps/hppa/dl-machine.h +++ b/sysdeps/hppa/dl-machine.h @@ -70,6 +70,18 @@ __hppa_init_bootstrap_fdesc_table (struct link_map *map) map->l_mach.fptr_table = boot_table; } +/* Set up dp for any non-PIC lib functions that may be called. */ +static inline void +set_dp (struct link_map *map) +{ + register Elf32_Addr dp asm ("%r27"); + dp = D_PTR (map, l_info[DT_PLTGOT]); + asm volatile ("" : : "r" (dp)); +} + +#define ELF_MACHINE_AFTER_RTLD_RELOC(map) \ + set_dp (map); + #define ELF_MACHINE_BEFORE_RTLD_RELOC(map, dynamic_info) \ __hppa_init_bootstrap_fdesc_table (map); \ _dl_fptr_init(); @@ -338,16 +350,6 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[], its return value is the user program's entry point. */ #define RTLD_START \ -/* Set up dp for any non-PIC lib constructors that may be called. */ \ -static struct link_map * __attribute__((used)) \ -set_dp (struct link_map *map) \ -{ \ - register Elf32_Addr dp asm ("%r27"); \ - dp = D_PTR (map, l_info[DT_PLTGOT]); \ - asm volatile ("" : : "r" (dp)); \ - return map; \ -} \ - \ asm ( \ " .text\n" \ " .globl _start\n" \ @@ -447,14 +449,11 @@ asm ( \ " stw %r24,-44(%sp)\n" \ \ ".Lnofix:\n" \ + /* Call _dl_init(main_map, argc, argv, envp). */ \ " addil LT'_rtld_local,%r19\n" \ " ldw RT'_rtld_local(%r1),%r26\n" \ -" bl set_dp, %r2\n" \ " ldw 0(%r26),%r26\n" \ \ - /* Call _dl_init(_dl_loaded, argc, argv, envp). */ \ -" copy %r28,%r26\n" \ - \ /* envp = argv + argc + 1 */ \ " sh2add %r25,%r24,%r23\n" \ " bl _dl_init,%r2\n" \