| 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 |
| |