* cpu-mips.c (mips_compatible): New. Don't check bits_per_word.

(N): Use the above.
	* elflink.h (elf_bfd_final_link): Revert last change.  Instead,
	ensure reloc size matches before calling elf_link_input_bfd.
	Add an assert to check reloc size when counting output relocs.
This commit is contained in:
Alan Modra 2002-03-14 10:38:31 +00:00
parent c5096a3c51
commit c119f9b800
3 changed files with 54 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2002-03-14 Alan Modra <amodra@bigpond.net.au>
* cpu-mips.c (mips_compatible): New. Don't check bits_per_word.
(N): Use the above.
* elflink.h (elf_bfd_final_link): Revert last change. Instead,
ensure reloc size matches before calling elf_link_input_bfd.
Add an assert to check reloc size when counting output relocs.
2002-03-14 Nick Clifton <nickc@cambridge.redhat.com>
* mmo.c (mmo_get_loc): Return NULL rather than false.

View File

@ -1,5 +1,5 @@
/* bfd back-end for mips support
Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 2000
Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002
Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support.
@ -23,6 +23,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "sysdep.h"
#include "libbfd.h"
/* The default routine tests bits_per_word, which is wrong on mips as
mips word size doesn't correlate with reloc size. */
const bfd_arch_info_type *
mips_compatible (a, b)
const bfd_arch_info_type *a;
const bfd_arch_info_type *b;
{
if (a->arch != b->arch)
return NULL;
if (a->mach > b->mach)
return a;
if (b->mach > a->mach)
return b;
return a;
}
#define N(BITS_WORD, BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT) \
{ \
BITS_WORD, /* bits in a word */ \
@ -34,7 +54,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
PRINT, \
3, \
DEFAULT, \
bfd_default_compatible, \
mips_compatible, \
bfd_default_scan, \
NEXT, \
}

View File

@ -5086,10 +5086,20 @@ elf_bfd_final_link (abfd, info)
= elf_section_data (output_section);
unsigned int *rel_count;
unsigned int *rel_count2;
bfd_size_type entsize;
bfd_size_type entsize2;
/* We must be careful to add the relocation froms the
/* We must be careful to add the relocations from the
input section to the right output count. */
if (esdi->rel_hdr.sh_entsize == esdo->rel_hdr.sh_entsize)
entsize = esdi->rel_hdr.sh_entsize;
entsize2 = esdi->rel_hdr2 ? esdi->rel_hdr2->sh_entsize : 0;
BFD_ASSERT ((entsize == sizeof (Elf_External_Rel)
|| entsize == sizeof (Elf_External_Rela))
&& entsize2 != entsize
&& (entsize2 == 0
|| entsize2 == sizeof (Elf_External_Rel)
|| entsize2 == sizeof (Elf_External_Rela)));
if (entsize == esdo->rel_hdr.sh_entsize)
{
rel_count = &esdo->rel_count;
rel_count2 = &esdo->rel_count2;
@ -5319,12 +5329,21 @@ elf_bfd_final_link (abfd, info)
{
for (p = o->link_order_head; p != NULL; p = p->next)
{
Elf_Internal_Shdr *rhdr;
if (p->type == bfd_indirect_link_order
&& (bfd_get_flavour ((sub = p->u.indirect.section->owner))
&& (bfd_get_flavour (p->u.indirect.section->owner)
== bfd_target_elf_flavour)
&& (sub->arch_info->bits_per_word
== abfd->arch_info->bits_per_word))
&& (((rhdr = &elf_section_data (p->u.indirect.section)->rel_hdr)
->sh_entsize == 0)
|| rhdr->sh_entsize == sizeof (Elf_External_Rel)
|| rhdr->sh_entsize == sizeof (Elf_External_Rela))
&& (((rhdr = elf_section_data (p->u.indirect.section)->rel_hdr2)
== NULL)
|| rhdr->sh_entsize == sizeof (Elf_External_Rel)
|| rhdr->sh_entsize == sizeof (Elf_External_Rela)))
{
sub = p->u.indirect.section->owner;
if (! sub->output_has_begun)
{
if (! elf_link_input_bfd (&finfo, sub))