can't call slurp_symtab, because the linker doesn't want the
swapped symbols. */
+ /* COMDAT sections are special. The first symbol is the section
+ symbol, which tells what kind of COMDAT section it is. The
+ *second* symbol is the "comdat symbol" - the one with the
+ unique name. GNU uses the section symbol for the unique
+ name; MS uses ".text" for every comdat section. Sigh. - DJ */
+
if (_bfd_coff_get_external_symbols (abfd))
{
bfd_byte *esym, *esymend;
isym.n_type, isym.n_sclass,
0, isym.n_numaux, (PTR) &aux);
+ /* FIXME: Microsoft uses NODUPLICATES and
+ ASSOCIATIVE, but gnu uses ANY and SAME_SIZE.
+ Unfortunately, gnu doesn't do the comdat
+ symbols right. So, until we can fix it to do
+ the right thing, we are temporarily disabling
+ comdats for the MS types (they're used in
+ DLLs and C++, but we don't support *their*
+ C++ libraries anyway - DJ */
+
switch (aux.x_scn.x_comdat)
{
case IMAGE_COMDAT_SELECT_NODUPLICATES:
+#if 0
sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
+#else
+ sec_flags &= ~SEC_LINK_ONCE;
+#endif
break;
default:
break;
case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
+#if 0
/* FIXME: This is not currently implemented. */
sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
+#else
+ sec_flags &= ~SEC_LINK_ONCE;
+#endif
break;
}
if ((1 << i) >= hdr->s_align)
break;
#endif
-/* start-sanitize-tic80 */
#ifdef TIC80COFF
/* TI tools hijack bits 8-11 for the alignment */
i = (hdr->s_flags >> 8) & 0xF ;
#endif
-/* end-sanitize-tic80 */
section->alignment_power = i;
}
}
#endif
+#ifdef COFF_WITH_PE
+ section->lma = hdr->s_vaddr;
+#endif
}
#undef ALIGN_SET
#undef ELIFALIGN_SET
arch = bfd_arch_arm;
switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
{
- case F_ARM_2: machine = bfd_mach_arm_2; break;
- case F_ARM_2a: machine = bfd_mach_arm_2a; break;
- case F_ARM_3: machine = bfd_mach_arm_3; break;
- default:
- case F_ARM_3M: machine = bfd_mach_arm_3M; break;
- case F_ARM_4: machine = bfd_mach_arm_4; break;
- case F_ARM_4T: machine = bfd_mach_arm_4T; break;
+ case F_ARM_2: machine = bfd_mach_arm_2; break;
+ case F_ARM_2a: machine = bfd_mach_arm_2a; break;
+ case F_ARM_3: machine = bfd_mach_arm_3; break;
+ default:
+ case F_ARM_3M: machine = bfd_mach_arm_3M; break;
+ case F_ARM_4: machine = bfd_mach_arm_4; break;
+ case F_ARM_4T: machine = bfd_mach_arm_4T; break;
+ case F_ARM_5: machine = bfd_mach_arm_5; break;
}
break;
#endif
break;
#endif
-/* start-sanitize-tic80 */
#ifdef TIC80_ARCH_MAGIC
case TIC80_ARCH_MAGIC:
arch = bfd_arch_tic80;
break;
#endif
-/* end-sanitize-tic80 */
+#ifdef MCOREMAGIC
+ case MCOREMAGIC:
+ arch = bfd_arch_mcore;
+ break;
+#endif
default: /* Unreadable input file type */
arch = bfd_arch_obscure;
break;
*magicp = TIC30MAGIC;
return true;
#endif
-/* start-sanitize-tic80 */
#ifdef TIC80_ARCH_MAGIC
case bfd_arch_tic80:
*magicp = TIC80_ARCH_MAGIC;
return true;
#endif
-/* end-sanitize-tic80 */
#ifdef ARMMAGIC
case bfd_arch_arm:
* magicp = ARMMAGIC;
case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
case bfd_mach_arm_4: * flagsp |= F_ARM_4; break;
case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
+ case bfd_mach_arm_5: * flagsp |= F_ARM_5; break;
+ case bfd_mach_arm_5T: * flagsp |= F_ARM_5; break; /* XXX - we do not have an F_ARM_5T */
}
return true;
#endif
break;
#endif
+#ifdef MCOREMAGIC
+ case bfd_arch_mcore:
+ * magicp = MCOREMAGIC;
+ return true;
+#endif
+
default: /* Unknown architecture */
/* return false; -- fall through to "return false" below, to avoid
"statement never reached" errors on the one below. */
#ifndef I960
#define ALIGN_SECTIONS_IN_FILE
#endif
-/* start-sanitize-tic80 */
#ifdef TIC80COFF
#undef ALIGN_SECTIONS_IN_FILE
#endif
-/* end-sanitize-tic80 */
static boolean
coff_compute_section_file_positions (abfd)
section.s_align = (current->alignment_power
? 1 << current->alignment_power
: 0);
-/* start-sanitize-tic80 */
#else
#ifdef TIC80COFF
section.s_flags |= (current->alignment_power & 0xF) << 8;
#endif
-/* end-sanitize-tic80 */
#endif
#ifdef COFF_IMAGE_WITH_PE
else
internal_f.f_flags |= F_AR32W;
-/* start-sanitize-tic80 */
#ifdef TIC80_TARGET_ID
internal_f.f_target_id = TIC80_TARGET_ID;
#endif
-/* end-sanitize-tic80 */
/*
FIXME, should do something about the other byte orders and
internal_a.magic = NMAGIC; /* Assume separate i/d */
#define __A_MAGIC_SET__
#endif /* A29K */
-/* start-sanitize-tic80 */
#ifdef TIC80COFF
internal_a.magic = TIC80_ARCH_MAGIC;
#define __A_MAGIC_SET__
#endif /* TIC80 */
-/* end-sanitize-tic80 */
#ifdef I860
/* FIXME: What are the a.out magic numbers for the i860? */
internal_a.magic = 0;
internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
#endif
+#if defined MCORE_PE
+#define __A_MAGIC_SET__
+ internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
+#endif
+
#if defined(I386)
#define __A_MAGIC_SET__
#if defined(LYNXOS)
if (! coff_write_relocs (abfd, firstundef))
return false;
}
+#ifdef COFF_LONG_SECTION_NAMES
+ else if (long_section_names)
+ {
+ /* If we have long section names we have to write out the string
+ table even if there are no symbols. */
+ if (! coff_write_symbols (abfd))
+ return false;
+ }
+#endif
#ifdef COFF_IMAGE_WITH_PE
#ifdef PPC_PE
else if ((abfd->flags & EXEC_P) != 0)
#endif
case C_EXT:
+ case C_WEAKEXT:
#if defined ARM
case C_THUMBEXT:
case C_THUMBEXTFUNC:
#ifdef COFF_WITH_PE
if (src->u.syment.n_sclass == C_NT_WEAK)
dst->symbol.flags = BSF_WEAK;
+ if (src->u.syment.n_sclass == C_SECTION
+ && src->u.syment.n_scnum > 0)
+ {
+ dst->symbol.flags = BSF_LOCAL;
+ }
#endif
+ if (src->u.syment.n_sclass == C_WEAKEXT)
+ dst->symbol.flags = BSF_WEAK;
+
break;
case C_STAT: /* static */
#endif
case C_REGPARM: /* register parameter */
case C_REG: /* register variable */
-/* start-sanitize-tic80 */
#ifndef TIC80COFF
-/* end-sanitize-tic80 */
#ifdef C_AUTOARG
case C_AUTOARG: /* 960-specific storage class */
#endif
-/* start-sanitize-tic80 */
#endif
-/* end-sanitize-tic80 */
case C_TPDEF: /* type definition */
case C_ARG:
case C_AUTO: /* automatic variable */
/* NT uses 0x67 for a weak symbol, not C_ALIAS. */
case C_ALIAS: /* duplicate tag */
#endif
-/* start-sanitize-tic80 */
/* New storage classes for TIc80 */
#ifdef TIC80COFF
case C_UEXT: /* Tentative external definition */
#endif
case C_STATLAB: /* Static load time label */
case C_EXTLAB: /* External load time label */
-/* end-sanitize-tic80 */
case C_HIDDEN: /* ext symbol in dmert public lib */
default:
(*_bfd_error_handler)
#endif
#ifndef coff_link_output_has_begun
-#define coff_link_output_has_begun _coff_link_output_has_begun
+
+static boolean coff_link_output_has_begun
+ PARAMS ((bfd *, struct coff_final_link_info *));
+
static boolean
-_coff_link_output_has_begun (abfd, info)
+coff_link_output_has_begun (abfd, info)
bfd * abfd;
- struct bfd_link_info * info;
+ struct coff_final_link_info * info;
{
return abfd->output_has_begun;
}
#endif
#ifndef coff_final_link_postscript
-#define coff_final_link_postscript _coff_final_link_postscript
+
+static boolean coff_final_link_postscript
+ PARAMS ((bfd *, struct coff_final_link_info *));
+
static boolean
-_coff_final_link_postscript (abfd, pfinfo)
+coff_final_link_postscript (abfd, pfinfo)
bfd * abfd;
struct coff_final_link_info * pfinfo;
{