* archures.c (bfd_arch_get_compatible): If one arch is unknown,
return the other arch. * elfcode.h (elf_object_p): Allow explicit match to generic ELF target.
This commit is contained in:
parent
f973cbf1c6
commit
d50ec8a7e1
@ -1,3 +1,10 @@
|
||||
2011-06-04 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* archures.c (bfd_arch_get_compatible): If one arch is unknown,
|
||||
return the other arch.
|
||||
* elfcode.h (elf_object_p): Allow explicit match to generic ELF
|
||||
target.
|
||||
|
||||
2011-06-03 Bertram Felgenhauer <bertram.felgenhauer@gmail.com>
|
||||
|
||||
PR ld/12682
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* BFD library support routines for architectures.
|
||||
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
||||
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
||||
Free Software Foundation, Inc.
|
||||
Hacked by John Gilmore and Steve Chamberlain of Cygnus Support.
|
||||
|
||||
@ -748,25 +748,26 @@ bfd_arch_get_compatible (const bfd *abfd,
|
||||
const bfd *bbfd,
|
||||
bfd_boolean accept_unknowns)
|
||||
{
|
||||
const bfd * ubfd = NULL;
|
||||
const bfd *ubfd, *kbfd;
|
||||
|
||||
/* Look for an unknown architecture. */
|
||||
if (((ubfd = abfd) && ubfd->arch_info->arch == bfd_arch_unknown)
|
||||
|| ((ubfd = bbfd) && ubfd->arch_info->arch == bfd_arch_unknown))
|
||||
{
|
||||
/* We can allow an unknown architecture if accept_unknowns
|
||||
is true, or if the target is the "binary" format, which
|
||||
has an unknown architecture. Since the binary format can
|
||||
only be set by explicit request from the user, it is safe
|
||||
to assume that they know what they are doing. */
|
||||
if (accept_unknowns
|
||||
|| strcmp (bfd_get_target (ubfd), "binary") == 0)
|
||||
return ubfd->arch_info;
|
||||
return NULL;
|
||||
}
|
||||
if (abfd->arch_info->arch == bfd_arch_unknown)
|
||||
ubfd = abfd, kbfd = bbfd;
|
||||
else if (bbfd->arch_info->arch == bfd_arch_unknown)
|
||||
ubfd = bbfd, kbfd = abfd;
|
||||
else
|
||||
/* Otherwise architecture-specific code has to decide. */
|
||||
return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info);
|
||||
|
||||
/* Otherwise architecture-specific code has to decide. */
|
||||
return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info);
|
||||
/* We can allow an unknown architecture if accept_unknowns
|
||||
is true, or if the target is the "binary" format, which
|
||||
has an unknown architecture. Since the binary format can
|
||||
only be set by explicit request from the user, it is safe
|
||||
to assume that they know what they are doing. */
|
||||
if (accept_unknowns
|
||||
|| strcmp (bfd_get_target (ubfd), "binary") == 0)
|
||||
return kbfd->arch_info;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -595,26 +595,27 @@ elf_object_p (bfd *abfd)
|
||||
|
||||
/* This is the generic ELF target. Let it match any ELF target
|
||||
for which we do not have a specific backend. */
|
||||
for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
|
||||
{
|
||||
const struct elf_backend_data *back;
|
||||
if (abfd->target_defaulted)
|
||||
for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
|
||||
{
|
||||
const struct elf_backend_data *back;
|
||||
|
||||
if ((*target_ptr)->flavour != bfd_target_elf_flavour)
|
||||
continue;
|
||||
back = xvec_get_elf_backend_data (*target_ptr);
|
||||
if (back->s->arch_size != ARCH_SIZE)
|
||||
continue;
|
||||
if (back->elf_machine_code == i_ehdrp->e_machine
|
||||
|| (back->elf_machine_alt1 != 0
|
||||
&& back->elf_machine_alt1 == i_ehdrp->e_machine)
|
||||
|| (back->elf_machine_alt2 != 0
|
||||
&& back->elf_machine_alt2 == i_ehdrp->e_machine))
|
||||
{
|
||||
/* target_ptr is an ELF backend which matches this
|
||||
object file, so reject the generic ELF target. */
|
||||
goto got_wrong_format_error;
|
||||
}
|
||||
}
|
||||
if ((*target_ptr)->flavour != bfd_target_elf_flavour)
|
||||
continue;
|
||||
back = xvec_get_elf_backend_data (*target_ptr);
|
||||
if (back->s->arch_size != ARCH_SIZE)
|
||||
continue;
|
||||
if (back->elf_machine_code == i_ehdrp->e_machine
|
||||
|| (back->elf_machine_alt1 != 0
|
||||
&& back->elf_machine_alt1 == i_ehdrp->e_machine)
|
||||
|| (back->elf_machine_alt2 != 0
|
||||
&& back->elf_machine_alt2 == i_ehdrp->e_machine))
|
||||
{
|
||||
/* target_ptr is an ELF backend which matches this
|
||||
object file, so reject the generic ELF target. */
|
||||
goto got_wrong_format_error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (i_ehdrp->e_type == ET_EXEC)
|
||||
|
Loading…
x
Reference in New Issue
Block a user