e1c7dffb25
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>
47 lines
1.7 KiB
Diff
47 lines
1.7 KiB
Diff
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
|
|
|