package/binutils/2.32: backport or1k upstream patch
Without this patch, the system build using qemu_or1k_defconfig (gcc 9.2, binutils 2.32 and uClibc 1.0.32) doesn't boot. https://mailman.uclibc-ng.org/pipermail/devel/2019-August/001895.html Signed-off-by: Romain Naour <romain.naour@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
parent
d87177f201
commit
e1c7dffb25
|
@ -0,0 +1,46 @@
|
|||
From b17678f639f953d687d96cd52690e7cbfae50f91 Mon Sep 17 00:00:00 2001
|
||||
From: Stafford Horne <shorne@gmail.com>
|
||||
Date: Fri, 23 Aug 2019 22:25:55 +0900
|
||||
Subject: [PATCH] or1k: Fix incorrect value in PLT GOT entries, causing
|
||||
infinite loop
|
||||
|
||||
The PLT GOT entry should point to the first PLT entry which contains the
|
||||
runtime linker function. It was pointing back to the symbol PLT entry
|
||||
causing an infinite loop.
|
||||
|
||||
I found this when testing the OpenRISC glibc port which uses the runtime
|
||||
dynamic linker. It seems other libc's we use so far have not been
|
||||
making use of the initial PLT GOT entries.
|
||||
|
||||
bfd/ChangeLog:
|
||||
|
||||
* elf32-or1k.c (or1k_elf_finish_dynamic_symbol): Use correct value for
|
||||
PLT GOT entries.
|
||||
|
||||
(cherry picked from commit 09f7b0de537d465fc8ed9f9433e348c1bc78aab2)
|
||||
Signed-off-by: Romain Naour <romain.naour@gmail.com>
|
||||
---
|
||||
bfd/elf32-or1k.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c
|
||||
index 2f200b197b8..32839cfa7b6 100644
|
||||
--- a/bfd/elf32-or1k.c
|
||||
+++ b/bfd/elf32-or1k.c
|
||||
@@ -2379,8 +2379,11 @@ or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
|
||||
or1k_write_plt_entry (output_bfd, splt->contents + h->plt.offset,
|
||||
plt0, plt1, plt2, OR1K_JR(12));
|
||||
|
||||
- /* Fill in the entry in the global offset table. */
|
||||
- bfd_put_32 (output_bfd, plt_addr, sgot->contents + got_offset);
|
||||
+ /* Fill in the entry in the global offset table. We initialize it to
|
||||
+ point to the top of the plt. This is done to lazy lookup the actual
|
||||
+ symbol as the first plt entry will be setup by libc to call the
|
||||
+ runtime dynamic linker. */
|
||||
+ bfd_put_32 (output_bfd, plt_base_addr, sgot->contents + got_offset);
|
||||
|
||||
/* Fill in the entry in the .rela.plt section. */
|
||||
rela.r_offset = got_addr;
|
||||
--
|
||||
2.23.0
|
||||
|
Loading…
Reference in a new issue