aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/reloc.c14
2 files changed, 17 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4d339aa..c56c3d5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2010-02-22 Alan Modra <amodra@gmail.com>
+
+ * reloc.c (bfd_check_overflow): When forming addrmask, shift
+ fieldmask left by rightshift.
+ (_bfd_relocate_contents): Likewise. Use rightshift addrmask in all
+ overflow checks.
+
2010-02-20 H.J. Lu <hongjiu.lu@intel.com>
* elf64-x86-64.c (elf64_x86_64_add_symbol_hook): Don't check
diff --git a/bfd/reloc.c b/bfd/reloc.c
index dca56d9..0249662 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -1,6 +1,6 @@
/* BFD support for handling relocation entries.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Written by Cygnus Support.
@@ -504,7 +504,7 @@ bfd_check_overflow (enum complain_overflow how,
overflow check. */
fieldmask = N_ONES (bitsize);
signmask = ~fieldmask;
- addrmask = N_ONES (addrsize) | fieldmask;
+ addrmask = N_ONES (addrsize) | (fieldmask << rightshift);
a = (relocation & addrmask) >> rightshift;;
switch (how)
@@ -1434,9 +1434,11 @@ _bfd_relocate_contents (reloc_howto_type *howto,
See also bfd_check_overflow. */
fieldmask = N_ONES (howto->bitsize);
signmask = ~fieldmask;
- addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
+ addrmask = (N_ONES (bfd_arch_bits_per_address (input_bfd))
+ | (fieldmask << rightshift));
a = (relocation & addrmask) >> rightshift;
b = (x & howto->src_mask & addrmask) >> bitpos;
+ addrmask >>= rightshift;
switch (howto->complain_on_overflow)
{
@@ -1454,7 +1456,7 @@ _bfd_relocate_contents (reloc_howto_type *howto,
field. Note that when bfd_vma is 32 bits, a 32-bit reloc
can't overflow, which is exactly what we want. */
ss = a & signmask;
- if (ss != 0 && ss != ((addrmask >> rightshift) & signmask))
+ if (ss != 0 && ss != (addrmask & signmask))
flag = bfd_reloc_overflow;
/* We only need this next bit of code if the sign bit of B
@@ -2023,6 +2025,10 @@ ENUMX
BFD_RELOC_SPU_PPU64
ENUMX
BFD_RELOC_SPU_ADD_PIC
+ENUMX
+ BFD_RELOC_SPU_PIC18
+ENUMX
+ BFD_RELOC_SPU_STUB
ENUMDOC
SPU Relocations.