merge from gcc
[deliverable/binutils-gdb.git] / bfd / coffcode.h
index 05eba024bf1e9a2d5f960408866add249d049c97..7ce60db76c1c308ca80c7be5e8c4f27316641be5 100644 (file)
@@ -1,5 +1,6 @@
 /* Support for the generic parts of most COFF variants, for BFD.
-   Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+   2000, 2001, 2002
    Free Software Foundation, Inc.
    Written by Cygnus Support.
 
@@ -247,39 +248,37 @@ CODE_FRAGMENT
 .
 .typedef struct coff_ptr_struct
 .{
+.  {* Remembers the offset from the first symbol in the file for
+.     this symbol. Generated by coff_renumber_symbols. *}
+.  unsigned int offset;
 .
-.       {* Remembers the offset from the first symbol in the file for
-.          this symbol. Generated by coff_renumber_symbols. *}
-.unsigned int offset;
+.  {* Should the value of this symbol be renumbered.  Used for
+.     XCOFF C_BSTAT symbols.  Set by coff_slurp_symbol_table.  *}
+.  unsigned int fix_value : 1;
 .
-.       {* Should the value of this symbol be renumbered.  Used for
-.          XCOFF C_BSTAT symbols.  Set by coff_slurp_symbol_table.  *}
-.unsigned int fix_value : 1;
+.  {* Should the tag field of this symbol be renumbered.
+.     Created by coff_pointerize_aux. *}
+.  unsigned int fix_tag : 1;
 .
-.       {* Should the tag field of this symbol be renumbered.
-.          Created by coff_pointerize_aux. *}
-.unsigned int fix_tag : 1;
+.  {* Should the endidx field of this symbol be renumbered.
+.     Created by coff_pointerize_aux. *}
+.  unsigned int fix_end : 1;
 .
-.       {* Should the endidx field of this symbol be renumbered.
-.          Created by coff_pointerize_aux. *}
-.unsigned int fix_end : 1;
+.  {* Should the x_csect.x_scnlen field be renumbered.
+.     Created by coff_pointerize_aux. *}
+.  unsigned int fix_scnlen : 1;
 .
-.       {* Should the x_csect.x_scnlen field be renumbered.
-.          Created by coff_pointerize_aux. *}
-.unsigned int fix_scnlen : 1;
+.  {* Fix up an XCOFF C_BINCL/C_EINCL symbol.  The value is the
+.     index into the line number entries.  Set by coff_slurp_symbol_table.  *}
+.  unsigned int fix_line : 1;
 .
-.       {* Fix up an XCOFF C_BINCL/C_EINCL symbol.  The value is the
-.          index into the line number entries.  Set by
-.          coff_slurp_symbol_table.  *}
-.unsigned int fix_line : 1;
-.
-.       {* The container for the symbol structure as read and translated
-.           from the file. *}
-.
-.union {
-.   union internal_auxent auxent;
-.   struct internal_syment syment;
-. } u;
+.  {* The container for the symbol structure as read and translated
+.     from the file. *}
+.  union
+.  {
+.    union internal_auxent auxent;
+.    struct internal_syment syment;
+.  } u;
 .} combined_entry_type;
 .
 .
@@ -287,17 +286,17 @@ CODE_FRAGMENT
 .
 .typedef struct coff_symbol_struct
 .{
-.   {* The actual symbol which the rest of BFD works with *}
-.asymbol symbol;
+.  {* The actual symbol which the rest of BFD works with *}
+.  asymbol symbol;
 .
-.   {* A pointer to the hidden information for this symbol *}
-.combined_entry_type *native;
+.  {* A pointer to the hidden information for this symbol *}
+.  combined_entry_type *native;
 .
-.   {* A pointer to the linenumber information for this symbol *}
-.struct lineno_cache_entry *lineno;
+.  {* A pointer to the linenumber information for this symbol *}
+.  struct lineno_cache_entry *lineno;
 .
-.   {* Have the line numbers been relocated yet ? *}
-.boolean done_lineno;
+.  {* Have the line numbers been relocated yet ? *}
+.  bfd_boolean done_lineno;
 .} coff_symbol_type;
 
 */
@@ -310,34 +309,58 @@ CODE_FRAGMENT
 
 #define STRING_SIZE_SIZE (4)
 
-static long sec_to_styp_flags PARAMS ((const char *, flagword));
-static flagword styp_to_sec_flags
-  PARAMS ((bfd *, PTR, const char *, asection *));
-static boolean coff_bad_format_hook PARAMS ((bfd *, PTR));
+static long sec_to_styp_flags
+  PARAMS ((const char *, flagword));
+static bfd_boolean styp_to_sec_flags
+  PARAMS ((bfd *, PTR, const char *, asection *, flagword *));
+static bfd_boolean coff_bad_format_hook
+  PARAMS ((bfd *, PTR));
 static void coff_set_custom_section_alignment
   PARAMS ((bfd *, asection *, const struct coff_section_alignment_entry *,
           const unsigned int));
-static boolean coff_new_section_hook PARAMS ((bfd *, asection *));
-static boolean coff_set_arch_mach_hook PARAMS ((bfd *, PTR));
-static boolean coff_write_relocs PARAMS ((bfd *, int));
-static boolean coff_set_flags
+static bfd_boolean coff_new_section_hook
+  PARAMS ((bfd *, asection *));
+static bfd_boolean coff_set_arch_mach_hook
+  PARAMS ((bfd *, PTR));
+static bfd_boolean coff_write_relocs
+  PARAMS ((bfd *, int));
+static bfd_boolean coff_set_flags
   PARAMS ((bfd *, unsigned int *, unsigned short *));
-static boolean coff_set_arch_mach
-  PARAMS ((bfd *, enum bfd_architecture, unsigned long));
-static boolean coff_compute_section_file_positions PARAMS ((bfd *));
-static boolean coff_write_object_contents PARAMS ((bfd *));
-static boolean coff_set_section_contents
+static bfd_boolean coff_set_arch_mach
+  PARAMS ((bfd *, enum bfd_architecture, unsigned long)) ATTRIBUTE_UNUSED;
+static bfd_boolean coff_compute_section_file_positions
+  PARAMS ((bfd *));
+static bfd_boolean coff_write_object_contents
+  PARAMS ((bfd *)) ATTRIBUTE_UNUSED;
+static bfd_boolean coff_set_section_contents
   PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
-static PTR buy_and_read PARAMS ((bfd *, file_ptr, int, size_t));
-static boolean coff_slurp_line_table PARAMS ((bfd *, asection *));
-static boolean coff_slurp_symbol_table PARAMS ((bfd *));
+static PTR buy_and_read
+  PARAMS ((bfd *, file_ptr, bfd_size_type));
+static bfd_boolean coff_slurp_line_table
+  PARAMS ((bfd *, asection *));
+static bfd_boolean coff_slurp_symbol_table
+  PARAMS ((bfd *));
 static enum coff_symbol_classification coff_classify_symbol
   PARAMS ((bfd *, struct internal_syment *));
-static boolean coff_slurp_reloc_table PARAMS ((bfd *, asection *, asymbol **));
+static bfd_boolean coff_slurp_reloc_table
+  PARAMS ((bfd *, asection *, asymbol **));
 static long coff_canonicalize_reloc
   PARAMS ((bfd *, asection *, arelent **, asymbol **));
 #ifndef coff_mkobject_hook
-static PTR coff_mkobject_hook PARAMS ((bfd *, PTR,  PTR));
+static PTR coff_mkobject_hook
+  PARAMS ((bfd *, PTR,  PTR));
+#endif
+#ifdef COFF_WITH_PE
+static flagword handle_COMDAT
+  PARAMS ((bfd *, flagword, PTR, const char *, asection *));
+#endif
+#ifdef COFF_IMAGE_WITH_PE
+static bfd_boolean coff_read_word
+  PARAMS ((bfd *, unsigned int *));
+static unsigned int coff_compute_checksum
+  PARAMS ((bfd *));
+static bfd_boolean coff_apply_checksum
+  PARAMS ((bfd *));
 #endif
 \f
 /* void warning(); */
@@ -364,7 +387,7 @@ static PTR coff_mkobject_hook PARAMS ((bfd *, PTR,  PTR));
 
 static long
 sec_to_styp_flags (sec_name, sec_flags)
-     CONST char *sec_name;
+     const char *sec_name;
      flagword sec_flags;
 {
   long styp_flags = 0;
@@ -426,6 +449,14 @@ sec_to_styp_flags (sec_name, sec_flags)
     {
       styp_flags = STYP_LOADER;
     }
+  else if (!strcmp (sec_name, _EXCEPT))
+    {
+      styp_flags = STYP_EXCEPT;
+    }
+  else if (!strcmp (sec_name, _TYPCHK))
+    {
+      styp_flags = STYP_TYPCHK;
+    }
 #endif
   /* Try and figure out what it should be */
   else if (sec_flags & SEC_CODE)
@@ -504,7 +535,7 @@ sec_to_styp_flags (sec_name, sec_flags)
   if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
     styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA;  /* ==STYP_BSS */
   /* skip ROM */
-  /* skip CONSTRUCTOR */
+  /* skip constRUCTOR */
   /* skip CONTENTS */
 #ifdef STYP_NOLOAD
   if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
@@ -549,12 +580,13 @@ sec_to_styp_flags (sec_name, sec_flags)
 
 #ifndef COFF_WITH_PE
 
-static flagword
-styp_to_sec_flags (abfd, hdr, name, section)
+static bfd_boolean
+styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
      bfd *abfd ATTRIBUTE_UNUSED;
      PTR hdr;
      const char *name;
      asection *section ATTRIBUTE_UNUSED;
+     flagword *flags_ptr;
 {
   struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
   long styp_flags = internal_s->s_flags;
@@ -562,19 +594,17 @@ styp_to_sec_flags (abfd, hdr, name, section)
 
 #ifdef STYP_BLOCK
   if (styp_flags & STYP_BLOCK)
-      sec_flags |= SEC_BLOCK;
+    sec_flags |= SEC_BLOCK;
 #endif
 
 #ifdef STYP_CLINK
   if (styp_flags & STYP_CLINK)
-      sec_flags |= SEC_CLINK;
+    sec_flags |= SEC_CLINK;
 #endif
 
 #ifdef STYP_NOLOAD
   if (styp_flags & STYP_NOLOAD)
-    {
-      sec_flags |= SEC_NEVER_LOAD;
-    }
+    sec_flags |= SEC_NEVER_LOAD;
 #endif /* STYP_NOLOAD */
 
   /* For 386 COFF, at least, an unloadable text or data section is
@@ -615,9 +645,7 @@ styp_to_sec_flags (abfd, hdr, name, section)
 #endif
     }
   else if (styp_flags & STYP_PAD)
-    {
-      sec_flags = 0;
-    }
+    sec_flags = 0;
   else if (strcmp (name, _TEXT) == 0)
     {
       if (sec_flags & SEC_NEVER_LOAD)
@@ -660,26 +688,19 @@ styp_to_sec_flags (abfd, hdr, name, section)
 #endif
 #ifdef _LIT
   else if (strcmp (name, _LIT) == 0)
-    {
-      sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
-    }
+    sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
 #endif
   else
-    {
-      sec_flags |= SEC_ALLOC | SEC_LOAD;
-    }
+    sec_flags |= SEC_ALLOC | SEC_LOAD;
 
 #ifdef STYP_LIT                        /* A29k readonly text/data section type */
   if ((styp_flags & STYP_LIT) == STYP_LIT)
-    {
-      sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
-    }
+    sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
 #endif /* STYP_LIT */
+
 #ifdef STYP_OTHER_LOAD         /* Other loaded sections */
   if (styp_flags & STYP_OTHER_LOAD)
-    {
-      sec_flags = (SEC_LOAD | SEC_ALLOC);
-    }
+    sec_flags = (SEC_LOAD | SEC_ALLOC);
 #endif /* STYP_SDATA */
 
 #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
@@ -693,333 +714,394 @@ styp_to_sec_flags (abfd, hdr, name, section)
     sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
 #endif
 
-  return sec_flags;
+  if (flags_ptr == NULL)
+    return FALSE;
+
+  * flags_ptr = sec_flags;
+  return TRUE;
 }
 
 #else /* COFF_WITH_PE */
 
-/* The PE version; see above for the general comments.
-
-   Since to set the SEC_LINK_ONCE and associated flags, we have to
-   look at the symbol table anyway, we return the symbol table index
-   of the symbol being used as the COMDAT symbol.  This is admittedly
-   ugly, but there's really nowhere else that we have access to the
-   required information.  FIXME: Is the COMDAT symbol index used for
-   any purpose other than objdump?  */
-
 static flagword
-styp_to_sec_flags (abfd, hdr, name, section)
-     bfd *abfd ATTRIBUTE_UNUSED;
+handle_COMDAT (abfd, sec_flags, hdr, name, section)
+     bfd * abfd;
+     flagword sec_flags;
      PTR hdr;
      const char *name;
      asection *section;
 {
   struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
-  long styp_flags = internal_s->s_flags;
-  flagword sec_flags = 0;
+  bfd_byte *esymstart, *esym, *esymend;
+  int seen_state = 0;
+  char *target_name = NULL;
 
-  if (styp_flags & STYP_DSECT)
-    abort ();  /* Don't know what to do */
-#ifdef SEC_NEVER_LOAD
-  if (styp_flags & STYP_NOLOAD)
-    sec_flags |= SEC_NEVER_LOAD;
-#endif
-  if (styp_flags & STYP_GROUP)
-    abort ();  /* Don't know what to do */
-  /* skip IMAGE_SCN_TYPE_NO_PAD */
-  if (styp_flags & STYP_COPY)
-    abort ();  /* Don't know what to do */
-  if (styp_flags & IMAGE_SCN_CNT_CODE)
-    sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
-  if (styp_flags & IMAGE_SCN_CNT_INITIALIZED_DATA)
-    sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
-  if (styp_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
-    sec_flags |= SEC_ALLOC;
-  if (styp_flags & IMAGE_SCN_LNK_OTHER)
-    abort ();  /* Don't know what to do */
-  if (styp_flags & IMAGE_SCN_LNK_INFO)
-    {
-      /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
-        defined.  coff_compute_section_file_positions uses
-        COFF_PAGE_SIZE to ensure that the low order bits of the
-        section VMA and the file offset match.  If we don't know
-        COFF_PAGE_SIZE, we can't ensure the correct correspondence,
-        and demand page loading of the file will fail.  */
-#ifdef COFF_PAGE_SIZE
-      sec_flags |= SEC_DEBUGGING;
-#endif
-    }
-  if (styp_flags & STYP_OVER)
-    abort ();  /* Don't know what to do */
-  if (styp_flags & IMAGE_SCN_LNK_REMOVE)
-    sec_flags |= SEC_EXCLUDE;
-
-  if (styp_flags & IMAGE_SCN_MEM_SHARED)
-    sec_flags |= SEC_SHARED;
-  /* COMDAT: see below */
-  if (styp_flags & IMAGE_SCN_MEM_DISCARDABLE)
-    sec_flags |= SEC_DEBUGGING;
-  if (styp_flags & IMAGE_SCN_MEM_NOT_CACHED)
-    abort ();/* Don't know what to do */
-  if (styp_flags & IMAGE_SCN_MEM_NOT_PAGED)
-    abort (); /* Don't know what to do */
-
-  /* We infer from the distinct read/write/execute bits the settings
-     of some of the bfd flags; the actual values, should we need them,
-     are also in pei_section_data (abfd, section)->pe_flags.  */
-
-  if (styp_flags & IMAGE_SCN_MEM_EXECUTE)
-    sec_flags |= SEC_CODE;   /* Probably redundant */
-  /* IMAGE_SCN_MEM_READ is simply ignored, assuming it always to be true.  */
-  if ((styp_flags & IMAGE_SCN_MEM_WRITE) == 0)
-    sec_flags |= SEC_READONLY;
-
-  /* COMDAT gets very special treatment.  */
-  if (styp_flags & IMAGE_SCN_LNK_COMDAT)
+  sec_flags |= SEC_LINK_ONCE;
+
+  /* Unfortunately, the PE format stores essential information in
+     the symbol table, of all places.  We need to extract that
+     information now, so that objdump and the linker will know how
+     to handle the section without worrying about the symbols.  We
+     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 */
+
+  /* This is not mirrored in sec_to_styp_flags(), but there
+     doesn't seem to be a need to, either, and it would at best be
+     rather messy.  */
+
+  if (! _bfd_coff_get_external_symbols (abfd))
+    return sec_flags;
+
+  esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
+  esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
+
+  while (esym < esymend)
     {
-      sec_flags |= SEC_LINK_ONCE;
-
-      /* Unfortunately, the PE format stores essential information in
-         the symbol table, of all places.  We need to extract that
-         information now, so that objdump and the linker will know how
-         to handle the section without worrying about the symbols.  We
-         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 */
-
-      /* This is not mirrored in sec_to_styp_flags(), but there
-        doesn't seem to be a need to, either, and it would at best be
-        rather messy.  */
-
-      if (_bfd_coff_get_external_symbols (abfd))
+      struct internal_syment isym;
+      char buf[SYMNMLEN + 1];
+      const char *symname;
+
+      bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
+
+      if (sizeof (internal_s->s_name) > SYMNMLEN)
        {
-         bfd_byte *esymstart, *esym, *esymend;
-         int seen_state = 0;
-         char *target_name = NULL;
+         /* This case implies that the matching
+            symbol name will be in the string table.  */
+         abort ();
+       }
 
-         esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
-         esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
+      if (isym.n_scnum == section->target_index)
+       {
+         /* According to the MSVC documentation, the first
+            TWO entries with the section # are both of
+            interest to us.  The first one is the "section
+            symbol" (section name).  The second is the comdat
+            symbol name.  Here, we've found the first
+            qualifying entry; we distinguish it from the
+            second with a state flag.
+
+            In the case of gas-generated (at least until that
+            is fixed) .o files, it isn't necessarily the
+            second one.  It may be some other later symbol.
+
+            Since gas also doesn't follow MS conventions and
+            emits the section similar to .text$<name>, where
+            <something> is the name we're looking for, we
+            distinguish the two as follows:
+
+            If the section name is simply a section name (no
+            $) we presume it's MS-generated, and look at
+            precisely the second symbol for the comdat name.
+            If the section name has a $, we assume it's
+            gas-generated, and look for <something> (whatever
+            follows the $) as the comdat symbol.  */
+
+         /* All 3 branches use this */
+         symname = _bfd_coff_internal_syment_name (abfd, &isym, buf);
+
+         if (symname == NULL)
+           abort ();
 
-         while (esym < esymend)
+         switch (seen_state)
            {
-             struct internal_syment isym;
-             char buf[SYMNMLEN + 1];
-             const char *symname;
+           case 0:
+             {
+               /* The first time we've seen the symbol.  */
+               union internal_auxent aux;
+
+               seen_state = 1;
+
+               /* If it isn't the stuff we're expecting, die;
+                  The MS documentation is vague, but it
+                  appears that the second entry serves BOTH
+                  as the comdat symbol and the defining
+                  symbol record (either C_STAT or C_EXT,
+                  possibly with an aux entry with debug
+                  information if it's a function.)  It
+                  appears the only way to find the second one
+                  is to count.  (On Intel, they appear to be
+                  adjacent, but on Alpha, they have been
+                  found separated.)
+
+                  Here, we think we've found the first one,
+                  but there's some checking we can do to be
+                  sure.  */
+
+               if (! (isym.n_sclass == C_STAT
+                      && isym.n_type == T_NULL
+                      && isym.n_value == 0))
+                 abort ();
 
-             bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
+               /* FIXME LATER: MSVC generates section names
+                  like .text for comdats.  Gas generates
+                  names like .text$foo__Fv (in the case of a
+                  function).  See comment above for more.  */
 
-             if (sizeof (internal_s->s_name) > SYMNMLEN)
-               {
-                 /* This case implies that the matching symbol name
-                     will be in the string table.  */
+               if (strcmp (name, symname) != 0)
                  abort ();
-               }
 
-             if (isym.n_scnum == section->target_index)
-               {
-                 /* According to the MSVC documentation, the first
-                    TWO entries with the section # are both of
-                    interest to us.  The first one is the "section
-                    symbol" (section name).  The second is the comdat
-                    symbol name.  Here, we've found the first
-                    qualifying entry; we distinguish it from the
-                    second with a state flag.
-
-                    In the case of gas-generated (at least until that
-                    is fixed) .o files, it isn't necessarily the
-                    second one.  It may be some other later symbol.
-
-                    Since gas also doesn't follow MS conventions and
-                    emits the section similar to .text$<name>, where
-                    <something> is the name we're looking for, we
-                    distinguish the two as follows:
-
-                    If the section name is simply a section name (no
-                    $) we presume it's MS-generated, and look at
-                    precisely the second symbol for the comdat name.
-                    If the section name has a $, we assume it's
-                    gas-generated, and look for <something> (whatever
-                    follows the $) as the comdat symbol.  */
-
-                 /* All 3 branches use this */
-                 symname = _bfd_coff_internal_syment_name (abfd, &isym, buf);
-
-                 if (symname == NULL)
-                   abort ();
-
-                 switch (seen_state)
-                   {
-                   case 0:
-                     {
-                       /* The first time we've seen the symbol.  */
-                       union internal_auxent aux;
-
-                       seen_state = 1;
-
-                       /* If it isn't the stuff we're expecting, die;
-                          The MS documentation is vague, but it
-                          appears that the second entry serves BOTH
-                          as the comdat symbol and the defining
-                          symbol record (either C_STAT or C_EXT,
-                          possibly with an aux entry with debug
-                          information if it's a function.)  It
-                          appears the only way to find the second one
-                          is to count.  (On Intel, they appear to be
-                          adjacent, but on Alpha, they have been
-                          found separated.)
-
-                          Here, we think we've found the first one,
-                          but there's some checking we can do to be
-                          sure.  */
-
-                       if (! (isym.n_sclass == C_STAT
-                              && isym.n_type == T_NULL
-                              && isym.n_value == 0))
-                         abort ();
-
-                       /* FIXME LATER: MSVC generates section names
-                          like .text for comdats.  Gas generates
-                          names like .text$foo__Fv (in the case of a
-                          function).  See comment above for more.  */
-
-                       if (strcmp (name, symname) != 0)
-                         abort ();
-
-                       /* This is the section symbol.  */
-
-                       bfd_coff_swap_aux_in (abfd, (PTR) (esym + bfd_coff_symesz (abfd)),
-                                             isym.n_type, isym.n_sclass,
-                                             0, isym.n_numaux, (PTR) &aux);
-
-                       target_name = strchr (name, '$');
-                       if (target_name != NULL)
-                         {
-                           /* Gas mode.  */
-                           seen_state = 2;
-                           /* Skip the `$'.  */
-                           target_name += 1;
-                         }
-
-                       /* 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.  */
-
-                       /* Cygwin does not follow the MS style, and
-                          uses ANY and SAME_SIZE where NODUPLICATES
-                          and ASSOCIATIVE should be used.  For
-                          Interix, we just do the right thing up
-                          front.  */
-
-                       switch (aux.x_scn.x_comdat)
-                         {
-                         case IMAGE_COMDAT_SELECT_NODUPLICATES:
+               /* This is the section symbol.  */
+               bfd_coff_swap_aux_in (abfd, (PTR) (esym + bfd_coff_symesz (abfd)),
+                                     isym.n_type, isym.n_sclass,
+                                     0, isym.n_numaux, (PTR) &aux);
+
+               target_name = strchr (name, '$');
+               if (target_name != NULL)
+                 {
+                   /* Gas mode.  */
+                   seen_state = 2;
+                   /* Skip the `$'.  */
+                   target_name += 1;
+                 }
+
+               /* 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.  */
+
+               /* Cygwin does not follow the MS style, and
+                  uses ANY and SAME_SIZE where NODUPLICATES
+                  and ASSOCIATIVE should be used.  For
+                  Interix, we just do the right thing up
+                  front.  */
+
+               switch (aux.x_scn.x_comdat)
+                 {
+                 case IMAGE_COMDAT_SELECT_NODUPLICATES:
 #ifdef STRICT_PE_FORMAT
-                           sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
+                   sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
 #else
-                           sec_flags &= ~SEC_LINK_ONCE;
+                   sec_flags &= ~SEC_LINK_ONCE;
 #endif
-                           break;
+                   break;
 
-                         case IMAGE_COMDAT_SELECT_ANY:
-                           sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
-                           break;
+                 case IMAGE_COMDAT_SELECT_ANY:
+                   sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
+                   break;
 
-                         case IMAGE_COMDAT_SELECT_SAME_SIZE:
-                           sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
-                           break;
+                 case IMAGE_COMDAT_SELECT_SAME_SIZE:
+                   sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
+                   break;
 
-                         case IMAGE_COMDAT_SELECT_EXACT_MATCH:
-                           /* Not yet fully implemented ??? */
-                           sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
-                           break;
+                 case IMAGE_COMDAT_SELECT_EXACT_MATCH:
+                   /* Not yet fully implemented ??? */
+                   sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
+                   break;
 
-                         /* debug$S gets this case; other
-                             implications ??? */
+                   /* debug$S gets this case; other
+                      implications ??? */
 
-                         /* There may be no symbol... we'll search
-                            the whole table... Is this the right
-                            place to play this game? Or should we do
-                            it when reading it in.  */
-                         case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
+                   /* There may be no symbol... we'll search
+                      the whole table... Is this the right
+                      place to play this game? Or should we do
+                      it when reading it in.  */
+                 case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
 #ifdef STRICT_PE_FORMAT
-                           /* FIXME: This is not currently implemented.  */
-                           sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
+                   /* FIXME: This is not currently implemented.  */
+                   sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
 #else
-                           sec_flags &= ~SEC_LINK_ONCE;
+                   sec_flags &= ~SEC_LINK_ONCE;
 #endif
-                           break;
+                   break;
 
-                         default:  /* 0 means "no symbol" */
-                           /* debug$F gets this case; other
-                               implications ??? */
-                           sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
-                           break;
-                         }
-                     }
-                     break;
+                 default:  /* 0 means "no symbol" */
+                   /* debug$F gets this case; other
+                      implications ??? */
+                   sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
+                   break;
+                 }
+             }
+             break;
 
-                   case 2:
-                     /* Gas mode: the first matching on partial name.  */
+           case 2:
+             /* Gas mode: the first matching on partial name.  */
 
 #ifndef TARGET_UNDERSCORE
 #define TARGET_UNDERSCORE 0
 #endif
-                     /* Is this the name we're looking for? */
-                     if (strcmp (target_name,
-                                 symname + (TARGET_UNDERSCORE ? 1 : 0)) != 0)
-                       {
-                           /* Not the name we're looking for */
-                           esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
-                           continue;
-                       }
-                     /* Fall through.  */
-                   case 1:
-                     /* MSVC mode: the lexically second symbol (or
-                        drop through from the above).  */
-                     {
-                       char *newname;
-
-                       /* This must the the second symbol with the
-                          section #.  It is the actual symbol name.
-                          Intel puts the two adjacent, but Alpha (at
-                          least) spreads them out.  */
-
-                       section->comdat =
-                         bfd_alloc (abfd, sizeof (struct bfd_comdat_info));
-                       if (section->comdat == NULL)
-                         abort ();
-                       section->comdat->symbol =
-                         (esym - esymstart) / bfd_coff_symesz (abfd);
-
-                       newname = bfd_alloc (abfd, strlen (symname) + 1);
-                       if (newname == NULL)
-                         abort ();
-
-                       strcpy (newname, symname);
-                       section->comdat->name = newname;
-
-                     }
-
-                     goto breakloop;
-                   }
+             /* Is this the name we're looking for? */
+             if (strcmp (target_name,
+                         symname + (TARGET_UNDERSCORE ? 1 : 0)) != 0)
+               {
+                 /* Not the name we're looking for */
+                 esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
+                 continue;
                }
+             /* Fall through.  */
+           case 1:
+             /* MSVC mode: the lexically second symbol (or
+                drop through from the above).  */
+             {
+               char *newname;
+               bfd_size_type amt;
+
+               /* This must the second symbol with the
+                  section #.  It is the actual symbol name.
+                  Intel puts the two adjacent, but Alpha (at
+                  least) spreads them out.  */
+
+               amt = sizeof (struct bfd_comdat_info);
+               section->comdat = bfd_alloc (abfd, amt);
+               if (section->comdat == NULL)
+                 abort ();
+
+               section->comdat->symbol =
+                 (esym - esymstart) / bfd_coff_symesz (abfd);
 
-             esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
+               amt = strlen (symname) + 1;
+               newname = bfd_alloc (abfd, amt);
+               if (newname == NULL)
+                 abort ();
+
+               strcpy (newname, symname);
+               section->comdat->name = newname;
+             }
+
+             goto breakloop;
            }
-       breakloop:
-         /* SunOS requires a statement after any label.  */
-         ;
+       }
+
+      esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
+    }
+
+ breakloop:
+  return sec_flags;
+}
+
+
+/* The PE version; see above for the general comments.
+
+   Since to set the SEC_LINK_ONCE and associated flags, we have to
+   look at the symbol table anyway, we return the symbol table index
+   of the symbol being used as the COMDAT symbol.  This is admittedly
+   ugly, but there's really nowhere else that we have access to the
+   required information.  FIXME: Is the COMDAT symbol index used for
+   any purpose other than objdump?  */
+
+static bfd_boolean
+styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
+     bfd *abfd;
+     PTR hdr;
+     const char *name;
+     asection *section;
+     flagword *flags_ptr;
+{
+  struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
+  long styp_flags = internal_s->s_flags;
+  flagword sec_flags;
+  bfd_boolean result = TRUE;
+
+  /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified.  */
+  sec_flags = SEC_READONLY;
+
+  /* Process each flag bit in styp_flags in turn.  */
+  while (styp_flags)
+    {
+      long flag = styp_flags & - styp_flags;
+      char * unhandled = NULL;
+
+      styp_flags &= ~ flag;
+
+      /* We infer from the distinct read/write/execute bits the settings
+        of some of the bfd flags; the actual values, should we need them,
+        are also in pei_section_data (abfd, section)->pe_flags.  */
+
+      switch (flag)
+       {
+       case STYP_DSECT:
+         unhandled = "STYP_DSECT";
+         break;
+       case STYP_GROUP:
+         unhandled = "STYP_GROUP";
+         break;
+       case STYP_COPY:
+         unhandled = "STYP_COPY";
+         break;
+       case STYP_OVER:
+         unhandled = "STYP_OVER";
+         break;
+#ifdef SEC_NEVER_LOAD
+       case STYP_NOLOAD:
+         sec_flags |= SEC_NEVER_LOAD;
+         break;
+#endif
+       case IMAGE_SCN_MEM_READ:
+         /* Ignored, assume it always to be true.  */
+         break;
+       case IMAGE_SCN_TYPE_NO_PAD:
+         /* Skip.  */
+         break;
+       case IMAGE_SCN_LNK_OTHER:
+         unhandled = "IMAGE_SCN_LNK_OTHER";
+         break;
+       case IMAGE_SCN_MEM_NOT_CACHED:
+         unhandled = "IMAGE_SCN_MEM_NOT_CACHED";
+         break;
+       case IMAGE_SCN_MEM_NOT_PAGED:
+         unhandled = "IMAGE_SCN_MEM_NOT_PAGED";
+         break;
+       case IMAGE_SCN_MEM_EXECUTE:
+         sec_flags |= SEC_CODE;
+         break;
+       case IMAGE_SCN_MEM_WRITE:
+         sec_flags &= ~ SEC_READONLY;
+         break;
+       case IMAGE_SCN_MEM_DISCARDABLE:
+         sec_flags |= SEC_DEBUGGING;
+         break;
+       case IMAGE_SCN_MEM_SHARED:
+         sec_flags |= SEC_SHARED;
+         break;
+       case IMAGE_SCN_LNK_REMOVE:
+         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;
+         break;
+       case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
+         sec_flags |= SEC_ALLOC;
+         break;
+       case IMAGE_SCN_LNK_INFO:
+         /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
+            defined.  coff_compute_section_file_positions uses
+            COFF_PAGE_SIZE to ensure that the low order bits of the
+            section VMA and the file offset match.  If we don't know
+            COFF_PAGE_SIZE, we can't ensure the correct correspondence,
+            and demand page loading of the file will fail.  */
+#ifdef COFF_PAGE_SIZE
+         sec_flags |= SEC_DEBUGGING;
+#endif
+         break;
+       case IMAGE_SCN_LNK_COMDAT:
+         /* COMDAT gets very special treatment.  */
+         sec_flags = handle_COMDAT (abfd, sec_flags, hdr, name, section);
+         break;
+       default:
+         /* Silently ignore for now.  */
+         break;
+       }
+
+      /* If the section flag was not handled, report it here.  */
+      if (unhandled != NULL)
+       {
+         (*_bfd_error_handler)
+           (_("%s (%s): Section flag %s (0x%x) ignored"),
+            bfd_archive_filename (abfd), name, unhandled, flag);
+         result = FALSE;
        }
     }
 
@@ -1034,7 +1116,10 @@ styp_to_sec_flags (abfd, hdr, name, section)
     sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
 #endif
 
-  return sec_flags;
+  if (flags_ptr)
+    * flags_ptr = sec_flags;
+
+  return result;
 }
 
 #endif /* COFF_WITH_PE */
@@ -1066,234 +1151,166 @@ CODE_FRAGMENT
 Special entry points for gdb to swap in coff symbol table parts:
 .typedef struct
 .{
-.  void (*_bfd_coff_swap_aux_in) PARAMS ((
-.       bfd            *abfd,
-.       PTR             ext,
-.       int             type,
-.       int             class,
-.       int             indaux,
-.       int             numaux,
-.       PTR             in));
+.  void (*_bfd_coff_swap_aux_in)
+.    PARAMS ((bfd *, PTR, int, int, int, int, PTR));
 .
-.  void (*_bfd_coff_swap_sym_in) PARAMS ((
-.       bfd            *abfd ,
-.       PTR             ext,
-.       PTR             in));
+.  void (*_bfd_coff_swap_sym_in)
+.    PARAMS ((bfd *, PTR, PTR));
 .
-.  void (*_bfd_coff_swap_lineno_in) PARAMS ((
-.       bfd            *abfd,
-.       PTR            ext,
-.       PTR             in));
+.  void (*_bfd_coff_swap_lineno_in)
+.    PARAMS ((bfd *, PTR, PTR));
 .
-
-Special entry points for gas to swap out coff parts:
-
-. unsigned int (*_bfd_coff_swap_aux_out) PARAMS ((
-.       bfd    *abfd,
-.       PTR    in,
-.       int            type,
-.       int            class,
-.       int     indaux,
-.       int     numaux,
-.       PTR            ext));
+.  unsigned int (*_bfd_coff_swap_aux_out)
+.    PARAMS ((bfd *, PTR, int, int, int, int, PTR));
 .
-. unsigned int (*_bfd_coff_swap_sym_out) PARAMS ((
-.      bfd      *abfd,
-.      PTR     in,
-.      PTR     ext));
+.  unsigned int (*_bfd_coff_swap_sym_out)
+.    PARAMS ((bfd *, PTR, PTR));
 .
-. unsigned int (*_bfd_coff_swap_lineno_out) PARAMS ((
-.              bfd     *abfd,
-.              PTR     in,
-.      PTR     ext));
+.  unsigned int (*_bfd_coff_swap_lineno_out)
+.    PARAMS ((bfd *, PTR, PTR));
 .
-. unsigned int (*_bfd_coff_swap_reloc_out) PARAMS ((
-.              bfd     *abfd,
-.      PTR     src,
-.      PTR     dst));
+.  unsigned int (*_bfd_coff_swap_reloc_out)
+.    PARAMS ((bfd *, PTR, PTR));
 .
-. unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS ((
-.              bfd     *abfd,
-.      PTR     in,
-.      PTR     out));
+.  unsigned int (*_bfd_coff_swap_filehdr_out)
+.    PARAMS ((bfd *, PTR, PTR));
 .
-. unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS ((
-.              bfd     *abfd,
-.      PTR     in,
-.      PTR     out));
+.  unsigned int (*_bfd_coff_swap_aouthdr_out)
+.    PARAMS ((bfd *, PTR, PTR));
 .
-. unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS ((
-.              bfd     *abfd,
-.              PTR     in,
-.      PTR     out));
+.  unsigned int (*_bfd_coff_swap_scnhdr_out)
+.    PARAMS ((bfd *, PTR, PTR));
 .
-
-Special entry points for generic COFF routines to call target
-dependent COFF routines:
-
-. unsigned int _bfd_filhsz;
-. unsigned int _bfd_aoutsz;
-. unsigned int _bfd_scnhsz;
-. unsigned int _bfd_symesz;
-. unsigned int _bfd_auxesz;
-. unsigned int _bfd_relsz;
-. unsigned int _bfd_linesz;
-. unsigned int _bfd_filnmlen;
-. boolean _bfd_coff_long_filenames;
-. boolean _bfd_coff_long_section_names;
-. unsigned int _bfd_coff_default_section_alignment_power;
-. boolean _bfd_coff_force_symnames_in_strings;
-. unsigned int _bfd_coff_debug_string_prefix_length;
-. void (*_bfd_coff_swap_filehdr_in) PARAMS ((
-.       bfd     *abfd,
-.       PTR     ext,
-.       PTR     in));
-. void (*_bfd_coff_swap_aouthdr_in) PARAMS ((
-.       bfd     *abfd,
-.       PTR     ext,
-.       PTR     in));
-. void (*_bfd_coff_swap_scnhdr_in) PARAMS ((
-.       bfd     *abfd,
-.       PTR     ext,
-.       PTR     in));
-. void (*_bfd_coff_swap_reloc_in) PARAMS ((
-.       bfd     *abfd,
-.       PTR     ext,
-.       PTR     in));
-. boolean (*_bfd_coff_bad_format_hook) PARAMS ((
-.       bfd     *abfd,
-.       PTR     internal_filehdr));
-. boolean (*_bfd_coff_set_arch_mach_hook) PARAMS ((
-.       bfd     *abfd,
-.       PTR     internal_filehdr));
-. PTR (*_bfd_coff_mkobject_hook) PARAMS ((
-.       bfd     *abfd,
-.       PTR     internal_filehdr,
-.       PTR     internal_aouthdr));
-. flagword (*_bfd_styp_to_sec_flags_hook) PARAMS ((
-.       bfd     *abfd,
-.       PTR     internal_scnhdr,
-.       const char *name,
-.       asection *section));
-. void (*_bfd_set_alignment_hook) PARAMS ((
-.       bfd     *abfd,
-.       asection *sec,
-.       PTR     internal_scnhdr));
-. boolean (*_bfd_coff_slurp_symbol_table) PARAMS ((
-.       bfd     *abfd));
-. boolean (*_bfd_coff_symname_in_debug) PARAMS ((
-.       bfd     *abfd,
-.       struct internal_syment *sym));
-. boolean (*_bfd_coff_pointerize_aux_hook) PARAMS ((
-.       bfd *abfd,
-.       combined_entry_type *table_base,
-.       combined_entry_type *symbol,
-.       unsigned int indaux,
-.       combined_entry_type *aux));
-. boolean (*_bfd_coff_print_aux) PARAMS ((
-.       bfd *abfd,
-.       FILE *file,
-.       combined_entry_type *table_base,
-.       combined_entry_type *symbol,
-.       combined_entry_type *aux,
-.       unsigned int indaux));
-. void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
-.       bfd     *abfd,
-.       struct bfd_link_info *link_info,
-.       struct bfd_link_order *link_order,
-.       arelent *reloc,
-.       bfd_byte *data,
-.       unsigned int *src_ptr,
-.       unsigned int *dst_ptr));
-. int (*_bfd_coff_reloc16_estimate) PARAMS ((
-.       bfd *abfd,
-.       asection *input_section,
-.       arelent *r,
-.       unsigned int shrink,
-.       struct bfd_link_info *link_info));
-. enum coff_symbol_classification (*_bfd_coff_classify_symbol) PARAMS ((
-.       bfd *abfd,
-.       struct internal_syment *));
-. boolean (*_bfd_coff_compute_section_file_positions) PARAMS ((
-.       bfd *abfd));
-. boolean (*_bfd_coff_start_final_link) PARAMS ((
-.       bfd *output_bfd,
-.       struct bfd_link_info *info));
-. boolean (*_bfd_coff_relocate_section) PARAMS ((
-.       bfd *output_bfd,
-.       struct bfd_link_info *info,
-.       bfd *input_bfd,
-.       asection *input_section,
-.       bfd_byte *contents,
-.       struct internal_reloc *relocs,
-.       struct internal_syment *syms,
-.       asection **sections));
-. reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS ((
-.       bfd *abfd,
-.       asection *sec,
-.       struct internal_reloc *rel,
-.       struct coff_link_hash_entry *h,
-.       struct internal_syment *sym,
-.       bfd_vma *addendp));
-. boolean (*_bfd_coff_adjust_symndx) PARAMS ((
-.       bfd *obfd,
-.       struct bfd_link_info *info,
-.       bfd *ibfd,
-.       asection *sec,
-.       struct internal_reloc *reloc,
-.       boolean *adjustedp));
-. boolean (*_bfd_coff_link_add_one_symbol) PARAMS ((
-.       struct bfd_link_info *info,
-.       bfd *abfd,
-.       const char *name,
-.       flagword flags,
-.       asection *section,
-.       bfd_vma value,
-.       const char *string,
-.       boolean copy,
-.       boolean collect,
-.       struct bfd_link_hash_entry **hashp));
+.  unsigned int _bfd_filhsz;
+.  unsigned int _bfd_aoutsz;
+.  unsigned int _bfd_scnhsz;
+.  unsigned int _bfd_symesz;
+.  unsigned int _bfd_auxesz;
+.  unsigned int _bfd_relsz;
+.  unsigned int _bfd_linesz;
+.  unsigned int _bfd_filnmlen;
+.  bfd_boolean _bfd_coff_long_filenames;
+.  bfd_boolean _bfd_coff_long_section_names;
+.  unsigned int _bfd_coff_default_section_alignment_power;
+.  bfd_boolean _bfd_coff_force_symnames_in_strings;
+.  unsigned int _bfd_coff_debug_string_prefix_length;
+.
+.  void (*_bfd_coff_swap_filehdr_in)
+.    PARAMS ((bfd *, PTR, PTR));
+.
+.  void (*_bfd_coff_swap_aouthdr_in)
+.    PARAMS ((bfd *, PTR, PTR));
+.
+.  void (*_bfd_coff_swap_scnhdr_in)
+.    PARAMS ((bfd *, PTR, PTR));
+.
+.  void (*_bfd_coff_swap_reloc_in)
+.    PARAMS ((bfd *abfd, PTR, PTR));
+.
+.  bfd_boolean (*_bfd_coff_bad_format_hook)
+.    PARAMS ((bfd *, PTR));
+.
+.  bfd_boolean (*_bfd_coff_set_arch_mach_hook)
+.    PARAMS ((bfd *, PTR));
+.
+.  PTR (*_bfd_coff_mkobject_hook)
+.    PARAMS ((bfd *, PTR, PTR));
 .
-. boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
-.      bfd * abfd,
-.       struct coff_final_link_info * pfinfo));
-. boolean (*_bfd_coff_final_link_postscript) PARAMS ((
-.      bfd * abfd,
-.      struct coff_final_link_info * pfinfo));
+.  bfd_boolean (*_bfd_styp_to_sec_flags_hook)
+.    PARAMS ((bfd *, PTR, const char *, asection *, flagword *));
+.
+.  void (*_bfd_set_alignment_hook)
+.    PARAMS ((bfd *, asection *, PTR));
+.
+.  bfd_boolean (*_bfd_coff_slurp_symbol_table)
+.    PARAMS ((bfd *));
+.
+.  bfd_boolean (*_bfd_coff_symname_in_debug)
+.    PARAMS ((bfd *, struct internal_syment *));
+.
+.  bfd_boolean (*_bfd_coff_pointerize_aux_hook)
+.    PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
+.           unsigned int, combined_entry_type *));
+.
+.  bfd_boolean (*_bfd_coff_print_aux)
+.    PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
+.           combined_entry_type *, unsigned int));
+.
+.  void (*_bfd_coff_reloc16_extra_cases)
+.    PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
+.          bfd_byte *, unsigned int *, unsigned int *));
+.
+.  int (*_bfd_coff_reloc16_estimate)
+.    PARAMS ((bfd *, asection *, arelent *, unsigned int,
+.           struct bfd_link_info *));
+.
+.  enum coff_symbol_classification (*_bfd_coff_classify_symbol)
+.    PARAMS ((bfd *, struct internal_syment *));
+.
+.  bfd_boolean (*_bfd_coff_compute_section_file_positions)
+.    PARAMS ((bfd *));
+.
+.  bfd_boolean (*_bfd_coff_start_final_link)
+.    PARAMS ((bfd *, struct bfd_link_info *));
+.
+.  bfd_boolean (*_bfd_coff_relocate_section)
+.    PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
+.           struct internal_reloc *, struct internal_syment *, asection **));
+.
+.  reloc_howto_type *(*_bfd_coff_rtype_to_howto)
+.    PARAMS ((bfd *, asection *, struct internal_reloc *,
+.           struct coff_link_hash_entry *, struct internal_syment *,
+.           bfd_vma *));
+.
+.  bfd_boolean (*_bfd_coff_adjust_symndx)
+.    PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
+.           struct internal_reloc *, bfd_boolean *));
+.
+.  bfd_boolean (*_bfd_coff_link_add_one_symbol)
+.    PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword,
+.           asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean,
+.           struct bfd_link_hash_entry **));
+.
+.  bfd_boolean (*_bfd_coff_link_output_has_begun)
+.    PARAMS ((bfd *, struct coff_final_link_info *));
+.
+.  bfd_boolean (*_bfd_coff_final_link_postscript)
+.    PARAMS ((bfd *, struct coff_final_link_info *));
 .
 .} bfd_coff_backend_data;
 .
