This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: mips n32 bfd will corrupt relocation addends
On Jan 8, 2003, Eric Christopher <echristo@redhat.com> wrote:
>> * elfn32-mips.c (prev_reloc_section): New.
>> (GET_RELOC_ADDEND): Use it. Parenthesize macro arguments.
>> (SET_RELOC_ADDEND): Parenthesize macro argument.
> OK.
Thanks. Pre check-in testing revealed I had mis-applied the patch by
hand, when bringing it from a local branch:
+static bfd_vma prev_reloc_section = NULL;
^^^^^^^ s/bfd_vma/asection */
Here's what I'm actually checking in.
Index: bfd/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
* elfn32-mips.c (prev_reloc_section): New.
(GET_RELOC_ADDEND): Use it. Parenthesize macro arguments.
(SET_RELOC_ADDEND): Parenthesize macro argument.
Index: bfd/elfn32-mips.c
===================================================================
RCS file: /cvs/src/src/bfd/elfn32-mips.c,v
retrieving revision 1.4
diff -u -p -r1.4 elfn32-mips.c
--- bfd/elfn32-mips.c 30 Nov 2002 08:39:39 -0000 1.4
+++ bfd/elfn32-mips.c 8 Jan 2003 21:55:19 -0000
@@ -1,6 +1,6 @@
/* MIPS-specific support for 32-bit ELF
- Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
- Free Software Foundation, Inc.
+ Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+ 2003 Free Software Foundation, Inc.
Most of the information added by Ian Lance Taylor, Cygnus Support,
<ian@cygnus.com>.
@@ -96,6 +96,7 @@ static irix_compat_t elf_n32_mips_irix_c
extern const bfd_target bfd_elf32_nbigmips_vec;
extern const bfd_target bfd_elf32_nlittlemips_vec;
+static asection *prev_reloc_section = NULL;
static bfd_vma prev_reloc_address = -1;
static bfd_vma prev_reloc_addend = 0;
@@ -1207,29 +1208,31 @@ static reloc_howto_type elf_mips_gnu_vte
{ \
/* If we're relocating, and this is an external symbol, we don't \
want to change anything. */ \
- if (obfd != (bfd *) NULL \
- && (sym->flags & BSF_SECTION_SYM) == 0 \
- && (! entry->howto->partial_inplace \
- || entry->addend == 0)) \
+ if ((obfd) != (bfd *) NULL \
+ && ((sym)->flags & BSF_SECTION_SYM) == 0 \
+ && (! (entry)->howto->partial_inplace \
+ || (entry)->addend == 0)) \
{ \
- entry->address += sec->output_offset; \
+ (entry)->address += (sec)->output_offset; \
return bfd_reloc_ok; \
} \
\
/* The addend of combined relocs is remembered and left for \
subsequent relocs. */ \
- if (prev_reloc_address != reloc_entry->address) \
+ if (prev_reloc_address != (entry)->address \
+ || prev_reloc_section != (sec)) \
{ \
- prev_reloc_address = reloc_entry->address; \
- prev_reloc_addend = reloc_entry->addend; \
+ prev_reloc_section = (sec); \
+ prev_reloc_address = (entry)->address; \
+ prev_reloc_addend = (entry)->addend; \
} \
else \
- reloc_entry->addend = prev_reloc_addend; \
+ (entry)->addend = prev_reloc_addend; \
}
#define SET_RELOC_ADDEND(entry) \
{ \
- prev_reloc_addend = entry->addend; \
+ prev_reloc_addend = (entry)->addend; \
}
static bfd_reloc_status_type
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva@{redhat.com, gcc.gnu.org}
CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist Professional serial bug killer