aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorJames Clarke <jrtc27@jrtc27.com>2016-11-18 12:51:40 +0100
committerJose E. Marchesi <jose.marchesi@oracle.com>2016-11-18 12:51:40 +0100
commitcc133f9f118ef4afd93da0ecba48151488c41c74 (patch)
tree33a09f81fa2df268c88e5562bcba6b6c6cb572bd /bfd
parenta85db0a6188b89ef49a1bd0f0ed435adc133b3ae (diff)
downloadgdb-cc133f9f118ef4afd93da0ecba48151488c41c74.zip
gdb-cc133f9f118ef4afd93da0ecba48151488c41c74.tar.gz
gdb-cc133f9f118ef4afd93da0ecba48151488c41c74.tar.bz2
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elfxx-sparc.c22
2 files changed, 20 insertions, 10 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b96b939..8a18a6d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c
index db8058f..e1c7b22 100644
--- a/bfd/elfxx-sparc.c
+++ b/bfd/elfxx-sparc.c
@@ -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;