-.#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
+.#define coff_backend_info(abfd) \
+.  ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
 .
 .#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
-.        ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
+.  ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
 .
 .#define bfd_coff_swap_sym_in(a,e,i) \
-.        ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
+.  ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
 .
 .#define bfd_coff_swap_lineno_in(a,e,i) \
-.        ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
+.  ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
 .
 .#define bfd_coff_swap_reloc_out(abfd, i, o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
 .
 .#define bfd_coff_swap_lineno_out(abfd, i, o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
 .
 .#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
-.        ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
+.  ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
 .
 .#define bfd_coff_swap_sym_out(abfd, i,o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
 .
 .#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
 .
 .#define bfd_coff_swap_filehdr_out(abfd, i,o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
 .
 .#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
 .
 .#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
 .#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
@@ -1303,96 +1320,97 @@ dependent COFF routines:
 .#define bfd_coff_relsz(abfd)  (coff_backend_info (abfd)->_bfd_relsz)
 .#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
 .#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
-.#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames)
+.#define bfd_coff_long_filenames(abfd) \
+.  (coff_backend_info (abfd)->_bfd_coff_long_filenames)
 .#define bfd_coff_long_section_names(abfd) \
-.        (coff_backend_info (abfd)->_bfd_coff_long_section_names)
+.  (coff_backend_info (abfd)->_bfd_coff_long_section_names)
 .#define bfd_coff_default_section_alignment_power(abfd) \
-.       (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
+.  (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
 .#define bfd_coff_swap_filehdr_in(abfd, i,o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
 .
 .#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
 .
 .#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
 .
 .#define bfd_coff_swap_reloc_in(abfd, i, o) \
-.        ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
+.  ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
 .
 .#define bfd_coff_bad_format_hook(abfd, filehdr) \
-.        ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
+.  ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
 .
 .#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
-.        ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
+.  ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
 .#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
-.        ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
+.  ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
 .
-.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section)\
-.        ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
-.         (abfd, scnhdr, name, section))
+.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
+.  ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
+.   (abfd, scnhdr, name, section, flags_ptr))
 .
 .#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
-.        ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
+.  ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
 .
 .#define bfd_coff_slurp_symbol_table(abfd)\
-.        ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
+.  ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
 .
 .#define bfd_coff_symname_in_debug(abfd, sym)\
-.        ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
+.  ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
 .
 .#define bfd_coff_force_symnames_in_strings(abfd)\
-.      (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
+.  (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
 .
 .#define bfd_coff_debug_string_prefix_length(abfd)\
-.      (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
+.  (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
 .
 .#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
-.        ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
-.         (abfd, file, base, symbol, aux, indaux))
+.  ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
+.   (abfd, file, base, symbol, aux, indaux))
 .
 .#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
-.        ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
-.         (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
+.  ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
+.   (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
 .
 .#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
-.        ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
-.         (abfd, section, reloc, shrink, link_info))
+.  ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
+.   (abfd, section, reloc, shrink, link_info))
 .
 .#define bfd_coff_classify_symbol(abfd, sym)\
-.        ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
-.         (abfd, sym))
+.  ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
+.   (abfd, sym))
 .
 .#define bfd_coff_compute_section_file_positions(abfd)\
-.        ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
-.         (abfd))
+.  ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
+.   (abfd))
 .
 .#define bfd_coff_start_final_link(obfd, info)\
-.        ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
-.         (obfd, info))
+.  ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
+.   (obfd, info))
 .#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
-.        ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
-.         (obfd, info, ibfd, o, con, rel, isyms, secs))
+.  ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
+.   (obfd, info, ibfd, o, con, rel, isyms, secs))
 .#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
-.        ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
-.         (abfd, sec, rel, h, sym, addendp))
+.  ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
+.   (abfd, sec, rel, h, sym, addendp))
 .#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
-.        ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
-.         (obfd, info, ibfd, sec, rel, adjustedp))
+.  ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
+.   (obfd, info, ibfd, sec, rel, adjustedp))
 .#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\
-.        ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
-.         (info, abfd, name, flags, section, value, string, cp, coll, hashp))
+.  ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
+.   (info, abfd, name, flags, section, value, string, cp, coll, hashp))
 .
 .#define bfd_coff_link_output_has_begun(a,p) \
-.        ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
+.  ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
 .#define bfd_coff_final_link_postscript(a,p) \
-.        ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
+.  ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
 .
 */
 
 /* See whether the magic number matches.  */
 
-static boolean
+static bfd_boolean
 coff_bad_format_hook (abfd, filehdr)
      bfd * abfd ATTRIBUTE_UNUSED;
      PTR filehdr;
@@ -1400,7 +1418,7 @@ coff_bad_format_hook (abfd, filehdr)
   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
 
   if (BADMAG (*internal_f))
-    return false;
+    return FALSE;
 
   /* if the optional header is NULL or not the correct size then
      quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
@@ -1413,10 +1431,10 @@ coff_bad_format_hook (abfd, filehdr)
 
 #if defined(M88) || defined(I960)
   if (internal_f->f_opthdr != 0 && bfd_coff_aoutsz (abfd) != internal_f->f_opthdr)
-    return false;
+    return FALSE;
 #endif
 
-  return true;
+  return TRUE;
 }
 
 /* Check whether this section uses an alignment other than the
@@ -1449,7 +1467,10 @@ coff_set_custom_section_alignment (abfd, section, alignment_table, table_size)
     return;
 
   if (alignment_table[i].default_alignment_max != COFF_ALIGNMENT_FIELD_EMPTY
-      && default_alignment > alignment_table[i].default_alignment_max)
+#if COFF_DEFAULT_SECTION_ALIGNMENT_POWER != 0
+      && default_alignment > alignment_table[i].default_alignment_max
+#endif
+      )
     return;
 
   section->alignment_power = alignment_table[i].alignment_power;
@@ -1482,22 +1503,23 @@ static const unsigned int coff_section_alignment_table_size =
 /* Initialize a section structure with information peculiar to this
    particular implementation of COFF.  */
 
