This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PR16794, gold ignores R_386_GOTOFF addend
- From: Alan Modra <amodra at gmail dot com>
- To: binutils at sourceware dot org
- Cc: Cary Coutant <ccoutant at gmail dot com>, "H.J. Lu" <hjl dot tools at gmail dot com>
- Date: Thu, 26 Sep 2019 14:53:38 +0930
- Subject: 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