diff options
author | Alan Modra <amodra@gmail.com> | 2019-09-11 13:22:42 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-09-28 16:47:52 +0930 |
commit | ea8e302e12bd155a3acd79290ec87d7dda2cce61 (patch) | |
tree | e853d2a083965ab1b5895d1b5597883a4051fb0c /gold/i386.cc | |
parent | cd5f43ff5db7b67009404aee4606eee603fb3f68 (diff) | |
download | gdb-ea8e302e12bd155a3acd79290ec87d7dda2cce61.zip gdb-ea8e302e12bd155a3acd79290ec87d7dda2cce61.tar.gz gdb-ea8e302e12bd155a3acd79290ec87d7dda2cce61.tar.bz2 |
PR16794, gold ignores R_386_GOTOFF addend
An R_386_GOTOFF relocation has an addend, typically used when a
symbol can be replaced by its section symbol plus an offset.
psymval->value(object,0) is quite wrong then, fix it.
PR 16794
* i386.cc (Target_i386::Relocate::relocate <R_386_GOTOFF>): Don't
ignore addend, apply using pcrel32.
* x86_64.cc (Target_x86_64::Relocate::relocate <R_X86_64_GOTOFF64>):
Similarly use pcrel64.
Diffstat (limited to 'gold/i386.cc')
-rw-r--r-- | gold/i386.cc | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/gold/i386.cc b/gold/i386.cc index dd0b268..2d3db7c 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -2957,10 +2957,9 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo, case elfcpp::R_386_GOTOFF: { - elfcpp::Elf_types<32>::Elf_Addr value; - value = (psymval->value(object, 0) - - target->got_plt_section()->address()); - Relocate_functions<32, false>::rel32(view, value); + elfcpp::Elf_types<32>::Elf_Addr reladdr; + reladdr = target->got_plt_section()->address(); + Relocate_functions<32, false>::pcrel32(view, object, psymval, reladdr); } break; |