diff options
author | David S. Miller <davem@redhat.com> | 2010-02-09 04:48:16 +0000 |
---|---|---|
committer | David S. Miller <davem@redhat.com> | 2010-02-09 04:48:16 +0000 |
commit | 705b5121210f15c53f33635ce27798024eb2ac3b (patch) | |
tree | 27ea727fae213c4b4a7cc0bbc9e12b545373abbc /gold/sparc.cc | |
parent | 4baec45cb02caafc076994dd0749dbc124b2c0f8 (diff) | |
download | gdb-705b5121210f15c53f33635ce27798024eb2ac3b.zip gdb-705b5121210f15c53f33635ce27798024eb2ac3b.tar.gz gdb-705b5121210f15c53f33635ce27798024eb2ac3b.tar.bz2 |
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.cc | 37 |
1 files changed, 31 insertions, 6 deletions
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: |