diff options
author | DJ Delorie <dj@redhat.com> | 2015-06-25 17:20:15 -0400 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2015-06-25 17:20:15 -0400 |
commit | 3f3070745b78c25d7b16c913c15496b296802505 (patch) | |
tree | 60f8787ef7cebd9a4cdaaaae57b784638d17c150 /bfd/elf32-msp430.c | |
parent | 946748d5ed1d218adfccd523be9fdf280adfe434 (diff) | |
download | gdb-3f3070745b78c25d7b16c913c15496b296802505.zip gdb-3f3070745b78c25d7b16c913c15496b296802505.tar.gz gdb-3f3070745b78c25d7b16c913c15496b296802505.tar.bz2 |
Fix REL handling for MSP430
* elf32-msp430.c (msp430_final_link_relocate): Fix comments. Fix
REL loads to match RELA stores.
Diffstat (limited to 'bfd/elf32-msp430.c')
-rw-r--r-- | bfd/elf32-msp430.c | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/bfd/elf32-msp430.c b/bfd/elf32-msp430.c index edd49f7..9e69791 100644 --- a/bfd/elf32-msp430.c +++ b/bfd/elf32-msp430.c @@ -845,14 +845,14 @@ msp430_final_link_relocate (reloc_howto_type * howto, break; case R_MSP430X_PCR20_EXT_ODST: - /* [0,4]+[48,16] = ---F ---- FFFF */ + /* [0,4]+[48,16] = ---F ---- ---- FFFF */ contents += rel->r_offset; srel = (bfd_signed_vma) relocation; if (is_rel_reloc) { bfd_vma addend; addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; - addend |= bfd_get_16 (input_bfd, contents+4); + addend |= bfd_get_16 (input_bfd, contents + 6); srel += addend; } @@ -868,14 +868,14 @@ msp430_final_link_relocate (reloc_howto_type * howto, break; case R_MSP430X_ABS20_EXT_SRC: - /* [7,4]+[32,16] = -78- FFFF */ + /* [7,4]+[32,16] = -78- ---- FFFF */ contents += rel->r_offset; srel = (bfd_signed_vma) relocation; if (is_rel_reloc) { bfd_vma addend; addend = (bfd_get_16 (input_bfd, contents) & 0x0780) << 9; - addend |= bfd_get_16 (input_bfd, contents+2); + addend |= bfd_get_16 (input_bfd, contents + 4); srel += addend; } else @@ -904,14 +904,14 @@ msp430_final_link_relocate (reloc_howto_type * howto, break; case R_MSP430X_PCR20_EXT_DST: - /* [0,4]+[32,16] = ---F FFFF */ + /* [0,4]+[32,16] = ---F ---- FFFF */ contents += rel->r_offset; srel = (bfd_signed_vma) relocation; if (is_rel_reloc) { bfd_vma addend; addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; - addend |= bfd_get_16 (input_bfd, contents+2); + addend |= bfd_get_16 (input_bfd, contents + 4); srel += addend; } else @@ -927,14 +927,14 @@ msp430_final_link_relocate (reloc_howto_type * howto, break; case R_MSP430X_PCR20_EXT_SRC: - /* [7,4]+32,16] = -78- FFFF */ + /* [7,4]+[32,16] = -78- ---- FFFF */ contents += rel->r_offset; srel = (bfd_signed_vma) relocation; if (is_rel_reloc) { bfd_vma addend; addend = ((bfd_get_16 (input_bfd, contents) & 0x0780) << 9); - addend |= bfd_get_16 (input_bfd, contents+2); + addend |= bfd_get_16 (input_bfd, contents + 4); srel += addend;; } else @@ -961,10 +961,16 @@ msp430_final_link_relocate (reloc_howto_type * howto, break; case R_MSP430X_ABS20_EXT_DST: + /* [0,4]+[32,16] = ---F ---- FFFF */ contents += rel->r_offset; srel = (bfd_signed_vma) relocation; if (is_rel_reloc) - srel += bfd_get_16 (input_bfd, contents) & 0xf; + { + bfd_vma addend; + addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; + addend |= bfd_get_16 (input_bfd, contents + 4); + srel += addend; + } else srel += rel->r_addend; bfd_put_16 (input_bfd, (srel & 0xffff), contents + 4); @@ -975,14 +981,14 @@ msp430_final_link_relocate (reloc_howto_type * howto, break; case R_MSP430X_ABS20_EXT_ODST: - /* [0,4]+[48,16] = ---F ---- FFFF */ + /* [0,4]+[48,16] = ---F ---- ---- FFFF */ contents += rel->r_offset; srel = (bfd_signed_vma) relocation; if (is_rel_reloc) { bfd_vma addend; addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; - addend |= bfd_get_16 (input_bfd, contents+4); + addend |= bfd_get_16 (input_bfd, contents + 6); srel += addend; } else @@ -995,7 +1001,7 @@ msp430_final_link_relocate (reloc_howto_type * howto, break; case R_MSP430X_ABS20_ADR_SRC: - /* [8,4]+[32,16] = -F-- FFFF */ + /* [8,4]+[16,16] = -F-- FFFF */ contents += rel->r_offset; srel = (bfd_signed_vma) relocation; if (is_rel_reloc) @@ -1003,7 +1009,7 @@ msp430_final_link_relocate (reloc_howto_type * howto, bfd_vma addend; addend = ((bfd_get_16 (input_bfd, contents) & 0xf00) << 8); - addend |= bfd_get_16 (input_bfd, contents+2); + addend |= bfd_get_16 (input_bfd, contents + 2); srel += addend; } else @@ -1016,14 +1022,14 @@ msp430_final_link_relocate (reloc_howto_type * howto, break; case R_MSP430X_ABS20_ADR_DST: - /* [0,4]+[32,16] = ---F FFFF */ + /* [0,4]+[16,16] = ---F FFFF */ contents += rel->r_offset; srel = (bfd_signed_vma) relocation; if (is_rel_reloc) { bfd_vma addend; addend = ((bfd_get_16 (input_bfd, contents) & 0xf) << 16); - addend |= bfd_get_16 (input_bfd, contents+2); + addend |= bfd_get_16 (input_bfd, contents + 2); srel += addend; } else @@ -1058,14 +1064,14 @@ msp430_final_link_relocate (reloc_howto_type * howto, break; case R_MSP430X_PCR20_CALL: - /* [0,4]+[32,16] = ---F FFFF*/ + /* [0,4]+[16,16] = ---F FFFF*/ contents += rel->r_offset; srel = (bfd_signed_vma) relocation; if (is_rel_reloc) { bfd_vma addend; addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; - addend |= bfd_get_16 (input_bfd, contents+2); + addend |= bfd_get_16 (input_bfd, contents + 2); srel += addend; } else |