aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog18
-rw-r--r--bfd/elf32.c63
2 files changed, 62 insertions, 19 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index c9aae00..7daebf7 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,21 @@
+Tue Mar 9 10:52:01 1993 Fred Fish (fnf@cygnus.com)
+
+ * elf32.c (elf_object_p): Use ELF_ARCH stored in xvec to match
+ against machine architecture stored in the ELF header, to resolve
+ ambiguities.
+ * elf32.c (bfd_section_from_shdr): Bfd_make_section can return
+ NULL, so only use results when non-NULL.
+ * targets.c (elf32_m68k_vec, elf32_i860_vec): Add extern decls
+ and add to vector of targets.
+
+Mon Mar 8 15:13:44 1993 Ian Lance Taylor (ian@cygnus.com)
+
+ * coff-mips.c (ecoff_set_symbol_info): Encapsulated STABS symbols
+ are always just debugging symbols.
+
+ * coff-mips.c (ecoff_[gs]et_sym_index): Moved macros from here...
+ libecoff.h (ecoff_[gs]et_sym_index): ...to here.
+
Mon Mar 8 14:55:13 1993 Ken Raeburn (raeburn@cambridge.cygnus.com)
* hppa.c (_PA_RISC_ID): Defined if not already defined (e.g., for
diff --git a/bfd/elf32.c b/bfd/elf32.c
index 3404e47..61bb2b2 100644
--- a/bfd/elf32.c
+++ b/bfd/elf32.c
@@ -74,6 +74,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
*/
+#include <string.h> /* For strrchr and friends */
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
@@ -456,27 +457,30 @@ DEFUN(bfd_section_from_shdr, (abfd, shindex),
if (! hdr->rawdata )
{
newsect = bfd_make_section (abfd, name);
- newsect->vma = hdr->sh_addr;
- newsect->_raw_size = hdr->sh_size;
- newsect->filepos = hdr->sh_offset; /* so we can read back the bits */
- newsect->flags |= SEC_HAS_CONTENTS;
-
- if (hdr->sh_flags & SHF_ALLOC)
+ if (newsect != NULL)
{
- newsect->flags |= SEC_ALLOC;
- if (hdr->sh_type != SHT_NOBITS)
- newsect->flags |= SEC_LOAD;
+ newsect->vma = hdr->sh_addr;
+ newsect->_raw_size = hdr->sh_size;
+ newsect->filepos = hdr->sh_offset; /* so we can read back the bits */
+ newsect->flags |= SEC_HAS_CONTENTS;
+
+ if (hdr->sh_flags & SHF_ALLOC)
+ {
+ newsect->flags |= SEC_ALLOC;
+ if (hdr->sh_type != SHT_NOBITS)
+ newsect->flags |= SEC_LOAD;
+ }
+
+ if (!(hdr->sh_flags & SHF_WRITE))
+ newsect->flags |= SEC_READONLY;
+
+ if (hdr->sh_flags & SHF_EXECINSTR)
+ newsect->flags |= SEC_CODE; /* FIXME: may only contain SOME code */
+ else
+ newsect->flags |= SEC_DATA;
+
+ hdr->rawdata = (void*)newsect;
}
-
- if (!(hdr->sh_flags & SHF_WRITE))
- newsect->flags |= SEC_READONLY;
-
- if (hdr->sh_flags & SHF_EXECINSTR)
- newsect->flags |= SEC_CODE; /* FIXME: may only contain SOME code */
- else
- newsect->flags |= SEC_DATA;
-
- hdr->rawdata = (void*)newsect;
}
return true;
break;
@@ -1072,6 +1076,7 @@ DEFUN (elf_object_p, (abfd), bfd *abfd)
Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
int shindex;
char *shstrtab; /* Internal copy of section header stringtab */
+ struct elf_backend_data *ebd; /* Use to get ELF_ARCH stored in xvec */
/* Read in the ELF header in external format. */
@@ -1150,28 +1155,48 @@ wrong:
if (i_ehdrp->e_type == ET_EXEC || i_ehdrp->e_type == ET_DYN)
abfd -> flags |= EXEC_P;
+ /* Retrieve the architecture information from the xvec and verify
+ that it matches the machine info stored in the ELF header.
+ This allows us to resolve ambiguous formats that might not
+ otherwise be distinguishable. */
+
+ ebd = (struct elf_backend_data *) (abfd->xvec->backend_data);
switch (i_ehdrp->e_machine)
{
case EM_NONE:
case EM_M32: /* or should this be bfd_arch_obscure? */
+ if (ebd -> arch != bfd_arch_unknown)
+ goto wrong;
bfd_default_set_arch_mach(abfd, bfd_arch_unknown, 0);
break;
case EM_SPARC:
+ if (ebd -> arch != bfd_arch_sparc)
+ goto wrong;
bfd_default_set_arch_mach(abfd, bfd_arch_sparc, 0);
break;
case EM_386:
+ if (ebd -> arch != bfd_arch_i386)
+ goto wrong;
bfd_default_set_arch_mach(abfd, bfd_arch_i386, 0);
break;
case EM_68K:
+ if (ebd -> arch != bfd_arch_m68k)
+ goto wrong;
bfd_default_set_arch_mach(abfd, bfd_arch_m68k, 0);
break;
case EM_88K:
+ if (ebd -> arch != bfd_arch_m88k)
+ goto wrong;
bfd_default_set_arch_mach(abfd, bfd_arch_m88k, 0);
break;
case EM_860:
+ if (ebd -> arch != bfd_arch_i860)
+ goto wrong;
bfd_default_set_arch_mach(abfd, bfd_arch_i860, 0);
break;
case EM_MIPS:
+ if (ebd -> arch != bfd_arch_mips)
+ goto wrong;
bfd_default_set_arch_mach(abfd, bfd_arch_mips, 0);
break;
default: