From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2178) id AD1023858D34; Sun, 14 Apr 2024 09:01:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AD1023858D34 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1713085312; bh=pY2BsrpfXo4SNQYcu0obuOoAe4HQvdXx7ai7pHuo/R0=; h=From:To:Subject:Date:From; b=UiNsDwpCaChXqr94prGqhydMtA1byAic4RJaywelBfYxd8YII2uTf0NSs4mY6rlDp biESkYkkz1YJpvK7I4lv/h0LKzwnVmhuTEqxw819WdaiyzFKN4l0ydZwgCO/sOkoeu mgwXb9maD3y12Em/Y3ykww6C64EmyW6bfpZ98+7Y= 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.36/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.36/master X-Git-Oldrev: 24de733967029fd902c34073d2ab25b900887352 X-Git-Newrev: 78ad1b1b0d42b95c2c75463dc413bfd162a778e8 Message-Id: <20240414090152.AD1023858D34@sourceware.org> Date: Sun, 14 Apr 2024 09:01:52 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=78ad1b1b0d42b95c2c75463dc413bfd162a778e8 commit 78ad1b1b0d42b95c2c75463dc413bfd162a778e8 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 bb0ccd0811..3868bcc2f7 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