-static boolean
+static bfd_boolean
 coff_new_section_hook (abfd, section)
      bfd * abfd;
      asection * section;
 {
   combined_entry_type *native;
+  bfd_size_type amt;
 
   section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
 
 #ifdef RS6000COFF_C
-  if (xcoff_data (abfd)->text_align_power != 0
+  if (bfd_xcoff_text_align_power (abfd) != 0
       && strcmp (bfd_get_section_name (abfd, section), ".text") == 0)
-    section->alignment_power = xcoff_data (abfd)->text_align_power;
-  if (xcoff_data (abfd)->data_align_power != 0
+    section->alignment_power = bfd_xcoff_text_align_power (abfd);
+  if (bfd_xcoff_data_align_power (abfd) != 0
       && strcmp (bfd_get_section_name (abfd, section), ".data") == 0)
-    section->alignment_power = xcoff_data (abfd)->data_align_power;
+    section->alignment_power = bfd_xcoff_data_align_power (abfd);
 #endif
 
   /* Allocate aux records for section symbols, to store size and
@@ -1505,10 +1527,10 @@ coff_new_section_hook (abfd, section)
 
      @@ The 10 is a guess at a plausible maximum number of aux entries
      (but shouldn't be a constant).  */
-  native = ((combined_entry_type *)
-           bfd_zalloc (abfd, sizeof (combined_entry_type) * 10));
+  amt = sizeof (combined_entry_type) * 10;
+  native = (combined_entry_type *) bfd_zalloc (abfd, amt);
   if (native == NULL)
-    return false;
+    return FALSE;
 
   /* We don't need to set up n_name, n_value, or n_scnum in the native
      symbol information, since they'll be overriden by the BFD symbol
@@ -1525,7 +1547,7 @@ coff_new_section_hook (abfd, section)
                                     coff_section_alignment_table,
                                     coff_section_alignment_table_size);
 
-  return true;
+  return TRUE;
 }
 
 #ifdef COFF_ALIGN_IN_SECTION_HEADER
@@ -1588,6 +1610,7 @@ coff_set_alignment_hook (abfd, section, scnhdr)
      PTR scnhdr;
 {
   struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
+  bfd_size_type amt;
 
   ALIGN_SET     (hdr->s_flags, IMAGE_SCN_ALIGN_64BYTES, 6)
   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_32BYTES, 5)
@@ -1603,8 +1626,8 @@ coff_set_alignment_hook (abfd, section, scnhdr)
      mapped onto a generic BFD section bit.  */
   if (coff_section_data (abfd, section) == NULL)
     {
-      section->used_by_bfd =
-       (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
+      amt = sizeof (struct coff_section_tdata);
+      section->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
       if (section->used_by_bfd == NULL)
        {
          /* FIXME: Return error.  */
@@ -1613,8 +1636,8 @@ coff_set_alignment_hook (abfd, section, scnhdr)
     }
   if (pei_section_data (abfd, section) == NULL)
     {
-      coff_section_data (abfd, section)->tdata =
-       (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
+      amt = sizeof (struct pei_section_tdata);
+      coff_section_data (abfd, section)->tdata = (PTR) bfd_zalloc (abfd, amt);
       if (coff_section_data (abfd, section)->tdata == NULL)
        {
          /* FIXME: Return error.  */
@@ -1631,16 +1654,15 @@ coff_set_alignment_hook (abfd, section, scnhdr)
     {
       struct external_reloc dst;
       struct internal_reloc n;
-      int oldpos = bfd_tell (abfd);
-      bfd_seek (abfd, hdr->s_relptr, 0);
-      if (bfd_read ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
+      file_ptr oldpos = bfd_tell (abfd);
+      bfd_seek (abfd, (file_ptr) hdr->s_relptr, 0);
+      if (bfd_bread ((PTR) &dst, (bfd_size_type) bfd_coff_relsz (abfd), abfd)
          != bfd_coff_relsz (abfd))
        return;
 
       coff_swap_reloc_in (abfd, &dst, &n);
       bfd_seek (abfd, oldpos, 0);
-      section->reloc_count =
-       hdr->s_nreloc = n.r_vaddr;
+      section->reloc_count = hdr->s_nreloc = n.r_vaddr;
     }
 }
 #undef ALIGN_SET
@@ -1668,7 +1690,7 @@ coff_set_alignment_hook (abfd, section, scnhdr)
   if ((hdr->s_flags & STYP_OVRFLO) == 0)
     return;
 
-  real_sec = coff_section_from_bfd_index (abfd, hdr->s_nreloc);
+  real_sec = coff_section_from_bfd_index (abfd, (int) hdr->s_nreloc);
   if (real_sec == NULL)
     return;
 
@@ -1679,7 +1701,7 @@ coff_set_alignment_hook (abfd, section, scnhdr)
     {
       if (*ps == section)
        {
-         *ps = (*ps)->next;
+         bfd_section_list_remove (abfd, ps);
          --abfd->section_count;
          break;
        }
@@ -1697,17 +1719,18 @@ coff_set_alignment_hook (abfd, section, scnhdr)
 
 #ifndef coff_mkobject
 
-static boolean coff_mkobject PARAMS ((bfd *));
+static bfd_boolean coff_mkobject PARAMS ((bfd *));
 
-static boolean
+static bfd_boolean
 coff_mkobject (abfd)
      bfd * abfd;
 {
   coff_data_type *coff;
+  bfd_size_type amt = sizeof (coff_data_type);
 
-  abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, sizeof (coff_data_type));
+  abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, amt);
   if (abfd->tdata.coff_obj_data == 0)
-    return false;
+    return FALSE;
   coff = coff_data (abfd);
   coff->symbols = (coff_symbol_type *) NULL;
   coff->conversion_table = (unsigned int *) NULL;
@@ -1717,7 +1740,7 @@ coff_mkobject (abfd)
 
 /*  make_abs_section(abfd);*/
 
-  return true;
+  return TRUE;
 }
 #endif
 
@@ -1732,7 +1755,7 @@ coff_mkobject_hook (abfd, filehdr, aouthdr)
   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
   coff_data_type *coff;
 
-  if (coff_mkobject (abfd) == false)
+  if (! coff_mkobject (abfd))
     return NULL;
 
   coff = coff_data (abfd);
@@ -1771,12 +1794,12 @@ coff_mkobject_hook (abfd, filehdr, aouthdr)
 # else
       xcoff->xcoff64 = 0;
 # endif
-      xcoff->full_aouthdr = true;
+      xcoff->full_aouthdr = TRUE;
       xcoff->toc = internal_a->o_toc;
       xcoff->sntoc = internal_a->o_sntoc;
       xcoff->snentry = internal_a->o_snentry;
-      xcoff->text_align_power = internal_a->o_algntext;
-      xcoff->data_align_power = internal_a->o_algndata;
+      bfd_xcoff_text_align_power (abfd) = internal_a->o_algntext;
+      bfd_xcoff_data_align_power (abfd) = internal_a->o_algndata;
       xcoff->modtype = internal_a->o_modtype;
       xcoff->cputype = internal_a->o_cputype;
       xcoff->maxdata = internal_a->o_maxdata;
@@ -1785,7 +1808,7 @@ coff_mkobject_hook (abfd, filehdr, aouthdr)
 #endif
 
 #ifdef ARM
-  /* Set the flags field from the COFF header read in */
+  /* Set the flags field from the COFF header read in */
   if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
     coff->flags = 0;
 #endif
@@ -1808,22 +1831,28 @@ coff_mkobject_hook (abfd, filehdr, aouthdr)
    would be target independent and would also be much more successful
    at linking together COFF files for different architectures.  */
 
-static boolean
+static bfd_boolean
 coff_set_arch_mach_hook (abfd, filehdr)
      bfd *abfd;
      PTR filehdr;
 {
-  long machine;
+  unsigned long machine;
   enum bfd_architecture arch;
   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
 
+  /* Zero selects the default machine for an arch.  */
   machine = 0;
   switch (internal_f->f_magic)
     {
+#ifdef OR32_MAGIC_BIG
+    case OR32_MAGIC_BIG:
+    case OR32_MAGIC_LITTLE:
+      arch = bfd_arch_or32;
+      break;
+#endif
 #ifdef PPCMAGIC
     case PPCMAGIC:
       arch = bfd_arch_powerpc;
-      machine = 0; /* what does this mean? (krk) */
       break;
 #endif
 #ifdef I386MAGIC
@@ -1832,20 +1861,17 @@ coff_set_arch_mach_hook (abfd, filehdr)
     case I386AIXMAGIC:         /* Danbury PS/2 AIX C Compiler */
     case LYNXCOFFMAGIC:        /* shadows the m68k Lynx number below, sigh */
       arch = bfd_arch_i386;
-      machine = 0;
       break;
 #endif
 #ifdef IA64MAGIC
     case IA64MAGIC:
       arch = bfd_arch_ia64;
-      machine = 0;
       break;
 #endif
 #ifdef A29K_MAGIC_BIG
     case A29K_MAGIC_BIG:
     case A29K_MAGIC_LITTLE:
       arch = bfd_arch_a29k;
-      machine = 0;
       break;
 #endif
 #ifdef ARMMAGIC
@@ -1862,7 +1888,12 @@ coff_set_arch_mach_hook (abfd, filehdr)
         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;
+         /* The COFF header does not have enough bits available
+            to cover all the different ARM architectures.  So
+            we interpret F_ARM_5, the highest flag value to mean
+            "the highest ARM architecture known to BFD" which is
+            currently the XScale.  */
+        case F_ARM_5:  machine = bfd_mach_arm_XScale;  break;
        }
       break;
 #endif
@@ -1902,7 +1933,7 @@ coff_set_arch_mach_hook (abfd, filehdr)
          machine = bfd_mach_z8002;
          break;
        default:
-         return false;
+         return FALSE;
        }
       break;
 #endif
@@ -1950,6 +1981,7 @@ coff_set_arch_mach_hook (abfd, filehdr)
 
 #ifdef RS6000COFF_C
 #ifdef XCOFF64
+    case U64_TOCMAGIC:
     case U803XTOCMAGIC:
 #else
     case U802ROMAGIC:
@@ -1973,14 +2005,14 @@ coff_set_arch_mach_hook (abfd, filehdr)
              {
                bfd_byte *buf;
                struct internal_syment sym;
+               bfd_size_type amt = bfd_coff_symesz (abfd);
 
-               buf = (bfd_byte *) bfd_malloc (bfd_coff_symesz (abfd));
+               buf = (bfd_byte *) bfd_malloc (amt);
                if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
-                   || (bfd_read (buf, 1, bfd_coff_symesz (abfd), abfd)
-                       != bfd_coff_symesz (abfd)))
+                   || bfd_bread (buf, amt, abfd) != amt)
                  {
                    free (buf);
-                   return false;
+                   return FALSE;
                  }
                bfd_coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
                if (sym.n_sclass == C_FILE)
@@ -1996,21 +2028,8 @@ coff_set_arch_mach_hook (abfd, filehdr)
          {
          default:
          case 0:
-#ifdef POWERMAC
-           /* PowerPC Macs use the same magic numbers as RS/6000
-              (because that's how they were bootstrapped originally),
-              but they are always PowerPC architecture.  */
-           arch = bfd_arch_powerpc;
-           machine = bfd_mach_ppc;
-#else
-#ifdef XCOFF64
-           arch = bfd_arch_powerpc;
-           machine = bfd_mach_ppc_620;
-#else
-           arch = bfd_arch_rs6000;
-           machine = bfd_mach_rs6k;
-#endif
-#endif /* POWERMAC */
+           arch = bfd_xcoff_architecture (abfd);
+           machine = bfd_xcoff_machine (abfd);
            break;
 
          case 1:
@@ -2037,7 +2056,6 @@ coff_set_arch_mach_hook (abfd, filehdr)
 #ifdef WE32KMAGIC
     case WE32KMAGIC:
       arch = bfd_arch_we32k;
-      machine = 0;
       break;
 #endif
 
@@ -2075,21 +2093,18 @@ coff_set_arch_mach_hook (abfd, filehdr)
     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;
-      machine = 0;
       break;
 #endif
 
@@ -2099,7 +2114,6 @@ coff_set_arch_mach_hook (abfd, filehdr)
     case LYNXCOFFMAGIC:
 #endif
       arch = bfd_arch_sparc;
-      machine = 0;
       break;
 #endif
 
@@ -2114,6 +2128,7 @@ coff_set_arch_mach_hook (abfd, filehdr)
       /* this TI COFF section should be used by all new TI COFF v0 targets */
     case TICOFF0MAGIC:
       arch = TICOFF_TARGET_ARCH;
+      machine = TICOFF_TARGET_MACHINE_GET (internal_f->f_flags);
       break;
 #endif
 #endif
@@ -2128,6 +2143,7 @@ coff_set_arch_mach_hook (abfd, filehdr)
 #ifdef TI_TARGET_ID
         case TI_TARGET_ID:
           arch = TICOFF_TARGET_ARCH;
+         machine = TICOFF_TARGET_MACHINE_GET (internal_f->f_flags);
           break;
 #endif
         default:
@@ -2151,32 +2167,39 @@ coff_set_arch_mach_hook (abfd, filehdr)
       arch = bfd_arch_mcore;
       break;
 #endif
+
+#ifdef W65MAGIC
+    case W65MAGIC:
+      arch = bfd_arch_w65;
+      break;
+#endif
+
     default:                   /* Unreadable input file type */
       arch = bfd_arch_obscure;
       break;
     }
 
   bfd_default_set_arch_mach (abfd, arch, machine);
-  return true;
+  return TRUE;
 }
 
 #ifdef SYMNAME_IN_DEBUG
 
-static boolean symname_in_debug_hook
+static bfd_boolean symname_in_debug_hook
   PARAMS ((bfd *, struct internal_syment *));
 
-static boolean
+static bfd_boolean
 symname_in_debug_hook (abfd, sym)
      bfd * abfd ATTRIBUTE_UNUSED;
      struct internal_syment *sym;
 {
-  return SYMNAME_IN_DEBUG (sym) ? true : false;
+  return SYMNAME_IN_DEBUG (sym) != 0;
 }
 
 #else
 
 #define symname_in_debug_hook \
-  (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
+  (bfd_boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
 
 #endif
 
@@ -2188,12 +2211,12 @@ symname_in_debug_hook (abfd, sym)
 
 /* Handle the csect auxent of a C_EXT or C_HIDEXT symbol.  */
 
-static boolean coff_pointerize_aux_hook
+static bfd_boolean coff_pointerize_aux_hook
   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
           unsigned int, combined_entry_type *));
 
 /*ARGSUSED*/
-static boolean
+static bfd_boolean
 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
      bfd *abfd ATTRIBUTE_UNUSED;
      combined_entry_type *table_base;
@@ -2213,14 +2236,14 @@ coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
          aux->fix_scnlen = 1;
        }
 
-      /* Return true to indicate that the caller should not do any
+      /* Return TRUE to indicate that the caller should not do any
          further work on this auxent.  */
-      return true;
+      return TRUE;
     }
 
-  /* Return false to indicate that this auxent should be handled by
+  /* Return FALSE to indicate that this auxent should be handled by
      the caller.  */
-  return false;
+  return FALSE;
 }
 
 #else
@@ -2228,12 +2251,12 @@ coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
 
 /* We don't want to pointerize bal entries.  */
 
-static boolean coff_pointerize_aux_hook
+static bfd_boolean coff_pointerize_aux_hook
   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
           unsigned int, combined_entry_type *));
 
 /*ARGSUSED*/
-static boolean
+static bfd_boolean
 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
      bfd *abfd ATTRIBUTE_UNUSED;
      combined_entry_type *table_base ATTRIBUTE_UNUSED;
@@ -2241,7 +2264,7 @@ coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
      unsigned int indaux;
      combined_entry_type *aux ATTRIBUTE_UNUSED;
 {
-  /* Return true if we don't want to pointerize this aux entry, which
+  /* Return TRUE if we don't want to pointerize this aux entry, which
      is the case for the lastfirst aux entry for a C_LEAFPROC symbol.  */
   return (indaux == 1
          && (symbol->u.syment.n_sclass == C_LEAFPROC
@@ -2256,13 +2279,13 @@ coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
 #endif /* ! I960 */
 #endif /* ! RS6000COFF_C */
 
-/* Print an aux entry.  This returns true if it has printed it.  */
+/* Print an aux entry.  This returns TRUE if it has printed it.  */
 
-static boolean coff_print_aux
+static bfd_boolean coff_print_aux
   PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
           combined_entry_type *, unsigned int));
 
-static boolean
+static bfd_boolean
 coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
      bfd *abfd ATTRIBUTE_UNUSED;
      FILE *file ATTRIBUTE_UNUSED;
@@ -2281,13 +2304,21 @@ coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
        {
          BFD_ASSERT (! aux->fix_scnlen);
-         fprintf (file, "val %5ld", aux->u.auxent.x_csect.x_scnlen.l);
+#ifdef XCOFF64
+         fprintf (file, "val %5lld", aux->u.auxent.x_csect.x_scnlen.l);
+#else
+         fprintf (file, "val %5ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
+#endif
        }
       else
        {
          fprintf (file, "indx ");
          if (! aux->fix_scnlen)
-           fprintf (file, "%4ld", aux->u.auxent.x_csect.x_scnlen.l);
+#ifdef XCOFF64
+           fprintf (file, "%4lld", aux->u.auxent.x_csect.x_scnlen.l);
+#else
+           fprintf (file, "%4ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
+#endif
          else
            fprintf (file, "%4ld",
                     (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
@@ -2301,12 +2332,12 @@ coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
               (unsigned int) aux->u.auxent.x_csect.x_smclas,
               aux->u.auxent.x_csect.x_stab,
               (unsigned int) aux->u.auxent.x_csect.x_snstab);
-      return true;
+      return TRUE;
     }
 #endif
 
-  /* Return false to indicate that no special action was taken.  */
-  return false;
+  /* Return FALSE to indicate that no special action was taken.  */
+  return FALSE;
 }
 
 /*
@@ -2345,7 +2376,7 @@ compare_arelent_ptr (x, y)
 
 #endif /* TARG_AUX */
 
-static boolean
+static bfd_boolean
 coff_write_relocs (abfd, first_undef)
      bfd * abfd;
      int first_undef;
@@ -2361,19 +2392,25 @@ coff_write_relocs (abfd, first_undef)
 #ifndef TARG_AUX
       p = s->orelocation;
 #else
-      /* sort relocations before we write them out */
-      p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *));
-      if (p == NULL && s->reloc_count > 0)
-       return false;
-      memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
-      qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
+      {
+       /* sort relocations before we write them out */
+       bfd_size_type amt;
+
+       amt = s->reloc_count;
+       amt *= sizeof (arelent *);
+       p = (arelent **) bfd_malloc (amt);
+       if (p == NULL && s->reloc_count > 0)
+         return FALSE;
+       memcpy (p, s->orelocation, (size_t) amt);
+       qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
+      }
 #endif
 
       if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
-       return false;
+       return FALSE;
 
 #ifdef COFF_WITH_PE
-      if (s->reloc_count > 0xffff)
+      if (obj_pe (abfd) && s->reloc_count >= 0xffff)
        {
          /* encode real count here as first reloc */
          struct internal_reloc n;
@@ -2381,9 +2418,9 @@ coff_write_relocs (abfd, first_undef)
          /* add one to count *this* reloc (grr) */
          n.r_vaddr = s->reloc_count + 1;
          coff_swap_reloc_out (abfd, &n, &dst);
-         if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
-             != bfd_coff_relsz (abfd))
-           return false;
+         if (bfd_bwrite ((PTR) & dst, (bfd_size_type) bfd_coff_relsz (abfd),
+                        abfd) != bfd_coff_relsz (abfd))
+           return FALSE;
        }
 #endif
 
