]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/cofflink.c
[PATCH] fix windmc typedef bug
[thirdparty/binutils-gdb.git] / bfd / cofflink.c
index 4756fc3070f69bd202e59032ddeccd5ffd95a285..27ac20e80da814065c61f250c0eac5072e7615f5 100644 (file)
@@ -1,5 +1,5 @@
 /* COFF specific linker code.
 /* COFF specific linker code.
-   Copyright (C) 1994-2016 Free Software Foundation, Inc.
+   Copyright (C) 1994-2020 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -109,7 +109,7 @@ struct bfd_link_hash_table *
 _bfd_coff_link_hash_table_create (bfd *abfd)
 {
   struct coff_link_hash_table *ret;
 _bfd_coff_link_hash_table_create (bfd *abfd)
 {
   struct coff_link_hash_table *ret;
-  bfd_size_type amt = sizeof (struct coff_link_hash_table);
+  size_t amt = sizeof (struct coff_link_hash_table);
 
   ret = (struct coff_link_hash_table *) bfd_malloc (amt);
   if (ret == NULL)
 
   ret = (struct coff_link_hash_table *) bfd_malloc (amt);
   if (ret == NULL)
@@ -212,11 +212,16 @@ coff_link_check_archive_element (bfd *abfd,
   if (h->type != bfd_link_hash_undefined)
     return TRUE;
 
   if (h->type != bfd_link_hash_undefined)
     return TRUE;
 
+  /* PR 22369 - Skip non COFF objects in the archive.  */
+  if (! bfd_family_coff (abfd))
+    return TRUE;
+
+  /* Include this element?  */
   if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd))
   if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd))
-    return FALSE;
+    return TRUE;
   *pneeded = TRUE;
 
   *pneeded = TRUE;
 
-  return coff_link_add_object_symbols (abfd, info);
+  return bfd_link_add_symbols (abfd, info);
 }
 
 /* Add all the symbols from an object file to the hash table.  */
 }
 
 /* Add all the symbols from an object file to the hash table.  */
