aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog6
-rw-r--r--gold/sparc.cc37
2 files changed, 37 insertions, 6 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 0aac2be..b65da03 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2010-02-06 Ian Lance Taylor <iant@google.com>
* configure.ac: Rewrite targetobjs duplicate removal code to use
diff --git a/gold/sparc.cc b/gold/sparc.cc
index c5ce06a..4cef8d86 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: