bfd: fix negative GOT offsets for non-local references on sparc64

bfd/ChangeLog:

2016-11-18  James Clarke  <jrtc27@jrtc27.com>

	* elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Don't convert
	R_SPARC_GOTDATA_OP_HIX22 and R_SPARC_GOTDATA_OP_LOX10 to
	R_SPARC_GOT* for non-local references. Instead, treat them like
	R_SPARC_GOTDATA_HIX22/R_SPARC_GOTDATA_LOX10 when filling in the
	immediate with the calculated relocation.
This commit is contained in:
James Clarke 2016-11-18 12:51:40 +01:00 committed by Jose E. Marchesi
parent a85db0a618
commit cc133f9f11
2 changed files with 20 additions and 10 deletions

View File

@ -1,3 +1,11 @@
2016-11-18 James Clarke <jrtc27@jrtc27.com>
* elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Don't convert
R_SPARC_GOTDATA_OP_HIX22 and R_SPARC_GOTDATA_OP_LOX10 to
R_SPARC_GOT* for non-local references. Instead, treat them like
R_SPARC_GOTDATA_HIX22/R_SPARC_GOTDATA_LOX10 when filling in the
immediate with the calculated relocation.
2016-11-18 Nick Clifton <nickc@redhat.com>
PR ld/20675

View File

@ -3164,14 +3164,12 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
case R_SPARC_GOTDATA_OP_HIX22:
case R_SPARC_GOTDATA_OP_LOX10:
if (SYMBOL_REFERENCES_LOCAL (info, h))
r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
? R_SPARC_GOTDATA_HIX22
: R_SPARC_GOTDATA_LOX10);
else
r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
? R_SPARC_GOT22
: R_SPARC_GOT10);
howto = _bfd_sparc_elf_howto_table + r_type;
{
r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
? R_SPARC_GOTDATA_HIX22
: R_SPARC_GOTDATA_LOX10);
howto = _bfd_sparc_elf_howto_table + r_type;
}
break;
case R_SPARC_GOTDATA_OP:
@ -3193,6 +3191,8 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
relocation = gdopoff (info, relocation);
break;
case R_SPARC_GOTDATA_OP_HIX22:
case R_SPARC_GOTDATA_OP_LOX10:
case R_SPARC_GOT10:
case R_SPARC_GOT13:
case R_SPARC_GOT22:
@ -4017,7 +4017,8 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
r = bfd_reloc_ok;
}
else if (r_type == R_SPARC_HIX22
|| r_type == R_SPARC_GOTDATA_HIX22)
|| r_type == R_SPARC_GOTDATA_HIX22
|| r_type == R_SPARC_GOTDATA_OP_HIX22)
{
bfd_vma x;
@ -4036,7 +4037,8 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
relocation);
}
else if (r_type == R_SPARC_LOX10
|| r_type == R_SPARC_GOTDATA_LOX10)
|| r_type == R_SPARC_GOTDATA_LOX10
|| r_type == R_SPARC_GOTDATA_OP_LOX10)
{
bfd_vma x;