From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2178) id 7C5B43858D34; Sun, 14 Apr 2024 06:25:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7C5B43858D34 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1713075901; bh=fepH7wDu+ztCzVHuvw773j5sp9hh6ncklhM9dYEci+E=; h=From:To:Subject:Date:From; b=N/JEzB4GySRHBaQsJ/6pmnypUALrRNWV53iFjkFPoEolNFcjg8TQwOqPX3fGO1WMI i5OTY4z3zCdZ0IklYJ/hYR+VXj19FuGBcSjiF1sBOL28u/k2cydv175qPkdfISx6NB 9onHRGvtWxebfWHeEs9YepabRl5oXNSur0z9K+So= 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] 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/master X-Git-Oldrev: aea52e3d2b71e89f2ba4fd4d8f1f8d3036d83c1d X-Git-Newrev: 14e56bd4ce15ac2d1cc43f762eb2e6b83fec1afe Message-Id: <20240414062501.7C5B43858D34@sourceware.org> Date: Sun, 14 Apr 2024 06:25:01 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=14e56bd4ce15ac2d1cc43f762eb2e6b83fec1afe commit 14e56bd4ce15ac2d1cc43f762eb2e6b83fec1afe 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 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 c6682f3445..2b6f5d2b08 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -78,6 +78,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) { @@ -105,6 +106,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