summaryrefslogtreecommitdiff
path: root/gold/sparc.cc
diff options
context:
space:
mode:
authorDavid S. Miller <davem@redhat.com>2010-02-09 04:48:16 +0000
committerDavid S. Miller <davem@redhat.com>2010-02-09 04:48:16 +0000
commit705b5121210f15c53f33635ce27798024eb2ac3b (patch)
tree27ea727fae213c4b4a7cc0bbc9e12b545373abbc /gold/sparc.cc
parent4baec45cb02caafc076994dd0749dbc124b2c0f8 (diff)
downloadbinutils-gdb-705b5121210f15c53f33635ce27798024eb2ac3b.tar.gz
gold/
2010-02-08 David S. Miller <davem@davemloft.net> * sparc.cc (Target_sparc::Relocate::relocate): If relocation offset is unaligned for R_SPARC_16, R_SPARC_32, or R_SPARC_64, use the unaligned relocation helper function.
Diffstat (limited to 'gold/sparc.cc')
-rw-r--r--gold/sparc.cc37
1 files changed, 31 insertions, 6 deletions
diff --git a/gold/sparc.cc b/gold/sparc.cc
index c5ce06ab609..4cef8d86c94 100644
--- a/gold/sparc.cc
+++ b/gold/sparc.cc
@@ -2447,14 +2447,30 @@ Target_sparc<size, big_endian>::Relocate::relocate(
break;
case elfcpp::R_SPARC_16:
- Relocate_functions<size, big_endian>::rela16(view, object,
- psymval, addend);
+ if (rela.get_r_offset() & 0x1)
+ {
+ // The assembler can sometimes emit unaligned relocations
+ // for dwarf2 cfi directives.
+ Reloc::ua16(view, object, psymval, addend);
+ }
+ else
+ Relocate_functions<size, big_endian>::rela16(view, object,
+ psymval, addend);
break;
case elfcpp::R_SPARC_32:
if (!parameters->options().output_is_position_independent())
- Relocate_functions<size, big_endian>::rela32(view, object,
- psymval, addend);
+ {
+ if (rela.get_r_offset() & 0x3)
+ {
+ // The assembler can sometimes emit unaligned relocations
+ // for dwarf2 cfi directives.
+ Reloc::ua32(view, object, psymval, addend);
+ }
+ else
+ Relocate_functions<size, big_endian>::rela32(view, object,
+ psymval, addend);
+ }
break;
case elfcpp::R_SPARC_DISP8:
@@ -2563,8 +2579,17 @@ Target_sparc<size, big_endian>::Relocate::relocate(
case elfcpp::R_SPARC_64:
if (!parameters->options().output_is_position_independent())
- Relocate_functions<size, big_endian>::rela64(view, object,
- psymval, addend);
+ {
+ if (rela.get_r_offset() & 0x7)
+ {
+ // The assembler can sometimes emit unaligned relocations
+ // for dwarf2 cfi directives.
+ Reloc::ua64(view, object, psymval, addend);
+ }
+ else
+ Relocate_functions<size, big_endian>::rela64(view, object,
+ psymval, addend);
+ }
break;
case elfcpp::R_SPARC_OLO10: