PR16794, gold ignores R_386_GOTOFF addend
Alan Modra
amodra@gmail.com
Thu Sep 26 05:23:00 GMT 2019
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
More information about the Binutils
mailing list