/* Support for the generic parts of most COFF variants, for BFD.
- Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
+ Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
Free Software Foundation, Inc.
Written by Cygnus Support.
{
bfd_byte *esymstart, *esym, *esymend;
int seen_state = 0;
- char *target_name;
+ char *target_name = NULL;
esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
#endif
#ifdef ARMMAGIC
case ARMMAGIC:
+ case ARMPEMAGIC:
+ case THUMBPEMAGIC:
arch = bfd_arch_arm;
switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
{
cputype = 0;
else
{
- bfd_byte buf[bfd_coff_symesz (abfd)];
+ bfd_byte *buf;
struct internal_syment sym;
+ buf = (bfd_byte *) bfd_malloc (bfd_coff_symesz (abfd));
if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
- || bfd_read (buf, 1, bfd_coff_symesz (abfd), abfd) != bfd_coff_symesz (abfd))
- return false;
+ || (bfd_read (buf, 1, bfd_coff_symesz (abfd), abfd)
+ != bfd_coff_symesz (abfd)))
+ {
+ free (buf);
+ return false;
+ }
coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
if (sym.n_sclass == C_FILE)
cputype = sym.n_type & 0xff;
else
cputype = 0;
+ free (buf);
}
}
#ifdef SH_ARCH_MAGIC_BIG
case SH_ARCH_MAGIC_BIG:
case SH_ARCH_MAGIC_LITTLE:
+#ifdef COFF_WITH_PE
+ case SH_ARCH_MAGIC_WINCE:
+#endif
arch = bfd_arch_sh;
machine = 0;
break;
#endif
+#ifdef MIPS_ARCH_MAGIC_WINCE
+ case MIPS_ARCH_MAGIC_WINCE:
+ arch = bfd_arch_mips;
+ machine = 0;
+ break;
+#endif
+
#ifdef H8500MAGIC
case H8500MAGIC:
arch = bfd_arch_h8500;
#endif
if (q->sym_ptr_ptr)
{
+#ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
+ if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q,s))
+#else
if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
+#endif
/* This is a relocation relative to the absolute symbol. */
n.r_symndx = -1;
else
#endif
#ifdef ARMMAGIC
case bfd_arch_arm:
+#ifdef ARM_WINCE
+ * magicp = ARMPEMAGIC;
+#else
* magicp = ARMMAGIC;
+#endif
* flagsp = 0;
if (APCS_SET (abfd))
{
#ifdef SH_ARCH_MAGIC_BIG
case bfd_arch_sh:
+#ifdef COFF_IMAGE_WITH_PE
+ *magicp = SH_ARCH_MAGIC_WINCE;
+#else
if (bfd_big_endian (abfd))
*magicp = SH_ARCH_MAGIC_BIG;
else
*magicp = SH_ARCH_MAGIC_LITTLE;
+#endif
+ return true;
+ break;
+#endif
+
+#ifdef MIPS_ARCH_MAGIC_WINCE
+ case bfd_arch_mips:
+ *magicp = MIPS_ARCH_MAGIC_WINCE;
return true;
break;
#endif
RS6K_AOUTHDR_OMAGIC;
#endif
+#if defined(SH) && defined(COFF_WITH_PE)
+#define __A_MAGIC_SET__
+ internal_a.magic = SH_PE_MAGIC;
+#endif
+
+#if defined(MIPS) && defined(COFF_WITH_PE)
+#define __A_MAGIC_SET__
+ internal_a.magic = MIPS_PE_MAGIC;
+#endif
+
#ifndef __A_MAGIC_SET__
#include "Your aouthdr magic number is not being set!"
#else
/* now write them */
if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
return false;
+
{
- char buff[bfd_coff_filhsz (abfd)];
+ char * buff;
+ bfd_size_type amount;
+
+ buff = bfd_malloc (bfd_coff_filhsz (abfd));
+ if (buff == NULL)
+ return false;
+
coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
- if (bfd_write ((PTR) buff, 1, bfd_coff_filhsz (abfd), abfd)
- != bfd_coff_filhsz (abfd))
+ amount = bfd_write ((PTR) buff, 1, bfd_coff_filhsz (abfd), abfd);
+
+ free (buff);
+
+ if (amount != bfd_coff_filhsz (abfd))
return false;
}
+
if (abfd->flags & EXEC_P)
{
/* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
include/coff/pe.h sets AOUTSZ == sizeof(PEAOUTHDR)) */
- char buff[bfd_coff_aoutsz (abfd)];
+ char * buff;
+ bfd_size_type amount;
+
+ buff = bfd_malloc (bfd_coff_aoutsz (abfd));
+ if (buff == NULL)
+ return false;
+
coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
- if (bfd_write ((PTR) buff, 1, bfd_coff_aoutsz (abfd), abfd) != bfd_coff_aoutsz (abfd))
+ amount = bfd_write ((PTR) buff, 1, bfd_coff_aoutsz (abfd), abfd);
+
+ free (buff);
+
+ if (amount != bfd_coff_aoutsz (abfd))
return false;
}
#ifdef RS6000COFF_C