This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.  The same goes
for R_X86_64_GOTOFF64.

Note that R_X86_64_GOTOFF64 isn't easy to generate from gcc, and may
in fact be impossible nowadays.  Also, x86 gas won't reduce symbols to
section symbols on R_386_GOTOFF and R_X86_64_GOTOFF64.  I suspect that
isn't necessary, but I'm leaving that to HJ to investigate.  (Keeping
the original symbol is necessary for most GOT relocs in order to
generate the proper GOT entry because the ABI says to put the symbol
in the GOT entry, not symbol plus addend.  The addend becomes a
useless offset from the GOT entry.  But anyway, these two relocs don't
generate a GOT entry.)

OK?

	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 --git a/gold/i386.cc b/gold/i386.cc
index dd0b268e10..2d3db7c2c2 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 c06a282247..bafd90ef5e 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;
 

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]