gold/
authorDavid S. Miller <davem@redhat.com>
Tue, 9 Feb 2010 04:48:16 +0000 (04:48 +0000)
committerDavid S. Miller <davem@redhat.com>
Tue, 9 Feb 2010 04:48:16 +0000 (04:48 +0000)
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.

gold/ChangeLog
gold/sparc.cc

index 0aac2be0788aa4d1ed8ae3e1bd20c369ad6eb5ec..b65da03d9af9a0ab38275a20f171e67bc213fe9d 100644 (file)
@@ -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
index c5ce06ab609d2ba9c3d442db23fd68531e614382..4cef8d86c94ecf7a351ea6be3d411778f963f2d2 100644 (file)
@@ -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:
This page took 0.031238 seconds and 4 git commands to generate.