@@ -289,7 +294,7 @@ coff_link_add_symbols (bfd *abfd,
            goto error_return;
 
          /* We must copy the name into memory if we got it from the
            goto error_return;
 
          /* We must copy the name into memory if we got it from the
-             syment itself, rather than the string table.  */
+            syment itself, rather than the string table.  */
          copy = default_copy;
          if (sym._n._n_n._n_zeroes != 0
              || sym._n._n_n._n_offset == 0)
          copy = default_copy;
          if (sym._n._n_n._n_zeroes != 0
              || sym._n._n_n._n_offset == 0)
@@ -305,7 +310,9 @@ coff_link_add_symbols (bfd *abfd,
            case COFF_SYMBOL_GLOBAL:
              flags = BSF_EXPORT | BSF_GLOBAL;
              section = coff_section_from_bfd_index (abfd, sym.n_scnum);
            case COFF_SYMBOL_GLOBAL:
              flags = BSF_EXPORT | BSF_GLOBAL;
              section = coff_section_from_bfd_index (abfd, sym.n_scnum);
-             if (! obj_pe (abfd))
+             if (discarded_section (section))
+               section = bfd_und_section_ptr;
+             else if (! obj_pe (abfd))
                value -= section->vma;
              break;
 
                value -= section->vma;
              break;
 
@@ -322,6 +329,8 @@ coff_link_add_symbols (bfd *abfd,
            case COFF_SYMBOL_PE_SECTION:
              flags = BSF_SECTION_SYM | BSF_GLOBAL;
              section = coff_section_from_bfd_index (abfd, sym.n_scnum);
            case COFF_SYMBOL_PE_SECTION:
              flags = BSF_SECTION_SYM | BSF_GLOBAL;
              section = coff_section_from_bfd_index (abfd, sym.n_scnum);
+             if (discarded_section (section))
+               section = bfd_und_section_ptr;
              break;
            }
 
              break;
            }
 
@@ -331,8 +340,8 @@ coff_link_add_symbols (bfd *abfd,
          addit = TRUE;
 
          /* In the PE format, section symbols actually refer to the
          addit = TRUE;
 
          /* In the PE format, section symbols actually refer to the
-             start of the output section.  We handle them specially
-             here.  */
+            start of the output section.  We handle them specially
+            here.  */
          if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0)
            {
              *sym_hash = coff_link_hash_lookup (coff_hash_table (info),
          if (obj_pe (abfd) && (flags & BSF_SECTION_SYM) != 0)
            {
              *sym_hash = coff_link_hash_lookup (coff_hash_table (info),
@@ -343,8 +352,8 @@ coff_link_add_symbols (bfd *abfd,
                       & COFF_LINK_HASH_PE_SECTION_SYMBOL) == 0
                      && (*sym_hash)->root.type != bfd_link_hash_undefined
                      && (*sym_hash)->root.type != bfd_link_hash_undefweak)
                       & COFF_LINK_HASH_PE_SECTION_SYMBOL) == 0
                      && (*sym_hash)->root.type != bfd_link_hash_undefined
                      && (*sym_hash)->root.type != bfd_link_hash_undefweak)
-                   (*_bfd_error_handler)
-                     ("Warning: symbol `%s' is both section and non-section",
+                   _bfd_error_handler
+                     (_("warning: symbol `%s' is both section and non-section"),
                       name);
 
                  addit = FALSE;
                       name);
 
                  addit = FALSE;
@@ -406,10 +415,10 @@ coff_link_add_symbols (bfd *abfd,
              COFF_LINK_HASH_PE_SECTION_SYMBOL;
 
          /* Limit the alignment of a common symbol to the possible
              COFF_LINK_HASH_PE_SECTION_SYMBOL;
 
          /* Limit the alignment of a common symbol to the possible
-             alignment of a section.  There is no point to permitting
-             a higher alignment for a common symbol: we can not
-             guarantee it, and it may cause us to allocate extra space
-             in the common section.  */
+            alignment of a section.  There is no point to permitting
+            a higher alignment for a common symbol: we can not
+            guarantee it, and it may cause us to allocate extra space
+            in the common section.  */
          if (section == bfd_com_section_ptr
              && (*sym_hash)->root.type == bfd_link_hash_common
              && ((*sym_hash)->root.u.c.p->alignment_power
          if (section == bfd_com_section_ptr
              && (*sym_hash)->root.type == bfd_link_hash_common
              && ((*sym_hash)->root.u.c.p->alignment_power
@@ -420,42 +429,44 @@ coff_link_add_symbols (bfd *abfd,
          if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd))
            {
              /* If we don't have any symbol information currently in
          if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd))
            {
              /* If we don't have any symbol information currently in
-                 the hash table, or if we are looking at a symbol
-                 definition, then update the symbol class and type in
-                 the hash table.  */
-             if (((*sym_hash)->symbol_class == C_NULL
-                  && (*sym_hash)->type == T_NULL)
-                 || sym.n_scnum != 0
-                 || (sym.n_value != 0
-                     && (*sym_hash)->root.type != bfd_link_hash_defined
-                     && (*sym_hash)->root.type != bfd_link_hash_defweak))
-               {
-                 (*sym_hash)->symbol_class = sym.n_sclass;
-                 if (sym.n_type != T_NULL)
-                   {
-                     /* We want to warn if the type changed, but not
-                        if it changed from an unspecified type.
-                        Testing the whole type byte may work, but the
-                        change from (e.g.) a function of unspecified
-                        type to function of known type also wants to
-                        skip the warning.  */
-                     if ((*sym_hash)->type != T_NULL
-                         && (*sym_hash)->type != sym.n_type
-                         && !(DTYPE ((*sym_hash)->type) == DTYPE (sym.n_type)
-                              && (BTYPE ((*sym_hash)->type) == T_NULL
-                                  || BTYPE (sym.n_type) == T_NULL)))
-                       (*_bfd_error_handler)
-                         (_("Warning: type of symbol `%s' changed from %d to %d in %B"),
-                          abfd, name, (*sym_hash)->type, sym.n_type);
-
-                     /* We don't want to change from a meaningful
-                        base type to a null one, but if we know
-                        nothing, take what little we might now know.  */
-                     if (BTYPE (sym.n_type) != T_NULL
-                         || (*sym_hash)->type == T_NULL)
+                the hash table, or if we are looking at a symbol
+                definition, then update the symbol class and type in
+                the hash table.  */
+             if (((*sym_hash)->symbol_class == C_NULL
+                  && (*sym_hash)->type == T_NULL)
+                 || sym.n_scnum != 0
+                 || (sym.n_value != 0
+                     && (*sym_hash)->root.type != bfd_link_hash_defined
+                     && (*sym_hash)->root.type != bfd_link_hash_defweak))
+               {
+                 (*sym_hash)->symbol_class = sym.n_sclass;
+                 if (sym.n_type != T_NULL)
+                   {
+                     /* We want to warn if the type changed, but not
+                        if it changed from an unspecified type.
+                        Testing the whole type byte may work, but the
+                        change from (e.g.) a function of unspecified
+                        type to function of known type also wants to
+                        skip the warning.  */
+                     if ((*sym_hash)->type != T_NULL
+                         && (*sym_hash)->type != sym.n_type
+                         && !(DTYPE ((*sym_hash)->type) == DTYPE (sym.n_type)
+                              && (BTYPE ((*sym_hash)->type) == T_NULL
+                                  || BTYPE (sym.n_type) == T_NULL)))
+                       _bfd_error_handler
+                         /* xgettext: c-format */
+                         (_("warning: type of symbol `%s' changed"
+                            " from %d to %d in %pB"),
+                          name, (*sym_hash)->type, sym.n_type, abfd);
+
+                     /* We don't want to change from a meaningful
+                        base type to a null one, but if we know
+                        nothing, take what little we might now know.  */
+                     if (BTYPE (sym.n_type) != T_NULL
+                         || (*sym_hash)->type == T_NULL)
                        (*sym_hash)->type = sym.n_type;
                        (*sym_hash)->type = sym.n_type;
-                   }
-                 (*sym_hash)->auxbfd = abfd;
+                   }
+                 (*sym_hash)->auxbfd = abfd;
                  if (sym.n_numaux != 0)
                    {
                      union internal_auxent *alloc;
                  if (sym.n_numaux != 0)
                    {
                      union internal_auxent *alloc;
@@ -485,8 +496,8 @@ coff_link_add_symbols (bfd *abfd,
              && (*sym_hash)->numaux != 0)
            {
              /* Some PE sections (such as .bss) have a zero size in
              && (*sym_hash)->numaux != 0)
            {
              /* Some PE sections (such as .bss) have a zero size in
-                 the section header, but a non-zero size in the AUX
-                 record.  Correct that here.
+                the section header, but a non-zero size in the AUX
+                record.  Correct that here.
 
                 FIXME: This is not at all the right place to do this.
                 For example, it won't help objdump.  This needs to be
 
                 FIXME: This is not at all the right place to do this.
                 For example, it won't help objdump.  This needs to be
@@ -496,8 +507,8 @@ coff_link_add_symbols (bfd *abfd,
                section->size = (*sym_hash)->aux[0].x_scn.x_scnlen;
 
              /* FIXME: We could test whether the section sizes
                section->size = (*sym_hash)->aux[0].x_scn.x_scnlen;
 
              /* FIXME: We could test whether the section sizes
-                 matches the size in the aux entry, but apparently
-                 that sometimes fails unexpectedly.  */
+                matches the size in the aux entry, but apparently
+                that sometimes fails unexpectedly.  */
            }
        }
 
            }
        }
 
@@ -678,7 +689,7 @@ _bfd_coff_final_link (bfd *abfd,
          rel_filepos += o->reloc_count * relsz;
          /* In PE COFF, if there are at least 0xffff relocations an
             extra relocation will be written out to encode the count.  */
          rel_filepos += o->reloc_count * relsz;
          /* In PE COFF, if there are at least 0xffff relocations an
             extra relocation will be written out to encode the count.  */
-         if (obj_pe (abfd) && o->reloc_count >= 0xffff)
+         if ((obj_pe (abfd) || obj_go32 (abfd)) && o->reloc_count >= 0xffff)
            rel_filepos += relsz;
        }
 
            rel_filepos += relsz;
        }
 
@@ -686,10 +697,10 @@ _bfd_coff_final_link (bfd *abfd,
          && strlen (o->name) > SCNNMLEN)
        {
          /* This section has a long name which must go in the string
          && strlen (o->name) > SCNNMLEN)
        {
          /* This section has a long name which must go in the string
-             table.  This must correspond to the code in
-             coff_write_object_contents which puts the string index
-             into the s_name field of the section header.  That is why
-             we pass hash as FALSE.  */
+            table.  This must correspond to the code in
+            coff_write_object_contents which puts the string index
+            into the s_name field of the section header.  That is why
+            we pass hash as FALSE.  */
          if (_bfd_stringtab_add (flaginfo.strtab, o->name, FALSE, FALSE)
              == (bfd_size_type) -1)
            goto error_return;
          if (_bfd_stringtab_add (flaginfo.strtab, o->name, FALSE, FALSE)
              == (bfd_size_type) -1)
            goto error_return;
@@ -704,7 +715,7 @@ _bfd_coff_final_link (bfd *abfd,
       unsigned int i;
 
       /* We use section_count + 1, rather than section_count, because
       unsigned int i;
 
       /* We use section_count + 1, rather than section_count, because
-         the target_index fields are 1 based.  */
+        the target_index fields are 1 based.  */
       amt = abfd->section_count + 1;
       amt *= sizeof (struct coff_link_section_info);
       flaginfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
       amt = abfd->section_count + 1;
       amt *= sizeof (struct coff_link_section_info);
       flaginfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
@@ -735,13 +746,13 @@ _bfd_coff_final_link (bfd *abfd,
       if (o->reloc_count != 0)
        {
          /* We don't know the indices of global symbols until we have
       if (o->reloc_count != 0)
        {
          /* We don't know the indices of global symbols until we have
-             written out all the local symbols.  For each section in
-             the output file, we keep an array of pointers to hash
-             table entries.  Each entry in the array corresponds to a
-             reloc.  When we find a reloc against a global symbol, we
-             set the corresponding entry in this array so that we can
-             fix up the symbol index after we have written out all the
-             local symbols.
+            written out all the local symbols.  For each section in
+            the output file, we keep an array of pointers to hash
+            table entries.  Each entry in the array corresponds to a
+            reloc.  When we find a reloc against a global symbol, we
+            set the corresponding entry in this array so that we can
+            fix up the symbol index after we have written out all the
+            local symbols.
 
             Because of this problem, we also keep the relocs in
             memory until the end of the link.  This wastes memory,
 
             Because of this problem, we also keep the relocs in
             memory until the end of the link.  This wastes memory,
@@ -751,11 +762,11 @@ _bfd_coff_final_link (bfd *abfd,
          amt = o->reloc_count;
          amt *= sizeof (struct internal_reloc);
          flaginfo.section_info[o->target_index].relocs =
          amt = o->reloc_count;
          amt *= sizeof (struct internal_reloc);
          flaginfo.section_info[o->target_index].relocs =
-              (struct internal_reloc *) bfd_malloc (amt);
+             (struct internal_reloc *) bfd_malloc (amt);
          amt = o->reloc_count;
          amt *= sizeof (struct coff_link_hash_entry *);
          flaginfo.section_info[o->target_index].rel_hashes =
          amt = o->reloc_count;
          amt *= sizeof (struct coff_link_hash_entry *);
          flaginfo.section_info[o->target_index].rel_hashes =
-              (struct coff_link_hash_entry **) bfd_malloc (amt);
+             (struct coff_link_hash_entry **) bfd_malloc (amt);
          if (flaginfo.section_info[o->target_index].relocs == NULL
              || flaginfo.section_info[o->target_index].rel_hashes == NULL)
            goto error_return;
          if (flaginfo.section_info[o->target_index].relocs == NULL
              || flaginfo.section_info[o->target_index].rel_hashes == NULL)
            goto error_return;
@@ -891,7 +902,7 @@ _bfd_coff_final_link (bfd *abfd,
                                        bfd_asymbol_name(sym), FALSE, FALSE)
                       == NULL))
                  || (((flaginfo.info->discard == discard_sec_merge
                                        bfd_asymbol_name(sym), FALSE, FALSE)
                       == NULL))
                  || (((flaginfo.info->discard == discard_sec_merge
-                       && (bfd_get_section (sym)->flags & SEC_MERGE)
+                       && (bfd_asymbol_section (sym)->flags & SEC_MERGE)
                        && ! bfd_link_relocatable (flaginfo.info))
                       || flaginfo.info->discard == discard_l)
                      && bfd_is_local_label_name (sub, bfd_asymbol_name(sym))))
                        && ! bfd_link_relocatable (flaginfo.info))
                       || flaginfo.info->discard == discard_l)
                      && bfd_is_local_label_name (sub, bfd_asymbol_name(sym))))
@@ -982,41 +993,20 @@ _bfd_coff_final_link (bfd *abfd,
   coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
   debug_merge_allocated = FALSE;
 
   coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
   debug_merge_allocated = FALSE;
 
-  if (flaginfo.internal_syms != NULL)
-    {
-      free (flaginfo.internal_syms);
-      flaginfo.internal_syms = NULL;
-    }
-  if (flaginfo.sec_ptrs != NULL)
-    {
-      free (flaginfo.sec_ptrs);
-      flaginfo.sec_ptrs = NULL;
-    }
-  if (flaginfo.sym_indices != NULL)
-    {
-      free (flaginfo.sym_indices);
-      flaginfo.sym_indices = NULL;
-    }
-  if (flaginfo.linenos != NULL)
-    {
-      free (flaginfo.linenos);
-      flaginfo.linenos = NULL;
-    }
-  if (flaginfo.contents != NULL)
-    {
-      free (flaginfo.contents);
-      flaginfo.contents = NULL;
-    }
-  if (flaginfo.external_relocs != NULL)
-    {
-      free (flaginfo.external_relocs);
-      flaginfo.external_relocs = NULL;
-    }
-  if (flaginfo.internal_relocs != NULL)
-    {
-      free (flaginfo.internal_relocs);
-      flaginfo.internal_relocs = NULL;
-    }
+  free (flaginfo.internal_syms);
+  flaginfo.internal_syms = NULL;
+  free (flaginfo.sec_ptrs);
+  flaginfo.sec_ptrs = NULL;
+  free (flaginfo.sym_indices);
+  flaginfo.sym_indices = NULL;
+  free (flaginfo.linenos);
+  flaginfo.linenos = NULL;
+  free (flaginfo.contents);
+  flaginfo.contents = NULL;
+  free (flaginfo.external_relocs);
+  flaginfo.external_relocs = NULL;
+  free (flaginfo.internal_relocs);
+  flaginfo.internal_relocs = NULL;
 
   /* The value of the last C_FILE symbol is supposed to be the symbol
      index of the first external symbol.  Write it out again if
 
   /* The value of the last C_FILE symbol is supposed to be the symbol
      index of the first external symbol.  Write it out again if
@@ -1055,11 +1045,8 @@ _bfd_coff_final_link (bfd *abfd,
     goto error_return;
 
   /* The outsyms buffer is used by _bfd_coff_write_global_sym.  */
     goto error_return;
 
   /* The outsyms buffer is used by _bfd_coff_write_global_sym.  */
-  if (flaginfo.outsyms != NULL)
-    {
-      free (flaginfo.outsyms);
-      flaginfo.outsyms = NULL;
-    }
+  free (flaginfo.outsyms);
+  flaginfo.outsyms = NULL;
 
   if (bfd_link_relocatable (info) && max_output_reloc_count > 0)
     {
 
   if (bfd_link_relocatable (info) && max_output_reloc_count > 0)
     {
@@ -1097,7 +1084,7 @@ _bfd_coff_final_link (bfd *abfd,
 
          if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0)
            goto error_return;
 
          if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0)
            goto error_return;
-         if (obj_pe (abfd) && o->reloc_count >= 0xffff)
+         if ((obj_pe (abfd) || obj_go32 (abfd)) && o->reloc_count >= 0xffff)
            {
              /* In PE COFF, write the count of relocs as the first
                 reloc.  The header overflow bit will be set
            {
              /* In PE COFF, write the count of relocs as the first
                 reloc.  The header overflow bit will be set
@@ -1130,10 +1117,8 @@ _bfd_coff_final_link (bfd *abfd,
 
       for (i = 0; i < abfd->section_count; i++)
        {
 
       for (i = 0; i < abfd->section_count; i++)
        {
-         if (flaginfo.section_info[i].relocs != NULL)
-           free (flaginfo.section_info[i].relocs);
-         if (flaginfo.section_info[i].rel_hashes != NULL)
-           free (flaginfo.section_info[i].rel_hashes);
+         free (flaginfo.section_info[i].relocs);
+         free (flaginfo.section_info[i].rel_hashes);
        }
       free (flaginfo.section_info);
       flaginfo.section_info = NULL;
        }
       free (flaginfo.section_info);
       flaginfo.section_info = NULL;
@@ -1175,9 +1160,9 @@ _bfd_coff_final_link (bfd *abfd,
 
   _bfd_stringtab_free (flaginfo.strtab);
 
 
   _bfd_stringtab_free (flaginfo.strtab);
 
-  /* Setting bfd_get_symcount to 0 will cause write_object_contents to
+  /* Setting symcount to 0 will cause write_object_contents to
      not try to write out the symbols.  */
      not try to write out the symbols.  */
-  bfd_get_symcount (abfd) = 0;
+  abfd->symcount = 0;
 
   return TRUE;
 
 
   return TRUE;
 
@@ -1192,31 +1177,20 @@ _bfd_coff_final_link (bfd *abfd,
 
       for (i = 0; i < abfd->section_count; i++)
        {
 
       for (i = 0; i < abfd->section_count; i++)
        {
-         if (flaginfo.section_info[i].relocs != NULL)
-           free (flaginfo.section_info[i].relocs);
-         if (flaginfo.section_info[i].rel_hashes != NULL)
-           free (flaginfo.section_info[i].rel_hashes);
+         free (flaginfo.section_info[i].relocs);
+         free (flaginfo.section_info[i].rel_hashes);
        }
       free (flaginfo.section_info);
     }
        }
       free (flaginfo.section_info);
     }
-  if (flaginfo.internal_syms != NULL)
-    free (flaginfo.internal_syms);
-  if (flaginfo.sec_ptrs != NULL)
-    free (flaginfo.sec_ptrs);
-  if (flaginfo.sym_indices != NULL)
-    free (flaginfo.sym_indices);
-  if (flaginfo.outsyms != NULL)
-    free (flaginfo.outsyms);
-  if (flaginfo.linenos != NULL)
-    free (flaginfo.linenos);
-  if (flaginfo.contents != NULL)
-    free (flaginfo.contents);
-  if (flaginfo.external_relocs != NULL)
-    free (flaginfo.external_relocs);
-  if (flaginfo.internal_relocs != NULL)
-    free (flaginfo.internal_relocs);
-  if (external_relocs != NULL)
-    free (external_relocs);
+  free (flaginfo.internal_syms);
+  free (flaginfo.sec_ptrs);
+  free (flaginfo.sym_indices);
+  free (flaginfo.outsyms);
+  free (flaginfo.linenos);
+  free (flaginfo.contents);
+  free (flaginfo.external_relocs);
+  free (flaginfo.internal_relocs);
+  free (external_relocs);
   return FALSE;
 }
 
   return FALSE;
 }
 
@@ -1275,8 +1249,7 @@ process_embedded_commands (bfd *output_bfd,
 
   if (!bfd_malloc_and_get_section (abfd, sec, &copy))
     {
 
   if (!bfd_malloc_and_get_section (abfd, sec, &copy))
     {
-      if (copy != NULL)
-       free (copy);
+      free (copy);
       return 0;
     }
   e = (char *) copy + sec->size;
       return 0;
     }
   e = (char *) copy + sec->size;
@@ -1397,7 +1370,8 @@ mark_relocs (struct coff_final_link_info *flaginfo, bfd *input_bfd)
         in the relocation table.  This will then be picked up in the
         skip/don't-skip pass.  */
       for (; irel < irelend; irel++)
         in the relocation table.  This will then be picked up in the
         skip/don't-skip pass.  */
       for (; irel < irelend; irel++)
-       flaginfo->sym_indices[ irel->r_symndx ] = -1;
+       if ((unsigned long) irel->r_symndx < obj_raw_syment_count (input_bfd))
+         flaginfo->sym_indices[irel->r_symndx] = -1;
     }
 }
 
     }
 }
 
@@ -1510,7 +1484,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
        }
 
       /* Extract the flag indicating if this symbol is used by a
        }
 
       /* Extract the flag indicating if this symbol is used by a
-         relocation.  */
+        relocation.  */
       if ((flaginfo->info->strip != strip_none
           || flaginfo->info->discard != discard_none)
          && bfd_link_relocatable (flaginfo->info))
       if ((flaginfo->info->strip != strip_none
           || flaginfo->info->discard != discard_none)
          && bfd_link_relocatable (flaginfo->info))
@@ -1554,7 +1528,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
 
            case COFF_SYMBOL_LOCAL:
              /* This is a local symbol.  Skip it if we are discarding
 
            case COFF_SYMBOL_LOCAL:
              /* This is a local symbol.  Skip it if we are discarding
-                 local symbols.  */
+                local symbols.  */
              if (flaginfo->info->discard == discard_all && ! dont_skip_symbol)
                skip = TRUE;
              break;
              if (flaginfo->info->discard == discard_all && ! dont_skip_symbol)
                skip = TRUE;
              break;
@@ -1576,9 +1550,9 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
 #endif
 
       /* If we stripping debugging symbols, and this is a debugging
 #endif
 
       /* If we stripping debugging symbols, and this is a debugging
-         symbol, then skip it.  FIXME: gas sets the section to N_ABS
-         for some types of debugging symbols; I don't know if this is
-         a bug or not.  In any case, we handle it here.  */
+        symbol, then skip it.  FIXME: gas sets the section to N_ABS
+        for some types of debugging symbols; I don't know if this is
+        a bug or not.  In any case, we handle it here.  */
       if (! skip
          && flaginfo->info->strip == strip_debugger
          && ! dont_skip_symbol
       if (! skip
          && flaginfo->info->strip == strip_debugger
          && ! dont_skip_symbol
@@ -1619,7 +1593,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
        }
 
       /* If this is an enum, struct, or union tag, see if we have
        }
 
       /* If this is an enum, struct, or union tag, see if we have
-         already output an identical type.  */
+        already output an identical type.  */
       if (! skip
          && !flaginfo->info->traditional_format
          && (isym.n_sclass == C_ENTAG
       if (! skip
          && !flaginfo->info->traditional_format
          && (isym.n_sclass == C_ENTAG
@@ -1635,14 +1609,14 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
          struct coff_debug_merge_element **epp;
          bfd_byte *esl, *eslend;
          struct internal_syment *islp;
          struct coff_debug_merge_element **epp;
          bfd_byte *esl, *eslend;
          struct internal_syment *islp;
-         bfd_size_type amt;
+         size_t amt;
 
          name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
          if (name == NULL)
            return FALSE;
 
          /* Ignore fake names invented by compiler; treat them all as
 
          name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
          if (name == NULL)
            return FALSE;
 
          /* Ignore fake names invented by compiler; treat them all as
-             the same name.  */
+            the same name.  */
          if (*name == '~' || *name == '.' || *name == '$'
              || (*name == bfd_get_symbol_leading_char (input_bfd)
                  && (name[1] == '~' || name[1] == '.' || name[1] == '$')))
          if (*name == '~' || *name == '.' || *name == '$'
              || (*name == bfd_get_symbol_leading_char (input_bfd)
                  && (name[1] == '~' || name[1] == '.' || name[1] == '$')))
@@ -1654,8 +1628,8 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
            return FALSE;
 
          /* Allocate memory to hold type information.  If this turns
            return FALSE;
 
          /* Allocate memory to hold type information.  If this turns
-             out to be a duplicate, we pass this address to
-             bfd_release.  */
+            out to be a duplicate, we pass this address to
+            bfd_release.  */
          amt = sizeof (struct coff_debug_merge_type);
          mt = (struct coff_debug_merge_type *) bfd_alloc (input_bfd, amt);
          if (mt == NULL)
          amt = sizeof (struct coff_debug_merge_type);
          mt = (struct coff_debug_merge_type *) bfd_alloc (input_bfd, amt);
          if (mt == NULL)
@@ -1663,7 +1637,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
          mt->type_class = isym.n_sclass;
 
          /* Pick up the aux entry, which points to the end of the tag
          mt->type_class = isym.n_sclass;
 
          /* Pick up the aux entry, which points to the end of the tag
-             entries.  */
+            entries.  */
          bfd_coff_swap_aux_in (input_bfd, (esym + isymesz),
                                isym.n_type, isym.n_sclass, 0, isym.n_numaux,
                                &aux);
          bfd_coff_swap_aux_in (input_bfd, (esym + isymesz),
                                isym.n_type, isym.n_sclass, 0, isym.n_numaux,
                                &aux);
@@ -1685,7 +1659,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
 
              amt = sizeof (struct coff_debug_merge_element);
              *epp = (struct coff_debug_merge_element *)
 
              amt = sizeof (struct coff_debug_merge_element);
              *epp = (struct coff_debug_merge_element *)
-                  bfd_alloc (input_bfd, amt);
+                 bfd_alloc (input_bfd, amt);
              if (*epp == NULL)
                return FALSE;
 
              if (*epp == NULL)
                return FALSE;
 
@@ -1738,8 +1712,8 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
            }
 
          /* See if we already have a definition which matches this
            }
 
          /* See if we already have a definition which matches this
-             type.  We always output the type if it has no elements,
-             for simplicity.  */
+            type.  We always output the type if it has no elements,
+            for simplicity.  */
          if (mt->elements == NULL)
            bfd_release (input_bfd, mt);
          else
          if (mt->elements == NULL)
            bfd_release (input_bfd, mt);
          else
@@ -1831,7 +1805,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
 
            case C_FCN:
              if (obj_pe (input_bfd)
 
            case C_FCN:
              if (obj_pe (input_bfd)
-                 && strcmp (isym.n_name, ".bf") != 0
+                 && memcmp (isym.n_name, ".bf", sizeof ".bf") != 0
                  && isym.n_scnum > 0)
                {
                  /* For PE, .lf and .ef get their value left alone,
                  && isym.n_scnum > 0)
                {
                  /* For PE, .lf and .ef get their value left alone,
@@ -1878,7 +1852,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
                  && flaginfo->last_file.n_value != (bfd_vma) output_index)
                {
                  /* We must correct the value of the last C_FILE
                  && flaginfo->last_file.n_value != (bfd_vma) output_index)
                {
                  /* We must correct the value of the last C_FILE
-                     entry.  */
+                    entry.  */
                  flaginfo->last_file.n_value = output_index;
                  if ((bfd_size_type) flaginfo->last_file_index >= syment_base)
                    {
                  flaginfo->last_file.n_value = output_index;
                  if ((bfd_size_type) flaginfo->last_file_index >= syment_base)
                    {
@@ -1933,7 +1907,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
              if (h == NULL)
                {
                  /* This can happen if there were errors earlier in
              if (h == NULL)
                {
                  /* This can happen if there were errors earlier in
-                     the link.  */
+                    the link.  */
                  bfd_set_error (bfd_error_bad_value);
                  return FALSE;
                }
                  bfd_set_error (bfd_error_bad_value);
                  return FALSE;
                }
@@ -1987,8 +1961,8 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
              h = *sym_hash;
 
              /* The m68k-motorola-sysv assembler will sometimes
              h = *sym_hash;
 
              /* The m68k-motorola-sysv assembler will sometimes
-                 generate two symbols with the same name, but only one
-                 will have aux entries.  */
+                generate two symbols with the same name, but only one
+                will have aux entries.  */
              BFD_ASSERT (isymp->n_numaux == 0
                          || h->numaux == 0
                          || h->numaux == isymp->n_numaux);
              BFD_ASSERT (isymp->n_numaux == 0
                          || h->numaux == 0
                          || h->numaux == isymp->n_numaux);
@@ -2059,9 +2033,9 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
                          && indx < obj_raw_syment_count (input_bfd))
                        {
                          /* We look forward through the symbol for
                          && indx < obj_raw_syment_count (input_bfd))
                        {
                          /* We look forward through the symbol for
-                             the index of the next symbol we are going
-                             to include.  I don't know if this is
-                             entirely right.  */
+                            the index of the next symbol we are going
+                            to include.  I don't know if this is
+                            entirely right.  */
                          while ((flaginfo->sym_indices[indx] < 0
                                  || ((bfd_size_type) flaginfo->sym_indices[indx]
                                      < syment_base))
                          while ((flaginfo->sym_indices[indx] < 0
                                  || ((bfd_size_type) flaginfo->sym_indices[indx]
                                      < syment_base))
@@ -2131,10 +2105,10 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
                              file_ptr pos;
 
                              /* We have already written out the last
                              file_ptr pos;
 
                              /* We have already written out the last
-                                 .bf aux entry.  We need to write it
-                                 out again.  We borrow *outsym
-                                 temporarily.  FIXME: This case should
-                                 be made faster.  */
+                                .bf aux entry.  We need to write it
+                                out again.  We borrow *outsym
+                                temporarily.  FIXME: This case should
+                                be made faster.  */
                              bfd_coff_swap_aux_out (output_bfd,
                                                     &flaginfo->last_bf,
                                                     isymp->n_type,
                              bfd_coff_swap_aux_out (output_bfd,
                                                     &flaginfo->last_bf,
                                                     isymp->n_type,
@@ -2155,8 +2129,8 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
                      else
                        {
                          /* The endndx field of this aux entry must
                      else
                        {
                          /* The endndx field of this aux entry must
-                             be updated with the symbol number of the
-                             next .bf symbol.  */
+                            be updated with the symbol number of the
+                            next .bf symbol.  */
                          flaginfo->last_bf = *auxp;
                          flaginfo->last_bf_index = (((outsym - flaginfo->outsyms)
                                                   / osymesz)
                          flaginfo->last_bf = *auxp;
                          flaginfo->last_bf_index = (((outsym - flaginfo->outsyms)
                                                   / osymesz)
@@ -2290,7 +2264,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
                }
 
              if (!skipping)
                }
 
              if (!skipping)
-               {
+               {
                  bfd_coff_swap_lineno_out (output_bfd, &iline, oeline);
                  oeline += linesz;
                }
                  bfd_coff_swap_lineno_out (output_bfd, &iline, oeline);
                  oeline += linesz;
                }
@@ -2360,8 +2334,9 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
          if ((o->flags & SEC_RELOC) != 0
              && o->reloc_count != 0)
            {
          if ((o->flags & SEC_RELOC) != 0
              && o->reloc_count != 0)
            {
-             (*_bfd_error_handler)
-               (_("%B: relocs in section `%A', but it has no contents"),
+             _bfd_error_handler
+               /* xgettext: c-format */
+               (_("%pB: relocs in section `%pA', but it has no contents"),
                 input_bfd, o);
              bfd_set_error (bfd_error_no_contents);
              return FALSE;
                 input_bfd, o);
              bfd_set_error (bfd_error_no_contents);
              return FALSE;
@@ -2423,13 +2398,14 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
              /* Complain if definition comes from an excluded section.  */
              if (ps->flags & SEC_EXCLUDE)
                (*flaginfo->info->callbacks->einfo)
              /* Complain if definition comes from an excluded section.  */
              if (ps->flags & SEC_EXCLUDE)
                (*flaginfo->info->callbacks->einfo)
-                 (_("%X`%s' referenced in section `%A' of %B: "
-                    "defined in discarded section `%A' of %B\n"),
+                 /* xgettext: c-format */
+                 (_("%X`%s' referenced in section `%pA' of %pB: "
+                    "defined in discarded section `%pA' of %pB\n"),
                   h->root.root.string, o, input_bfd, ps, ps->owner);
            }
 
          /* Call processor specific code to relocate the section
                   h->root.root.string, o, input_bfd, ps, ps->owner);
            }
 
          /* Call processor specific code to relocate the section
-             contents.  */
+            contents.  */
          if (! bfd_coff_relocate_section (output_bfd, flaginfo->info,
                                           input_bfd, o,
                                           contents,
          if (! bfd_coff_relocate_section (output_bfd, flaginfo->info,
                                           input_bfd, o,
                                           contents,
@@ -2504,7 +2480,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
                          char buf[SYMNMLEN + 1];
 
                          /* This reloc is against a symbol we are
                          char buf[SYMNMLEN + 1];
 
                          /* This reloc is against a symbol we are
-                             stripping.  This should have been handled
+                            stripping.  This should have been handled
                             by the 'dont_skip_symbol' code in the while
                             loop at the top of this function.  */
                          is = flaginfo->internal_syms + irel->r_symndx;
                             by the 'dont_skip_symbol' code in the while
                             loop at the top of this function.  */
                          is = flaginfo->internal_syms + irel->r_symndx;
@@ -2514,10 +2490,8 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
                          if (name == NULL)
                            return FALSE;
 
                          if (name == NULL)
                            return FALSE;
 
-                         if (! ((*flaginfo->info->callbacks->unattached_reloc)
-                                (flaginfo->info, name, input_bfd, o,
-                                 irel->r_vaddr)))
-                           return FALSE;
+                         (*flaginfo->info->callbacks->unattached_reloc)
+                           (flaginfo->info, name, input_bfd, o, irel->r_vaddr);
                        }
                    }
                }
                        }
                    }
                }
@@ -2529,7 +2503,8 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd)
       /* Write out the modified section contents.  */
       if (secdata == NULL || secdata->stab_info == NULL)
        {
       /* Write out the modified section contents.  */
       if (secdata == NULL || secdata->stab_info == NULL)
        {
-         file_ptr loc = o->output_offset * bfd_octets_per_byte (output_bfd);
+         file_ptr loc = (o->output_offset
+                         * bfd_octets_per_byte (output_bfd, o));
          if (! bfd_set_section_contents (output_bfd, o->output_section,
                                          contents, loc, o->size))
            return FALSE;
          if (! bfd_set_section_contents (output_bfd, o->output_section,
                                          contents, loc, o->size))
            return FALSE;
@@ -2701,7 +2676,7 @@ _bfd_coff_write_global_sym (struct bfd_hash_entry *bh, void *data)
       auxp = h->aux + i;
 
       /* Look for a section aux entry here using the same tests that
       auxp = h->aux + i;
 
       /* Look for a section aux entry here using the same tests that
-         coff_swap_aux_out uses.  */
+        coff_swap_aux_out uses.  */
       if (i == 0
          && (isym.n_sclass == C_STAT
              || isym.n_sclass == C_HIDDEN)
       if (i == 0
          && (isym.n_sclass == C_STAT
              || isym.n_sclass == C_HIDDEN)
@@ -2717,24 +2692,22 @@ _bfd_coff_write_global_sym (struct bfd_hash_entry *bh, void *data)
              auxp->x_scn.x_scnlen = sec->size;
 
              /* For PE, an overflow on the final link reportedly does
              auxp->x_scn.x_scnlen = sec->size;
 
              /* For PE, an overflow on the final link reportedly does
-                 not matter.  FIXME: Why not?  */
+                not matter.  FIXME: Why not?  */
              if (sec->reloc_count > 0xffff
                  && (! obj_pe (output_bfd)
                      || bfd_link_relocatable (flaginfo->info)))
              if (sec->reloc_count > 0xffff
                  && (! obj_pe (output_bfd)
                      || bfd_link_relocatable (flaginfo->info)))
-               (*_bfd_error_handler)
-                 (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
-                  bfd_get_filename (output_bfd),
-                  bfd_get_section_name (output_bfd, sec),
-                  sec->reloc_count);
+               _bfd_error_handler
+                 /* xgettext: c-format */
+                 (_("%pB: %pA: reloc overflow: %#x > 0xffff"),
+                  output_bfd, sec, sec->reloc_count);
 
              if (sec->lineno_count > 0xffff
                  && (! obj_pe (output_bfd)
                      || bfd_link_relocatable (flaginfo->info)))
 
              if (sec->lineno_count > 0xffff
                  && (! obj_pe (output_bfd)
                      || bfd_link_relocatable (flaginfo->info)))
-               (*_bfd_error_handler)
-                 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
-                  bfd_get_filename (output_bfd),
-                  bfd_get_section_name (output_bfd, sec),
-                  sec->lineno_count);
+               _bfd_error_handler
+                 /* xgettext: c-format */
+                 (_("%pB: warning: %pA: line number overflow: %#x > 0xffff"),
+                  output_bfd, sec, sec->lineno_count);
 
              auxp->x_scn.x_nreloc = sec->reloc_count;
              auxp->x_scn.x_nlinno = sec->lineno_count;
 
              auxp->x_scn.x_nreloc = sec->reloc_count;
              auxp->x_scn.x_nlinno = sec->lineno_count;
@@ -2823,7 +2796,7 @@ _bfd_coff_reloc_link_order (bfd *output_bfd,
        return FALSE;
 
       rstat = _bfd_relocate_contents (howto, output_bfd,
        return FALSE;
 
       rstat = _bfd_relocate_contents (howto, output_bfd,
-                                     (bfd_vma) link_order->u.reloc.p->addend,\
+                                     (bfd_vma) link_order->u.reloc.p->addend,
                                      buf);
       switch (rstat)
        {
                                      buf);
       switch (rstat)
        {
@@ -2833,23 +2806,19 @@ _bfd_coff_reloc_link_order (bfd *output_bfd,
        case bfd_reloc_outofrange:
          abort ();
        case bfd_reloc_overflow:
        case bfd_reloc_outofrange:
          abort ();
        case bfd_reloc_overflow:
-         if (! ((*flaginfo->info->callbacks->reloc_overflow)
-                (flaginfo->info, NULL,
-                 (link_order->type == bfd_section_reloc_link_order
-                  ? bfd_section_name (output_bfd,
-                                      link_order->u.reloc.p->u.section)
-                  : link_order->u.reloc.p->u.name),
-                 howto->name, link_order->u.reloc.p->addend,
-                 (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
-           {
-             free (buf);
-             return FALSE;
-           }
+         (*flaginfo->info->callbacks->reloc_overflow)
+           (flaginfo->info, NULL,
+            (link_order->type == bfd_section_reloc_link_order
+             ? bfd_section_name (link_order->u.reloc.p->u.section)
+             : link_order->u.reloc.p->u.name),
+            howto->name, link_order->u.reloc.p->addend,
+            (bfd *) NULL, (asection *) NULL, (bfd_vma) 0);
          break;
        }
          break;
        }
-      loc = link_order->offset * bfd_octets_per_byte (output_bfd);
+      loc = link_order->offset * bfd_octets_per_byte (output_bfd,
+                                                     output_section);
       ok = bfd_set_section_contents (output_bfd, output_section, buf,
       ok = bfd_set_section_contents (output_bfd, output_section, buf,
-                                     loc, size);
+                                    loc, size);
       free (buf);
       if (! ok)
        return FALSE;
       free (buf);
       if (! ok)
        return FALSE;
@@ -2870,9 +2839,9 @@ _bfd_coff_reloc_link_order (bfd *output_bfd,
   if (link_order->type == bfd_section_reloc_link_order)
     {
       /* We need to somehow locate a symbol in the right section.  The
   if (link_order->type == bfd_section_reloc_link_order)
     {
       /* We need to somehow locate a symbol in the right section.  The
-         symbol must either have a value of zero, or we must adjust
-         the addend by the value of the symbol.  FIXME: Write this
-         when we need it.  The old linker couldn't handle this anyhow.  */
+        symbol must either have a value of zero, or we must adjust
+        the addend by the value of the symbol.  FIXME: Write this
+        when we need it.  The old linker couldn't handle this anyhow.  */
       abort ();
       *rel_hash_ptr = NULL;
       irel->r_symndx = 0;
       abort ();
       *rel_hash_ptr = NULL;
       irel->r_symndx = 0;
@@ -2900,10 +2869,9 @@ _bfd_coff_reloc_link_order (bfd *output_bfd,
        }
       else
        {
        }
       else
        {
-         if (! ((*flaginfo->info->callbacks->unattached_reloc)
-                (flaginfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL,
-                 (asection *) NULL, (bfd_vma) 0)))
-           return FALSE;
+         (*flaginfo->info->callbacks->unattached_reloc)
+           (flaginfo->info, link_order->u.reloc.p->u.name,
+            (bfd *) NULL, (asection *) NULL, (bfd_vma) 0);
          irel->r_symndx = 0;
        }
     }
          irel->r_symndx = 0;
        }
     }
@@ -2959,8 +2927,9 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
       else if (symndx < 0
               || (unsigned long) symndx >= obj_raw_syment_count (input_bfd))
        {
       else if (symndx < 0
               || (unsigned long) symndx >= obj_raw_syment_count (input_bfd))
        {
-         (*_bfd_error_handler)
-           ("%B: illegal symbol index %ld in relocs", input_bfd, symndx);
+         _bfd_error_handler
+           /* xgettext: c-format */
+           (_("%pB: illegal symbol index %ld in relocs"), input_bfd, symndx);
          return FALSE;
        }
       else
          return FALSE;
        }
       else
@@ -2970,9 +2939,9 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
        }
 
       /* COFF treats common symbols in one of two ways.  Either the
        }
 
       /* COFF treats common symbols in one of two ways.  Either the
-         size of the symbol is included in the section contents, or it
-         is not.  We assume that the size is not included, and force
-         the rtype_to_howto function to adjust the addend as needed.  */
+        size of the symbol is included in the section contents, or it
+        is not.  We assume that the size is not included, and force
+        the rtype_to_howto function to adjust the addend as needed.  */
       if (sym != NULL && sym->n_scnum != 0)
        addend = - sym->n_value;
       else
       if (sym != NULL && sym->n_scnum != 0)
        addend = - sym->n_value;
       else
@@ -2984,9 +2953,9 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
        return FALSE;
 
       /* If we are doing a relocatable link, then we can just ignore
        return FALSE;
 
       /* If we are doing a relocatable link, then we can just ignore
-         a PC relative reloc that is pcrel_offset.  It will already
-         have the correct value.  If this is not a relocatable link,
-         then we should ignore the symbol value.  */
+        a PC relative reloc that is pcrel_offset.  It will already
+        have the correct value.  If this is not a relocatable link,
+        then we should ignore the symbol value.  */
       if (howto->pc_relative && howto->pcrel_offset)
        {
          if (bfd_link_relocatable (info))
       if (howto->pc_relative && howto->pcrel_offset)
        {
          if (bfd_link_relocatable (info))
@@ -3010,10 +2979,10 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
 
              /* PR 19623: Relocations against symbols in
                 the absolute sections should ignored.  */
 
              /* PR 19623: Relocations against symbols in
                 the absolute sections should ignored.  */
-              if (bfd_is_abs_section (sec))
+             if (bfd_is_abs_section (sec))
                continue;
 
                continue;
 
-              val = (sec->output_section->vma
+             val = (sec->output_section->vma
                     + sec->output_offset
                     + sym->n_value);
              if (! obj_pe (input_bfd))
                     + sec->output_offset
                     + sym->n_value);
              if (! obj_pe (input_bfd))
@@ -3034,10 +3003,10 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
 
          else if (h->root.type == bfd_link_hash_undefweak)
            {
 
          else if (h->root.type == bfd_link_hash_undefweak)
            {
-              if (h->symbol_class == C_NT_WEAK && h->numaux == 1)
+             if (h->symbol_class == C_NT_WEAK && h->numaux == 1)
                {
                  /* See _Microsoft Portable Executable and Common Object
                {
                  /* See _Microsoft Portable Executable and Common Object
-                     File Format Specification_, section 5.5.3.
+                    File Format Specification_, section 5.5.3.
                     Note that weak symbols without aux records are a GNU
                     extension.
                     FIXME: All weak externals are treated as having
                     Note that weak symbols without aux records are a GNU
                     extension.
                     FIXME: All weak externals are treated as having
@@ -3063,17 +3032,14 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
                    }
                }
              else
                    }
                }
              else
-                /* This is a GNU extension.  */
+               /* This is a GNU extension.  */
                val = 0;
            }
 
          else if (! bfd_link_relocatable (info))
                val = 0;
            }
 
          else if (! bfd_link_relocatable (info))
-           {
-             if (! ((*info->callbacks->undefined_symbol)
-                    (info, h->root.root.string, input_bfd, input_section,
-                     rel->r_vaddr - input_section->vma, TRUE)))
-               return FALSE;
-           }
+           (*info->callbacks->undefined_symbol)
+             (info, h->root.root.string, input_bfd, input_section,
+              rel->r_vaddr - input_section->vma, TRUE);
        }
 
       /* If the input section defining the symbol has been discarded
        }
 
       /* If the input section defining the symbol has been discarded
@@ -3081,7 +3047,7 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
       if (sec != NULL && discarded_section (sec))
        {
          _bfd_clear_contents (howto, input_bfd, input_section,
       if (sec != NULL && discarded_section (sec))
        {
          _bfd_clear_contents (howto, input_bfd, input_section,
-                              contents + (rel->r_vaddr - input_section->vma));
+                              contents, rel->r_vaddr - input_section->vma);
          continue;
        }
 
          continue;
        }
 
@@ -3123,9 +3089,10 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
        case bfd_reloc_ok:
          break;
        case bfd_reloc_outofrange:
        case bfd_reloc_ok:
          break;
        case bfd_reloc_outofrange:
-         (*_bfd_error_handler)
-           (_("%B: bad reloc address 0x%lx in section `%A'"),
-            input_bfd, input_section, (unsigned long) rel->r_vaddr);
+         _bfd_error_handler
+           /* xgettext: c-format */
+           (_("%pB: bad reloc address %#" PRIx64 " in section `%pA'"),
+            input_bfd, (uint64_t) rel->r_vaddr, input_section);
          return FALSE;
        case bfd_reloc_overflow:
          {
          return FALSE;
        case bfd_reloc_overflow:
          {
@@ -3143,11 +3110,10 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
                  return FALSE;
              }
 
                  return FALSE;
              }
 
-           if (! ((*info->callbacks->reloc_overflow)
-                  (info, (h ? &h->root : NULL), name, howto->name,
-                   (bfd_vma) 0, input_bfd, input_section,
-                   rel->r_vaddr - input_section->vma)))
-             return FALSE;
+           (*info->callbacks->reloc_overflow)
+             (info, (h ? &h->root : NULL), name, howto->name,
+              (bfd_vma) 0, input_bfd, input_section,
+              rel->r_vaddr - input_section->vma);
          }
        }
     }
          }
        }
     }