[binutils-gdb] PR16794, gold ignores R_386_GOTOFF addend

Alan Modra amodra@sourceware.org
Sat Sep 28 07:18:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ea8e302e12bd155a3acd79290ec87d7dda2cce61

commit ea8e302e12bd155a3acd79290ec87d7dda2cce61
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Sep 11 13:22:42 2019 +0930

    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.

Diff:
---
 gold/ChangeLog | 8 ++++++++
 gold/i386.cc   | 7 +++----
 gold/x86_64.cc | 7 +++----
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 964b7d7..c2acb20 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,11 @@
+2019-09-28  Alan Modra  <amodra@gmail.com>
+
+	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.
+
 2019-09-24  Nick Clifton  <nickc@redhat.com>
 
 	* descriptors.cc: Include <string>
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;
 
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index c06a282..bafd90e 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -4852,10 +4852,9 @@ Target_x86_64<size>::Relocate::relocate(
 
     case elfcpp::R_X86_64_GOTOFF64:
       {
-	typename elfcpp::Elf_types<size>::Elf_Addr value;
-	value = (psymval->value(object, 0)
-		 - target->got_plt_section()->address());
-	Reloc_funcs::rela64(view, value, addend);
+	typename elfcpp::Elf_types<size>::Elf_Addr reladdr;
+	reladdr = target->got_plt_section()->address();
+	Reloc_funcs::pcrela64(view, object, psymval, addend, reladdr);
       }
       break;



More information about the Binutils-cvs mailing list