diff options
author | James Clarke <jrtc27@jrtc27.com> | 2016-11-18 12:51:40 +0100 |
---|---|---|
committer | Jose E. Marchesi <jose.marchesi@oracle.com> | 2016-11-18 12:51:40 +0100 |
commit | cc133f9f118ef4afd93da0ecba48151488c41c74 (patch) | |
tree | 33a09f81fa2df268c88e5562bcba6b6c6cb572bd /bfd/elfxx-sparc.c | |
parent | a85db0a6188b89ef49a1bd0f0ed435adc133b3ae (diff) | |
download | gdb-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/elfxx-sparc.c')
-rw-r--r-- | bfd/elfxx-sparc.c | 22 |
1 files changed, 12 insertions, 10 deletions
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; |