@@ -2405,15 +2442,15 @@ coff_write_relocs (abfd, first_undef)
 
          if (q->sym_ptr_ptr[0]->the_bfd != abfd)
            {
-             int i;
+             int j;
              const char *sname = q->sym_ptr_ptr[0]->name;
              asymbol **outsyms = abfd->outsymbols;
-             for (i = first_undef; outsyms[i]; i++)
+             for (j = first_undef; outsyms[j]; j++)
                {
-                 const char *intable = outsyms[i]->name;
+                 const char *intable = outsyms[j]->name;
                  if (strcmp (intable, sname) == 0) {
                    /* got a hit, so repoint the reloc */
-                   q->sym_ptr_ptr = outsyms + i;
+                   q->sym_ptr_ptr = outsyms + j;
                    break;
                  }
                }
@@ -2434,7 +2471,8 @@ coff_write_relocs (abfd, first_undef)
 #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)
+               if ((*q->sym_ptr_ptr)->section == bfd_abs_section_ptr
+                   && ((*q->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0)
 #endif
                  /* This is a relocation relative to the absolute symbol.  */
                  n.r_symndx = -1;
@@ -2460,9 +2498,9 @@ coff_write_relocs (abfd, first_undef)
          n.r_type = q->howto->type;
 #endif
          coff_swap_reloc_out (abfd, &n, &dst);
-         if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
-             != bfd_coff_relsz (abfd))
-           return false;
+         if (bfd_bwrite ((PTR) & dst, (bfd_size_type) bfd_coff_relsz (abfd),
+                        abfd) != bfd_coff_relsz (abfd))
+           return FALSE;
        }
 
 #ifdef TARG_AUX
@@ -2471,13 +2509,13 @@ coff_write_relocs (abfd, first_undef)
 #endif
     }
 
-  return true;
+  return TRUE;
 }
 
 /* Set flags and magic number of a coff file from architecture and machine
-   type.  Result is true if we can represent the arch&type, false if not.  */
+   type.  Result is TRUE if we can represent the arch&type, FALSE if not.  */
 
-static boolean
+static bfd_boolean
 coff_set_flags (abfd, magicp, flagsp)
      bfd * abfd;
      unsigned int *magicp ATTRIBUTE_UNUSED;
@@ -2497,9 +2535,9 @@ coff_set_flags (abfd, magicp, flagsp)
          *flagsp = F_Z8002;
          break;
        default:
-         return false;
+         return FALSE;
        }
-      return true;
+      return TRUE;
 #endif
 #ifdef I960ROMAGIC
 
@@ -2539,10 +2577,10 @@ coff_set_flags (abfd, magicp, flagsp)
            flags = F_I960HX;
            break;
          default:
-           return false;
+           return FALSE;
          }
        *flagsp = flags;
-       return true;
+       return TRUE;
       }
       break;
 #endif
@@ -2550,7 +2588,7 @@ coff_set_flags (abfd, magicp, flagsp)
 #ifdef TIC30MAGIC
     case bfd_arch_tic30:
       *magicp = TIC30MAGIC;
-      return true;
+      return TRUE;
 #endif
 
 #ifdef TICOFF_DEFAULT_MAGIC
@@ -2573,16 +2611,17 @@ coff_set_flags (abfd, magicp, flagsp)
               *magicp = TICOFF2MAGIC;
               break;
             default:
-              return false;
+              return FALSE;
             }
         }
-      return true;
+      TICOFF_TARGET_MACHINE_SET (flagsp, bfd_get_mach (abfd));
+      return TRUE;
 #endif
 
 #ifdef TIC80_ARCH_MAGIC
     case bfd_arch_tic80:
       *magicp = TIC80_ARCH_MAGIC;
-      return true;
+      return TRUE;
 #endif
 #ifdef ARMMAGIC
     case bfd_arch_arm:
@@ -2614,17 +2653,18 @@ coff_set_flags (abfd, magicp, flagsp)
        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;
-         /* FIXME: we do not have F_ARM vaues greater than F_ARM_5.  */
+         /* FIXME: we do not have F_ARM vaues greater than F_ARM_5.
+            See also the comment in coff_set_arch_mach_hook().  */
        case bfd_mach_arm_5T: * flagsp |= F_ARM_5;  break;
        case bfd_mach_arm_5TE: * flagsp |= F_ARM_5; break;
        case bfd_mach_arm_XScale: * flagsp |= F_ARM_5; break;
        }
-      return true;
+      return TRUE;
 #endif
 #ifdef PPCMAGIC
     case bfd_arch_powerpc:
       *magicp = PPCMAGIC;
-      return true;
+      return TRUE;
       break;
 #endif
 #ifdef I386MAGIC
@@ -2634,19 +2674,19 @@ coff_set_flags (abfd, magicp, flagsp)
       /* Just overwrite the usual value if we're doing Lynx.  */
       *magicp = LYNXCOFFMAGIC;
 #endif
-      return true;
+      return TRUE;
       break;
 #endif
 #ifdef I860MAGIC
     case bfd_arch_i860:
       *magicp = I860MAGIC;
-      return true;
+      return TRUE;
       break;
 #endif
 #ifdef IA64MAGIC
     case bfd_arch_ia64:
       *magicp = IA64MAGIC;
-      return true;
+      return TRUE;
       break;
 #endif
 #ifdef MC68MAGIC
@@ -2665,14 +2705,14 @@ coff_set_flags (abfd, magicp, flagsp)
       /* Just overwrite the usual value if we're doing Lynx.  */
       *magicp = LYNXCOFFMAGIC;
 #endif
-      return true;
+      return TRUE;
       break;
 #endif
 
 #ifdef MC88MAGIC
     case bfd_arch_m88k:
       *magicp = MC88OMAGIC;
-      return true;
+      return TRUE;
       break;
 #endif
 #ifdef H8300MAGIC
@@ -2681,13 +2721,13 @@ coff_set_flags (abfd, magicp, flagsp)
        {
        case bfd_mach_h8300:
          *magicp = H8300MAGIC;
-         return true;
+         return TRUE;
        case bfd_mach_h8300h:
          *magicp = H8300HMAGIC;
-         return true;
+         return TRUE;
        case bfd_mach_h8300s:
          *magicp = H8300SMAGIC;
-         return true;
+         return TRUE;
        }
       break;
 #endif
@@ -2702,14 +2742,14 @@ coff_set_flags (abfd, magicp, flagsp)
       else
        *magicp = SH_ARCH_MAGIC_LITTLE;
 #endif
-      return true;
+      return TRUE;
       break;
 #endif
 
 #ifdef MIPS_ARCH_MAGIC_WINCE
     case bfd_arch_mips:
       *magicp = MIPS_ARCH_MAGIC_WINCE;
-      return true;
+      return TRUE;
       break;
 #endif
 
@@ -2720,14 +2760,14 @@ coff_set_flags (abfd, magicp, flagsp)
       /* Just overwrite the usual value if we're doing Lynx.  */
       *magicp = LYNXCOFFMAGIC;
 #endif
-      return true;
+      return TRUE;
       break;
 #endif
 
 #ifdef H8500MAGIC
     case bfd_arch_h8500:
       *magicp = H8500MAGIC;
-      return true;
+      return TRUE;
       break;
 #endif
 #ifdef A29K_MAGIC_BIG
@@ -2736,14 +2776,14 @@ coff_set_flags (abfd, magicp, flagsp)
        *magicp = A29K_MAGIC_BIG;
       else
        *magicp = A29K_MAGIC_LITTLE;
-      return true;
+      return TRUE;
       break;
 #endif
 
 #ifdef WE32KMAGIC
     case bfd_arch_we32k:
       *magicp = WE32KMAGIC;
-      return true;
+      return TRUE;
       break;
 #endif
 
@@ -2752,40 +2792,43 @@ coff_set_flags (abfd, magicp, flagsp)
 #ifndef PPCMAGIC
     case bfd_arch_powerpc:
 #endif
-#ifdef XCOFF64
-      if (bfd_get_mach (abfd) == bfd_mach_ppc_620
-         && !strncmp (abfd->xvec->name,"aix", 3))
-       *magicp = U803XTOCMAGIC;
-      else
-#else
-       *magicp = U802TOCMAGIC;
-#endif
-      return true;
+      BFD_ASSERT (bfd_get_flavour (abfd) == bfd_target_xcoff_flavour);
+      *magicp = bfd_xcoff_magic_number (abfd);
+      return TRUE;
       break;
 #endif
 
 #ifdef MCOREMAGIC
     case bfd_arch_mcore:
       * magicp = MCOREMAGIC;
-      return true;
+      return TRUE;
 #endif
 
 #ifdef W65MAGIC
     case bfd_arch_w65:
       *magicp = W65MAGIC;
-      return true;
+      return TRUE;
+#endif
+
+#ifdef OR32_MAGIC_BIG
+    case bfd_arch_or32:
+      if (bfd_big_endian (abfd))
+        * magicp = OR32_MAGIC_BIG;
+      else
+        * magicp = OR32_MAGIC_LITTLE;
+      return TRUE;
 #endif
 
     default:                   /* Unknown architecture.  */
-      /* Fall through to "return false" below, to avoid
+      /* Fall through to "return FALSE" below, to avoid
         "statement never reached" errors on the one below.  */
       break;
     }
 
-  return false;
+  return FALSE;
 }
 
-static boolean
+static bfd_boolean
 coff_set_arch_mach (abfd, arch, machine)
      bfd * abfd;
      enum bfd_architecture arch;
@@ -2795,13 +2838,13 @@ coff_set_arch_mach (abfd, arch, machine)
   unsigned short dummy2;
 
   if (! bfd_default_set_arch_mach (abfd, arch, machine))
-    return false;
+    return FALSE;
 
-  if (arch != bfd_arch_unknown &&
-      coff_set_flags (abfd, &dummy1, &dummy2) != true)
-    return false;              /* We can't represent this type */
+  if (arch != bfd_arch_unknown
+      && ! coff_set_flags (abfd, &dummy1, &dummy2))
+    return FALSE;              /* We can't represent this type */
 
-  return true;                 /* We're easy ...  */
+  return TRUE;                 /* We're easy ...  */
 }
 
 #ifdef COFF_IMAGE_WITH_PE
@@ -2838,14 +2881,14 @@ sort_by_secaddr (arg1, arg2)
 #undef ALIGN_SECTIONS_IN_FILE
 #endif
 
-static boolean
+static bfd_boolean
 coff_compute_section_file_positions (abfd)
      bfd * abfd;
 {
   asection *current;
   asection *previous = (asection *) NULL;
   file_ptr sofar = bfd_coff_filhsz (abfd);
-  boolean align_adjust;
+  bfd_boolean align_adjust;
 #ifdef ALIGN_SECTIONS_IN_FILE
   file_ptr old_sofar;
 #endif
@@ -2937,19 +2980,21 @@ coff_compute_section_file_positions (abfd)
        right order in the image file itself, but we do need to get the
        target_index values right.  */
 
-    int count;
+    unsigned int count;
     asection **section_list;
-    int i;
+    unsigned int i;
     int target_index;
+    bfd_size_type amt;
 
     count = 0;
     for (current = abfd->sections; current != NULL; current = current->next)
       ++count;
 
     /* We allocate an extra cell to simplify the final loop.  */
-    section_list = bfd_malloc (sizeof (struct asection *) * (count + 1));
+    amt = sizeof (struct asection *) * (count + 1);
+    section_list = bfd_malloc (amt);
     if (section_list == NULL)
-      return false;
+      return FALSE;
 
     i = 0;
     for (current = abfd->sections; current != NULL; current = current->next)
@@ -2987,6 +3032,7 @@ coff_compute_section_file_positions (abfd)
        else
          current->target_index = target_index++;
       }
+    abfd->section_tail = &current->next;
 
     free (section_list);
   }
@@ -3001,7 +3047,7 @@ coff_compute_section_file_positions (abfd)
   }
 #endif /* ! COFF_IMAGE_WITH_PE */
 
-  align_adjust = false;
+  align_adjust = FALSE;
   for (current = abfd->sections;
        current != (asection *) NULL;
        current = current->next)
@@ -3011,17 +3057,18 @@ coff_compute_section_file_positions (abfd)
         page size too, and remember both sizes.  */
       if (coff_section_data (abfd, current) == NULL)
        {
-         current->used_by_bfd =
-           (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
+         bfd_size_type amt = sizeof (struct coff_section_tdata);
+         current->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
          if (current->used_by_bfd == NULL)
-           return false;
+           return FALSE;
        }
       if (pei_section_data (abfd, current) == NULL)
        {
-         coff_section_data (abfd, current)->tdata =
-           (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
+         bfd_size_type amt = sizeof (struct pei_section_tdata);
+         coff_section_data (abfd, current)->tdata
+           = (PTR) bfd_zalloc (abfd, amt);
          if (coff_section_data (abfd, current)->tdata == NULL)
-           return false;
+           return FALSE;
        }
       if (pei_section_data (abfd, current)->virt_size == 0)
        pei_section_data (abfd, current)->virt_size = current->_raw_size;
@@ -3048,7 +3095,38 @@ coff_compute_section_file_positions (abfd)
             padding the previous section up if necessary */
 
          old_sofar = sofar;
-         sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
+#ifdef RS6000COFF_C
+         /* AIX loader checks the text section alignment of (vma - filepos)
+            So even though the filepos may be aligned wrt the o_algntext, for
+            AIX executables, this check fails. This shows up when a native
+            AIX executable is stripped with gnu strip because the default vma
+            of native is 0x10000150 but default for gnu is 0x10000140.  Gnu
+            stripped gnu excutable passes this check because the filepos is
+            0x0140.  This problem also show up with 64 bit shared objects. The
+            data section must also be aligned.  */
+         if (!strcmp (current->name, _TEXT)
+             || !strcmp (current->name, _DATA))
+           {
+             bfd_vma pad;
+             bfd_vma align;
+
+             sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
+
+             align = 1 << current->alignment_power;
+             pad = abs (current->vma - sofar) % align;
+
+             if (pad)
+               {
+                 pad = align - pad;
+                 sofar += pad;
+               }
+           }
+         else
+#else
+           {
+             sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
+           }
+#endif
          if (previous != (asection *) NULL)
            {
              previous->_raw_size += sofar - old_sofar;
@@ -3099,7 +3177,7 @@ coff_compute_section_file_positions (abfd)
          _raw_size, in case the caller only writes out data to the
          unaligned _raw_size.  */
       if (pei_section_data (abfd, current)->virt_size < current->_raw_size)
-       align_adjust = true;
+       align_adjust = TRUE;
 #endif
 
 #ifdef _LIB
@@ -3124,8 +3202,8 @@ coff_compute_section_file_positions (abfd)
 
       b = 0;
       if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
-         || bfd_write (&b, 1, 1, abfd) != 1)
-       return false;
+         || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
+       return FALSE;
     }
 
   /* Make sure the relocations are aligned.  We don't need to make
@@ -3134,9 +3212,9 @@ coff_compute_section_file_positions (abfd)
   sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
 
   obj_relocbase (abfd) = sofar;
-  abfd->output_has_begun = true;
+  abfd->output_has_begun = TRUE;
 
-  return true;
+  return TRUE;
 }
 
 #if 0
@@ -3148,7 +3226,7 @@ coff_compute_section_file_positions (abfd)
 /* If .file, .text, .data, .bss symbols are missing, add them.  */
 /* @@ Should we only be adding missing symbols, or overriding the aux
    values for existing section symbols?  */
-static boolean
+static bfd_boolean
 coff_add_missing_symbols (abfd)
      bfd *abfd;
 {
@@ -3157,11 +3235,12 @@ coff_add_missing_symbols (abfd)
   asymbol **sympp2;
   unsigned int i;
   int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
+  bfd_size_type amt;
 
   for (i = 0; i < nsyms; i++)
     {
       coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
-      CONST char *name;
+      const char *name;
       if (csym)
        {
          /* only do this if there is a coff representation of the input
@@ -3191,11 +3270,13 @@ coff_add_missing_symbols (abfd)
   need_file = 0;
 
   if (!need_text && !need_data && !need_bss && !need_file)
-    return true;
+    return TRUE;
   nsyms += need_text + need_data + need_bss + need_file;
-  sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
+  amt = nsyms;
+  amt *= sizeof (asymbol *);
+  sympp2 = (asymbol **) bfd_alloc (abfd, amt);
   if (!sympp2)
-    return false;
+    return FALSE;
   memcpy (sympp2, sympp, i * sizeof (asymbol *));
   if (need_file)
     {
@@ -3210,28 +3291,122 @@ coff_add_missing_symbols (abfd)
     sympp2[i++] = coff_section_symbol (abfd, _BSS);
   BFD_ASSERT (i == nsyms);
   bfd_set_symtab (abfd, sympp2, nsyms);
-  return true;
+  return TRUE;
 }
 
 #endif /* 0 */
 
+#ifdef COFF_IMAGE_WITH_PE
+
+static unsigned int pelength;
+static unsigned int peheader;
+
+static bfd_boolean
+coff_read_word (abfd, value)
+  bfd *abfd;
+  unsigned int *value;
+{
+  unsigned char b[2];
+  int status;
+
+  status = bfd_bread (b, (bfd_size_type) 2, abfd);
+  if (status < 1)
+    {
+      *value = 0;
+      return FALSE;
+    }
+
+  if (status == 1)
+    *value = (unsigned int) b[0];
+  else
+    *value = (unsigned int) (b[0] + (b[1] << 8));
+
+  pelength += (unsigned int) status;
+
+  return TRUE;
+}
+
+static unsigned int
+coff_compute_checksum (abfd)
+  bfd *abfd;
+{
+  bfd_boolean more_data;
+  file_ptr filepos;
+  unsigned int value;
+  unsigned int total;
+
+  total = 0;
+  pelength = 0;
+  filepos = (file_ptr) 0;
+
+  do
+    {
+      if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
+       return 0;
+
+      more_data = coff_read_word (abfd, &value);
+      total += value;
+      total = 0xffff & (total + (total >> 0x10));
+      filepos += 2;
+    }
+  while (more_data);
+
+  return (0xffff & (total + (total >> 0x10)));
+}
+
+static bfd_boolean
+coff_apply_checksum (abfd)
+  bfd *abfd;
+{
+  unsigned int computed;
+  unsigned int checksum = 0;
+
+  if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0)
+    return FALSE;
+
+  if (!coff_read_word (abfd, &peheader))
+    return FALSE;
+
+  if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
+    return FALSE;
+
+  checksum = 0;
+  bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);
+
+  if (bfd_seek (abfd, peheader, SEEK_SET) != 0)
+    return FALSE;
+
+  computed = coff_compute_checksum (abfd);
+
+  checksum = computed + pelength;
+
+  if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
+    return FALSE;
+
+  bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);
+
+  return TRUE;
+}
+
+#endif /* COFF_IMAGE_WITH_PE */
+
 /* SUPPRESS 558 */
 /* SUPPRESS 529 */
-static boolean
+static bfd_boolean
 coff_write_object_contents (abfd)
      bfd * abfd;
 {
   asection *current;
-  boolean hasrelocs = false;
-  boolean haslinno = false;
-  boolean hasdebug = false;
+  bfd_boolean hasrelocs = FALSE;
+  bfd_boolean haslinno = FALSE;
+  bfd_boolean hasdebug = FALSE;
   file_ptr scn_base;
   file_ptr reloc_base;
   file_ptr lineno_base;
   file_ptr sym_base;
   unsigned long reloc_size = 0, reloc_count = 0;
   unsigned long lnno_size = 0;
-  boolean long_section_names;
+  bfd_boolean long_section_names;
   asection *text_sec = NULL;
   asection *data_sec = NULL;
   asection *bss_sec = NULL;
@@ -3248,10 +3423,10 @@ coff_write_object_contents (abfd)
 
   lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd);
 
-  if (abfd->output_has_begun == false)
+  if (! abfd->output_has_begun)
     {
       if (! coff_compute_section_file_positions (abfd))
-       return false;
+       return FALSE;
     }
 
   reloc_base = obj_relocbase (abfd);
@@ -3263,7 +3438,7 @@ coff_write_object_contents (abfd)
     {
 #ifdef COFF_WITH_PE
       /* we store the actual reloc count in the first reloc's addr */
-      if (current->reloc_count > 0xffff)
+      if (obj_pe (abfd) && current->reloc_count >= 0xffff)
        reloc_count ++;
 #endif
       reloc_count += current->reloc_count;
@@ -3294,7 +3469,7 @@ coff_write_object_contents (abfd)
          reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
 #ifdef COFF_WITH_PE
          /* extra reloc to hold real count */
-         if (current->reloc_count > 0xffff)
+         if (obj_pe (abfd) && current->reloc_count >= 0xffff)
            reloc_base += bfd_coff_relsz (abfd);
 #endif
        }
@@ -3313,29 +3488,31 @@ coff_write_object_contents (abfd)
     {
       scn_base = bfd_coff_filhsz (abfd);
 #ifdef RS6000COFF_C
+#ifndef XCOFF64
       if (xcoff_data (abfd)->full_aouthdr)
        scn_base += bfd_coff_aoutsz (abfd);
       else
        scn_base += SMALL_AOUTSZ;
+#endif
 #endif
     }
 
   if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
-    return false;
+    return FALSE;
 
-  long_section_names = false;
+  long_section_names = FALSE;
   for (current = abfd->sections;
        current != NULL;
        current = current->next)
     {
       struct internal_scnhdr section;
-      boolean is_reloc_section = false;
+      bfd_boolean is_reloc_section = FALSE;
 
 #ifdef COFF_IMAGE_WITH_PE
       if (strcmp (current->name, ".reloc") == 0)
        {
-         is_reloc_section = true;
-         hasrelocs = true;
+         is_reloc_section = TRUE;
+         hasrelocs = TRUE;
          pe_data (abfd)->has_reloc_section = 1;
        }
 #endif
@@ -3356,7 +3533,7 @@ coff_write_object_contents (abfd)
            memset (section.s_name, 0, SCNNMLEN);
            sprintf (section.s_name, "/%lu", (unsigned long) string_size);
            string_size += len + 1;
-           long_section_names = true;
+           long_section_names = TRUE;
          }
       }
 #endif
@@ -3407,13 +3584,13 @@ coff_write_object_contents (abfd)
 #ifndef COFF_IMAGE_WITH_PE
       /* In PEI, relocs come in the .reloc section.  */
       if (current->reloc_count != 0)
-       hasrelocs = true;
+       hasrelocs = TRUE;
 #endif
       if (current->lineno_count != 0)
-       haslinno = true;
+       haslinno = TRUE;
       if ((current->flags & SEC_DEBUGGING) != 0
          && ! is_reloc_section)
-       hasdebug = true;
+       hasdebug = TRUE;
 
 #ifdef RS6000COFF_C
 #ifndef XCOFF64
@@ -3466,10 +3643,11 @@ coff_write_object_contents (abfd)
 #endif
        {
          SCNHDR buff;
+         bfd_size_type amt = bfd_coff_scnhsz (abfd);
+
          if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
-             || bfd_write ((PTR) (&buff), 1, bfd_coff_scnhsz (abfd), abfd)
-             != bfd_coff_scnhsz (abfd))
-           return false;
+             || bfd_bwrite ((PTR) &buff, amt, abfd) != amt)
+           return FALSE;
        }
 
 #ifdef COFF_WITH_PE
@@ -3568,6 +3746,7 @@ coff_write_object_contents (abfd)
     }
 
 #ifdef RS6000COFF_C
+#ifndef XCOFF64
   /* XCOFF handles overflows in the reloc and line number count fields
      by creating a new section header to hold the correct values.  */
   for (current = abfd->sections; current != NULL; current = current->next)
@@ -3576,6 +3755,7 @@ coff_write_object_contents (abfd)
        {
          struct internal_scnhdr scnhdr;
          SCNHDR buff;
+         bfd_size_type amt;
 
          internal_f.f_nscns++;
          strncpy (&(scnhdr.s_name[0]), current->name, 8);
@@ -3588,12 +3768,13 @@ coff_write_object_contents (abfd)
          scnhdr.s_nreloc = current->target_index;
          scnhdr.s_nlnno = current->target_index;
          scnhdr.s_flags = STYP_OVRFLO;
+         amt = bfd_coff_scnhsz (abfd);
          if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
-             || bfd_write ((PTR) &buff, 1, bfd_coff_scnhsz (abfd), abfd)
-             != bfd_coff_scnhsz (abfd))
-           return false;
+             || bfd_bwrite ((PTR) &buff, amt, abfd) != amt)
+           return FALSE;
        }
     }
+#endif
 #endif
 
   /* OK, now set up the filehdr...  */
@@ -3616,10 +3797,12 @@ coff_write_object_contents (abfd)
     {
       internal_f.f_opthdr = 0;
 #ifdef RS6000COFF_C
+#ifndef XCOFF64
       if (xcoff_data (abfd)->full_aouthdr)
        internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
       else
        internal_f.f_opthdr = SMALL_AOUTSZ;
+#endif
 #endif
     }
 
@@ -3784,6 +3967,11 @@ coff_write_object_contents (abfd)
     internal_a.magic = MIPS_PE_MAGIC;
 #endif
 
+#ifdef OR32
+#define __A_MAGIC_SET__
+    internal_a.magic = NMAGIC; /* Assume separate i/d.  */
+#endif
+
 #ifndef __A_MAGIC_SET__
 #include "Your aouthdr magic number is not being set!"
 #else
@@ -3802,17 +3990,17 @@ coff_write_object_contents (abfd)
       int firstundef;
 #if 0
       if (!coff_add_missing_symbols (abfd))
-       return false;
+       return FALSE;
 #endif
       if (!coff_renumber_symbols (abfd, &firstundef))
-       return false;
+       return FALSE;
       coff_mangle_symbols (abfd);
       if (! coff_write_symbols (abfd))
-       return false;
+       return FALSE;
       if (! coff_write_linenumbers (abfd))
-       return false;
+       return FALSE;
       if (! coff_write_relocs (abfd, firstundef))
-       return false;
+       return FALSE;
     }
 #ifdef COFF_LONG_SECTION_NAMES
   else if (long_section_names && ! obj_coff_strings_written (abfd))
@@ -3820,7 +4008,7 @@ coff_write_object_contents (abfd)
       /* 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;
+       return FALSE;
     }
 #endif
 #ifdef COFF_IMAGE_WITH_PE
@@ -3833,10 +4021,10 @@ coff_write_object_contents (abfd)
          rounded up to the page size.  */
       b = 0;
       if (bfd_seek (abfd,
-                   BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
+                   (file_ptr) BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
                    SEEK_SET) != 0
-         || bfd_write (&b, 1, 1, abfd) != 1)
-       return false;
+         || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
+       return FALSE;
     }
 #endif
 #endif
@@ -3939,7 +4127,7 @@ coff_write_object_contents (abfd)
              internal_a.o_cputype = 4;
              break;
            case bfd_arch_powerpc:
-             if (bfd_get_mach (abfd) == 0)
+             if (bfd_get_mach (abfd) == bfd_mach_ppc)
                internal_a.o_cputype = 3;
              else
                internal_a.o_cputype = 1;
@@ -3955,23 +4143,23 @@ coff_write_object_contents (abfd)
 
   /* now write them */
   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
-    return false;
+    return FALSE;
 
   {
     char * buff;
-    bfd_size_type amount;
+    bfd_size_type amount = bfd_coff_filhsz (abfd);
 
-    buff = bfd_malloc (bfd_coff_filhsz (abfd));
+    buff = bfd_malloc (amount);
     if (buff == NULL)
-      return false;
+      return FALSE;
 
-    coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
-    amount = bfd_write ((PTR) buff, 1, bfd_coff_filhsz (abfd), abfd);
+    bfd_coff_swap_filehdr_out (abfd, (PTR) &internal_f, (PTR) buff);
+    amount = bfd_bwrite ((PTR) buff, amount, abfd);
 
     free (buff);
 
     if (amount != bfd_coff_filhsz (abfd))
-      return false;
+      return FALSE;
   }
 
   if (abfd->flags & EXEC_P)
@@ -3979,19 +4167,24 @@ coff_write_object_contents (abfd)
       /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
         include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)) */
       char * buff;
-      bfd_size_type amount;
+      bfd_size_type amount = bfd_coff_aoutsz (abfd);
 
-      buff = bfd_malloc (bfd_coff_aoutsz (abfd));
+      buff = bfd_malloc (amount);
       if (buff == NULL)
-       return false;
+       return FALSE;
 
-      coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
-      amount = bfd_write ((PTR) buff, 1, bfd_coff_aoutsz (abfd), abfd);
+      coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) buff);
+      amount = bfd_bwrite ((PTR) buff, amount, abfd);
 
       free (buff);
 
       if (amount != bfd_coff_aoutsz (abfd))
-       return false;
+       return FALSE;
+
+#ifdef COFF_IMAGE_WITH_PE
+      if (! coff_apply_checksum (abfd))
+       return FALSE;
+#endif
     }
 #ifdef RS6000COFF_C
   else
@@ -4005,15 +4198,15 @@ coff_write_object_contents (abfd)
        size = bfd_coff_aoutsz (abfd);
       else
        size = SMALL_AOUTSZ;
-      if (bfd_write ((PTR) &buff, 1, size, abfd) != size)
-       return false;
+      if (bfd_bwrite ((PTR) &buff, (bfd_size_type) size, abfd) != size)
+       return FALSE;
     }
 #endif
 
-  return true;
+  return TRUE;
 }
 
-static boolean
+static bfd_boolean
 coff_set_section_contents (abfd, section, location, offset, count)
      bfd * abfd;
      sec_ptr section;
@@ -4021,10 +4214,10 @@ coff_set_section_contents (abfd, section, location, offset, count)
      file_ptr offset;
      bfd_size_type count;
 {
-  if (abfd->output_has_begun == false) /* set by bfd.c handler */
+  if (! abfd->output_has_begun)        /* set by bfd.c handler */
     {
       if (! coff_compute_section_file_positions (abfd))
-       return false;
+       return FALSE;
     }
 
 #if defined(_LIB) && !defined(TARG_AUX)
@@ -4070,19 +4263,18 @@ coff_set_section_contents (abfd, section, location, offset, count)
   /* Don't write out bss sections - one way to do this is to
        see if the filepos has not been set.  */
   if (section->filepos == 0)
-    return true;
+    return TRUE;
 
-  if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
-    return false;
+  if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0)
+    return FALSE;
 
-  if (count != 0)
-    {
-      return (bfd_write (location, 1, count, abfd) == count) ? true : false;
-    }
-  return true;
+  if (count == 0)
+    return TRUE;
+
+  return bfd_bwrite (location, count, abfd) == count;
 }
 #if 0
-static boolean
+static bfd_boolean
 coff_close_and_cleanup (abfd)
      bfd *abfd;
 {
@@ -4091,35 +4283,34 @@ coff_close_and_cleanup (abfd)
       {
       case bfd_archive:
        if (!_bfd_write_archive_contents (abfd))
-         return false;
+         return FALSE;
        break;
       case bfd_object:
        if (!coff_write_object_contents (abfd))
-         return false;
+         return FALSE;
        break;
       default:
        bfd_set_error (bfd_error_invalid_operation);
-       return false;
+       return FALSE;
       }
 
   /* We depend on bfd_close to free all the memory on the objalloc.  */
-  return true;
+  return TRUE;
 }
 
 #endif
 
 static PTR
-buy_and_read (abfd, where, seek_direction, size)
+buy_and_read (abfd, where, size)
      bfd *abfd;
      file_ptr where;
-     int seek_direction;
-     size_t size;
+     bfd_size_type size;
 {
   PTR area = (PTR) bfd_alloc (abfd, size);
   if (!area)
     return (NULL);
-  if (bfd_seek (abfd, where, seek_direction) != 0
-      || bfd_read (area, 1, size, abfd) != size)
+  if (bfd_seek (abfd, where, SEEK_SET) != 0
+      || bfd_bread (area, size, abfd) != size)
     return (NULL);
   return (area);
 }                              /* buy_and_read() */
@@ -4148,25 +4339,23 @@ SUBSUBSECTION
 
 */
 
-static boolean
+static bfd_boolean
 coff_slurp_line_table (abfd, asect)
      bfd *abfd;
      asection *asect;
 {
   LINENO *native_lineno;
   alent *lineno_cache;
+  bfd_size_type amt;
 
   BFD_ASSERT (asect->lineno == (alent *) NULL);
 
-  native_lineno = (LINENO *) buy_and_read (abfd,
-                                          asect->line_filepos,
-                                          SEEK_SET,
-                                          (size_t) (bfd_coff_linesz (abfd) *
-                                                    asect->lineno_count));
-  lineno_cache =
-    (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
+  amt = (bfd_size_type) bfd_coff_linesz (abfd) * asect->lineno_count;
+  native_lineno = (LINENO *) buy_and_read (abfd, asect->line_filepos, amt);
+  amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
+  lineno_cache = (alent *) bfd_alloc (abfd, amt);
   if (lineno_cache == NULL)
-    return false;
+    return FALSE;
   else
     {
       unsigned int counter = 0;
@@ -4181,20 +4370,20 @@ coff_slurp_line_table (abfd, asect)
 
          if (cache_ptr->line_number == 0)
            {
-             boolean warned;
-             long symndx;
+             bfd_boolean warned;
+             bfd_signed_vma symndx;
              coff_symbol_type *sym;
 
-             warned = false;
+             warned = FALSE;
              symndx = dst.l_addr.l_symndx;
              if (symndx < 0
-                 || (unsigned long) symndx >= obj_raw_syment_count (abfd))
+                 || (bfd_vma) symndx >= obj_raw_syment_count (abfd))
                {
                  (*_bfd_error_handler)
                    (_("%s: warning: illegal symbol index %ld in line numbers"),
-                    bfd_get_filename (abfd), dst.l_addr.l_symndx);
+                    bfd_archive_filename (abfd), dst.l_addr.l_symndx);
                  symndx = 0;
-                 warned = true;
+                 warned = TRUE;
                }
              /* FIXME: We should not be casting between ints and
                  pointers like this.  */
@@ -4206,7 +4395,7 @@ coff_slurp_line_table (abfd, asect)
                {
                  (*_bfd_error_handler)
                    (_("%s: warning: duplicate line number information for `%s'"),
-                    bfd_get_filename (abfd),
+                    bfd_archive_filename (abfd),
                     bfd_asymbol_name (&sym->symbol));
                }
              sym->lineno = cache_ptr;
@@ -4226,47 +4415,46 @@ coff_slurp_line_table (abfd, asect)
     }
   asect->lineno = lineno_cache;
   /* FIXME, free native_lineno here, or use alloca or something.  */
-  return true;
+  return TRUE;
 }
 
 /* Slurp in the symbol table, converting it to generic form.  Note
    that if coff_relocate_section is defined, the linker will read
    symbols via coff_link_add_symbols, rather than via this routine.  */
 
-static boolean
+static bfd_boolean
 coff_slurp_symbol_table (abfd)
      bfd * abfd;
 {
   combined_entry_type *native_symbols;
   coff_symbol_type *cached_area;
   unsigned int *table_ptr;
+  bfd_size_type amt;
 
   unsigned int number_of_symbols = 0;
 
   if (obj_symbols (abfd))
-    return true;
+    return TRUE;
 
   /* Read in the symbol table */
   if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
     {
-      return (false);
+      return FALSE;
     }                          /* on error */
 
   /* Allocate enough room for all the symbols in cached form */
-  cached_area = ((coff_symbol_type *)
-                bfd_alloc (abfd,
-                           (obj_raw_syment_count (abfd)
-                            * sizeof (coff_symbol_type))));
-
+  amt = obj_raw_syment_count (abfd);
+  amt *= sizeof (coff_symbol_type);
+  cached_area = (coff_symbol_type *) bfd_alloc (abfd, amt);
   if (cached_area == NULL)
-    return false;
-  table_ptr = ((unsigned int *)
-              bfd_alloc (abfd,
-                         (obj_raw_syment_count (abfd)
-                          * sizeof (unsigned int))));
+    return FALSE;
+
+  amt = obj_raw_syment_count (abfd);
+  amt *= sizeof (unsigned int);
+  table_ptr = (unsigned int *) bfd_alloc (abfd, amt);
 
   if (table_ptr == NULL)
-    return false;
+    return FALSE;
   else
     {
       coff_symbol_type *dst = cached_area;
@@ -4284,7 +4472,7 @@ coff_slurp_symbol_table (abfd)
          dst->symbol.section = coff_section_from_bfd_index (abfd,
                                                     src->u.syment.n_scnum);
          dst->symbol.flags = 0;
-         dst->done_lineno = false;
+         dst->done_lineno = FALSE;
 
          switch (src->u.syment.n_sclass)
            {
@@ -4375,16 +4563,14 @@ coff_slurp_symbol_table (abfd)
 
 #ifdef COFF_WITH_PE
              if (src->u.syment.n_sclass == C_NT_WEAK)
-               dst->symbol.flags = BSF_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;
-               }
+               dst->symbol.flags = BSF_LOCAL;
 #endif
-
              if (src->u.syment.n_sclass == C_WEAKEXT)
-               dst->symbol.flags = BSF_WEAK;
+               dst->symbol.flags |= BSF_WEAK;
 
              break;
 
@@ -4566,7 +4752,7 @@ coff_slurp_symbol_table (abfd)
            default:
              (*_bfd_error_handler)
                (_("%s: Unrecognized storage class %d for %s symbol `%s'"),
-                bfd_get_filename (abfd), src->u.syment.n_sclass,
+                bfd_archive_filename (abfd), src->u.syment.n_sclass,
                 dst->symbol.section->name, dst->symbol.name);
              dst->symbol.flags = BSF_DEBUGGING;
              dst->symbol.value = (src->u.syment.n_value);
@@ -4600,7 +4786,7 @@ coff_slurp_symbol_table (abfd)
        p = p->next;
       }
   }
-  return true;
+  return TRUE;
 }                              /* coff_slurp_symbol_table() */
 
 /* Classify a COFF symbol.  A couple of targets have globally visible
@@ -4697,7 +4883,7 @@ coff_classify_symbol (abfd, syment)
 
       (*_bfd_error_handler)
        (_("warning: %s: local symbol `%s' has no section"),
-        bfd_get_filename (abfd),
+        bfd_archive_filename (abfd),
         _bfd_coff_internal_syment_name (abfd, syment, buf));
     }
 
@@ -4752,7 +4938,7 @@ SUBSUBSECTION
   }
 #endif
 
-static boolean
+static bfd_boolean
 coff_slurp_reloc_table (abfd, asect, symbols)
      bfd * abfd;
      sec_ptr asect;
@@ -4761,28 +4947,24 @@ coff_slurp_reloc_table (abfd, asect, symbols)
   RELOC *native_relocs;
   arelent *reloc_cache;
   arelent *cache_ptr;
-
   unsigned int idx;
+  bfd_size_type amt;
 
   if (asect->relocation)
-    return true;
+    return TRUE;
   if (asect->reloc_count == 0)
-    return true;
+    return TRUE;
   if (asect->flags & SEC_CONSTRUCTOR)
-    return true;
+    return TRUE;
   if (!coff_slurp_symbol_table (abfd))
-    return false;
-  native_relocs =
-    (RELOC *) buy_and_read (abfd,
-                           asect->rel_filepos,
-                           SEEK_SET,
-                           (size_t) (bfd_coff_relsz (abfd) *
-                                     asect->reloc_count));
-  reloc_cache = (arelent *)
-    bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
+    return FALSE;
+  amt = (bfd_size_type) bfd_coff_relsz (abfd) * asect->reloc_count;
+  native_relocs = (RELOC *) buy_and_read (abfd, asect->rel_filepos, amt);
+  amt = (bfd_size_type) asect->reloc_count * sizeof (arelent);
+  reloc_cache = (arelent *) bfd_alloc (abfd, amt);
 
   if (reloc_cache == NULL)
-    return false;
+    return FALSE;
 
   for (idx = 0; idx < asect->reloc_count; idx++)
     {
@@ -4808,7 +4990,7 @@ coff_slurp_reloc_table (abfd, asect, symbols)
            {
              (*_bfd_error_handler)
                (_("%s: warning: illegal symbol index %ld in relocs"),
-                bfd_get_filename (abfd), dst.r_symndx);
+                bfd_archive_filename (abfd), dst.r_symndx);
              cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
              ptr = NULL;
            }
@@ -4846,14 +5028,14 @@ coff_slurp_reloc_table (abfd, asect, symbols)
        {
          (*_bfd_error_handler)
            (_("%s: illegal relocation type %d at address 0x%lx"),
-            bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
+            bfd_archive_filename (abfd), dst.r_type, (long) dst.r_vaddr);
          bfd_set_error (bfd_error_bad_value);
-         return false;
+         return FALSE;
        }
     }
 
   asect->relocation = reloc_cache;
-  return true;
+  return TRUE;
 }
 
 #ifndef coff_rtype_to_howto
@@ -4926,7 +5108,6 @@ coff_canonicalize_reloc (abfd, section, relptr, symbols)
 
       for (; count++ < section->reloc_count;)
        *relptr++ = tblptr++;
-
     }
   *relptr = 0;
   return section->reloc_count;
@@ -4987,6 +5168,10 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
 }
 #endif
 
+#ifndef coff_bfd_link_hash_table_free
+#define coff_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
+#endif
+
 /* If coff_relocate_section is defined, we can use the optimized COFF
    backend linker.  Otherwise we must continue to use the old linker.  */
 #ifdef coff_relocate_section
@@ -5010,6 +5195,7 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
 #define coff_bfd_final_link _bfd_generic_final_link
 #endif /* ! defined (coff_relocate_section) */
 
+#define coff_bfd_link_just_syms _bfd_generic_link_just_syms
 #define coff_bfd_link_split_section  _bfd_generic_link_split_section
 
 #ifndef coff_start_final_link
@@ -5026,10 +5212,10 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
 
 #ifndef coff_link_output_has_begun
 
-static boolean coff_link_output_has_begun
+static bfd_boolean coff_link_output_has_begun
   PARAMS ((bfd *, struct coff_final_link_info *));
 
-static boolean
+static bfd_boolean
 coff_link_output_has_begun (abfd, info)
      bfd * abfd;
      struct coff_final_link_info * info ATTRIBUTE_UNUSED;
@@ -5040,15 +5226,15 @@ coff_link_output_has_begun (abfd, info)
 
 #ifndef coff_final_link_postscript
 
-static boolean coff_final_link_postscript
+static bfd_boolean coff_final_link_postscript
   PARAMS ((bfd *, struct coff_final_link_info *));
 
-static boolean
+static bfd_boolean
 coff_final_link_postscript (abfd, pfinfo)
      bfd * abfd ATTRIBUTE_UNUSED;
      struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED;
 {
-  return true;
+  return TRUE;
 }
 #endif
 
@@ -5104,20 +5290,20 @@ static const bfd_coff_backend_data bfd_coff_std_swap_table =
   coff_SWAP_scnhdr_out,
   FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
 #ifdef COFF_LONG_FILENAMES
-  true,
+  TRUE,
 #else
-  false,
+  FALSE,
 #endif
 #ifdef COFF_LONG_SECTION_NAMES
-  true,
+  TRUE,
 #else
-  false,
+  FALSE,
 #endif
   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
-  true,
+  TRUE,
 #else
-  false,
+  FALSE,
 #endif
 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
   4,
@@ -5202,6 +5388,14 @@ static const bfd_coff_backend_data bfd_coff_std_swap_table =
 #define coff_bfd_gc_sections               bfd_generic_gc_sections
 #endif
 
+#ifndef coff_bfd_merge_sections
+#define coff_bfd_merge_sections                    bfd_generic_merge_sections
+#endif
+
+#ifndef coff_bfd_discard_group
+#define coff_bfd_discard_group             bfd_generic_discard_group
+#endif
+
 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE)        \
 const bfd_target VAR =                                                 \
 {                                                                      \
This page took 0.070822 seconds and 4 git commands to generate.