From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2178) id 1505A3858D34; Sun, 14 Apr 2024 07:10:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1505A3858D34 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1713078648; bh=8GGs4+ECm4wQi1rWIDmH82uxN3fE82xOh3Vu2w7DOkM=; h=From:To:Subject:Date:From; b=xY5b/iukSEy5ja+/7PmtAbEzugLMBZqEJqz3O8vEhNE0BrEZ+sGGYOtH4dus6VG4q fKGDYLxlunrRJbNfwH4YpF3cDUgCZyOsO/GhGRZ2hPT+f/gBaAuUhucUIFBlaRCPEM QEPHAiOnJeirh7473uSAFivu+u1euTRqEJErhK7c= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Florian Weimer To: glibc-cvs@sourceware.org Subject: [glibc/release/2.38/master] powerpc: Fix ld.so address determination for PCREL mode (bug 31640) X-Act-Checkin: glibc X-Git-Author: Florian Weimer X-Git-Refname: refs/heads/release/2.38/master X-Git-Oldrev: 92da7c2cfeeea36d651142f47e570dd5076bc166 X-Git-Newrev: 20534f81760635f3a71fb11ba251568cdc11c6a0 Message-Id: <20240414071048.1505A3858D34@sourceware.org> Date: Sun, 14 Apr 2024 07:10:48 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=20534f81760635f3a71fb11ba251568cdc11c6a0 commit 20534f81760635f3a71fb11ba251568cdc11c6a0 Author: Florian Weimer Date: Sun Apr 14 08:24:51 2024 +0200 powerpc: Fix ld.so address determination for PCREL mode (bug 31640) This seems to have stopped working with some GCC 14 versions, which clobber r2. With other compilers, the kernel-provided r2 value is still available at this point. Reviewed-by: Peter Bergner (cherry picked from commit 14e56bd4ce15ac2d1cc43f762eb2e6b83fec1afe) Diff: --- sysdeps/powerpc/powerpc64/dl-machine.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index 9b8943bc91..7fa8a355b5 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -79,6 +79,7 @@ elf_host_tolerates_class (const Elf64_Ehdr *ehdr) static inline Elf64_Addr elf_machine_load_address (void) __attribute__ ((const)); +#ifndef __PCREL__ static inline Elf64_Addr elf_machine_load_address (void) { @@ -106,6 +107,24 @@ elf_machine_dynamic (void) /* Then subtract off the load address offset. */ return runtime_dynamic - elf_machine_load_address() ; } +#else /* __PCREL__ */ +/* In PCREL mode, r2 may have been clobbered. Rely on relative + relocations instead. */ + +static inline ElfW(Addr) +elf_machine_load_address (void) +{ + extern const ElfW(Ehdr) __ehdr_start attribute_hidden; + return (ElfW(Addr)) &__ehdr_start; +} + +static inline ElfW(Addr) +elf_machine_dynamic (void) +{ + extern ElfW(Dyn) _DYNAMIC[] attribute_hidden; + return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address (); +} +#endif /* __PCREL__ */ /* The PLT uses Elf64_Rela relocs. */ #define elf_machine_relplt elf_machine_rela