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.
This commit is contained in:
Alan Modra 2019-09-11 13:22:42 +09:30
parent cd5f43ff5d
commit ea8e302e12
3 changed files with 14 additions and 8 deletions

View File

@ -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>

View File

@ -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;

View File

@ -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;