#define DOT_DEBUG ".debug"
#define GNU_LINKONCE_WI ".gnu.linkonce.wi."
+#define GNU_LINKONCE_WT ".gnu.linkonce.wt."
#define DOT_RELOC ".reloc"
#if defined (COFF_LONG_SECTION_NAMES)
styp_flags = STYP_DEBUG_INFO;
}
#ifdef COFF_LONG_SECTION_NAMES
- else if (CONST_STRNEQ (sec_name, GNU_LINKONCE_WI))
+ else if (CONST_STRNEQ (sec_name, GNU_LINKONCE_WI)
+ || CONST_STRNEQ (sec_name, GNU_LINKONCE_WT))
{
styp_flags = STYP_DEBUG_INFO;
}
sec_to_styp_flags (const char *sec_name, flagword sec_flags)
{
long styp_flags = 0;
+ bfd_boolean is_dbg = FALSE;
+
+ if (CONST_STRNEQ (sec_name, DOT_DEBUG)
+#ifdef COFF_LONG_SECTION_NAMES
+ || CONST_STRNEQ (sec_name, GNU_LINKONCE_WI)
+ || CONST_STRNEQ (sec_name, GNU_LINKONCE_WT)
+#endif
+ || CONST_STRNEQ (sec_name, ".stab"))
+ is_dbg = TRUE;
/* caution: there are at least three groups of symbols that have
very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*.
but there are more IMAGE_SCN_* flags. */
/* FIXME: There is no gas syntax to specify the debug section flag. */
- if (CONST_STRNEQ (sec_name, DOT_DEBUG)
- || CONST_STRNEQ (sec_name, GNU_LINKONCE_WI))
- sec_flags = SEC_DEBUGGING | SEC_READONLY;
+ if (is_dbg)
+ sec_flags = SEC_DEBUGGING | SEC_READONLY;
/* skip LOAD */
/* READONLY later */
/* skip RELOC */
if ((sec_flags & SEC_CODE) != 0)
styp_flags |= IMAGE_SCN_CNT_CODE;
- if ((sec_flags & SEC_DATA) != 0)
+ if ((sec_flags & (SEC_DATA | SEC_DEBUGGING)) != 0)
styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA;
if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA; /* ==STYP_BSS */
styp_flags |= IMAGE_SCN_LNK_COMDAT;
if ((sec_flags & SEC_DEBUGGING) != 0)
styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
- if ((sec_flags & SEC_EXCLUDE) != 0)
+ if ((sec_flags & SEC_EXCLUDE) != 0 && !is_dbg)
styp_flags |= IMAGE_SCN_LNK_REMOVE;
- if ((sec_flags & SEC_NEVER_LOAD) != 0)
+ if ((sec_flags & SEC_NEVER_LOAD) != 0 && !is_dbg)
styp_flags |= IMAGE_SCN_LNK_REMOVE;
/* skip IN_MEMORY */
/* skip SORT */
#endif
#ifdef COFF_LONG_SECTION_NAMES
|| CONST_STRNEQ (name, GNU_LINKONCE_WI)
+ || CONST_STRNEQ (name, GNU_LINKONCE_WT)
#endif
|| CONST_STRNEQ (name, ".stab"))
{
if (! ((isym.n_sclass == C_STAT
|| isym.n_sclass == C_EXT)
- && isym.n_type == T_NULL
+ && BTYPE (isym.n_type) == T_NULL
&& isym.n_value == 0))
abort ();
long styp_flags = internal_s->s_flags;
flagword sec_flags;
bfd_boolean result = TRUE;
+ bfd_boolean is_dbg = FALSE;
+ if (CONST_STRNEQ (name, DOT_DEBUG)
+#ifdef COFF_LONG_SECTION_NAMES
+ || CONST_STRNEQ (name, GNU_LINKONCE_WI)
+ || CONST_STRNEQ (name, GNU_LINKONCE_WT)
+#endif
+ || CONST_STRNEQ (name, ".stab"))
+ is_dbg = TRUE;
/* Assume read only unless IMAGE_SCN_MEM_WRITE is specified. */
sec_flags = SEC_READONLY;
mean that a given section contains debug information. Thus
we only set the SEC_DEBUGGING flag on sections that we
recognise as containing debug information. */
- if (CONST_STRNEQ (name, DOT_DEBUG)
+ if (is_dbg
#ifdef _COMMENT
|| strcmp (name, _COMMENT) == 0
#endif
-#ifdef COFF_LONG_SECTION_NAMES
- || CONST_STRNEQ (name, GNU_LINKONCE_WI)
-#endif
- || CONST_STRNEQ (name, ".stab"))
- sec_flags |= SEC_DEBUGGING;
+ )
+ {
+ sec_flags |= SEC_DEBUGGING | SEC_READONLY;
+ }
break;
case IMAGE_SCN_MEM_SHARED:
sec_flags |= SEC_COFF_SHARED;
break;
case IMAGE_SCN_LNK_REMOVE:
- sec_flags |= SEC_EXCLUDE;
+ if (!is_dbg)
+ sec_flags |= SEC_EXCLUDE;
break;
case IMAGE_SCN_CNT_CODE:
sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
break;
case IMAGE_SCN_CNT_INITIALIZED_DATA:
- sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
+ if (is_dbg)
+ sec_flags |= SEC_DEBUGGING;
+ else
+ sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
break;
case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
sec_flags |= SEC_ALLOC;
machine = bfd_mach_m68020;
break;
#endif
-#ifdef MAXQ20MAGIC
- case MAXQ20MAGIC:
- arch = bfd_arch_maxq;
- switch (internal_f->f_flags & F_MACHMASK)
- {
- case F_MAXQ10:
- machine = bfd_mach_maxq10;
- break;
- case F_MAXQ20:
- machine = bfd_mach_maxq20;
- break;
- default:
- return FALSE;
- }
- break;
-#endif
#ifdef MC88MAGIC
case MC88MAGIC:
case MC88DMAGIC:
return TRUE;
#endif
-#ifdef MAXQ20MAGIC
- case bfd_arch_maxq:
- * magicp = MAXQ20MAGIC;
- switch (bfd_get_mach (abfd))
- {
- case bfd_mach_maxq10: * flagsp = F_MAXQ10; return TRUE;
- case bfd_mach_maxq20: * flagsp = F_MAXQ20; return TRUE;
- default: return FALSE;
- }
-#endif
-
default: /* Unknown architecture. */
/* Fall through to "return FALSE" below, to avoid
"statement never reached" errors on the one below. */
internal_a.magic = NMAGIC; /* Assume separate i/d. */
#endif
-#ifdef MAXQ20MAGIC
-#define __A_MAGIC_SET__
- internal_a.magic = MAXQ20MAGIC;
-#endif
-
#ifndef __A_MAGIC_SET__
#include "Your aouthdr magic number is not being set!"
#else
{
(*_bfd_error_handler)
(_("%B: warning: illegal symbol index %ld in line numbers"),
- abfd, dst.l_addr.l_symndx);
+ abfd, (long) symndx);
symndx = 0;
warned = TRUE;
}
to the symbol instead of the index. FIXME: This
should use a union. */
src->u.syment.n_value =
- (long) (native_symbols + src->u.syment.n_value);
+ (long) (intptr_t) (native_symbols + src->u.syment.n_value);
dst->symbol.value = src->u.syment.n_value;
src->fix_value = 1;
break;
{
(*_bfd_error_handler)
(_("%B: warning: illegal symbol index %ld in relocs"),
- abfd, dst.r_symndx);
+ abfd, (long) dst.r_symndx);
cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
ptr = NULL;
}