gas: run the hwcaps-bump tests with 64-bit sparc objects only.
[deliverable/binutils-gdb.git] / binutils / nlmconv.c
index 9932ba29b71da447bcbc0c598e05a720c595c2e6..eff15c5e2a8355b63f4787ff4585a9e0c98f0885 100644 (file)
@@ -1,12 +1,11 @@
 /* nlmconv.c -- NLM conversion program
 /* nlmconv.c -- NLM conversion program
-   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1993-2016 Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This file is part of GNU Binutils.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -16,7 +15,9 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
 
 /* Written by Ian Lance Taylor <ian@cygnus.com>.
 
 
 /* Written by Ian Lance Taylor <ian@cygnus.com>.
 
 #include "sysdep.h"
 #include "bfd.h"
 #include "libiberty.h"
 #include "sysdep.h"
 #include "bfd.h"
 #include "libiberty.h"
+#include "filenames.h"
 #include "safe-ctype.h"
 
 #include "ansidecl.h"
 #include <time.h>
 #include "safe-ctype.h"
 
 #include "ansidecl.h"
 #include <time.h>
-#include <sys/stat.h>
-#include <sys/file.h>
 #include <assert.h>
 #include "getopt.h"
 
 #include <assert.h>
 #include "getopt.h"
 
@@ -211,6 +211,7 @@ main (int argc, char **argv)
 
   program_name = argv[0];
   xmalloc_set_program_name (program_name);
 
   program_name = argv[0];
   xmalloc_set_program_name (program_name);
+  bfd_set_error_program_name (program_name);
 
   expandargv (&argc, &argv);
 
 
   expandargv (&argc, &argv);
 
@@ -266,7 +267,7 @@ main (int argc, char **argv)
          ++optind;
          if (optind < argc)
            show_usage (stderr, 1);
          ++optind;
          if (optind < argc)
            show_usage (stderr, 1);
-         if (strcmp (input_file, output_file) == 0)
+         if (filename_cmp (input_file, output_file) == 0)
            {
              fatal (_("input and output files must be different"));
            }
            {
              fatal (_("input and output files must be different"));
            }
@@ -393,9 +394,10 @@ main (int argc, char **argv)
   bss_sec = bfd_get_section_by_name (outbfd, NLM_UNINITIALIZED_DATA_NAME);
   if (bss_sec == NULL)
     {
   bss_sec = bfd_get_section_by_name (outbfd, NLM_UNINITIALIZED_DATA_NAME);
   if (bss_sec == NULL)
     {
-      bss_sec = bfd_make_section (outbfd, NLM_UNINITIALIZED_DATA_NAME);
+      bss_sec = bfd_make_section_with_flags (outbfd,
+                                            NLM_UNINITIALIZED_DATA_NAME,
+                                            SEC_ALLOC);
       if (bss_sec == NULL
       if (bss_sec == NULL
-         || ! bfd_set_section_flags (outbfd, bss_sec, SEC_ALLOC)
          || ! bfd_set_section_alignment (outbfd, bss_sec, 1))
        bfd_fatal (_("make .bss section"));
     }
          || ! bfd_set_section_alignment (outbfd, bss_sec, 1))
        bfd_fatal (_("make .bss section"));
     }
@@ -404,11 +406,10 @@ main (int argc, char **argv)
      so that programs which understand it can resurrect the original
      sections from the NLM.  We will put a pointer to .nlmsections in
      the NLM header area.  */
      so that programs which understand it can resurrect the original
      sections from the NLM.  We will put a pointer to .nlmsections in
      the NLM header area.  */
-  secsec = bfd_make_section (outbfd, ".nlmsections");
+  secsec = bfd_make_section_with_flags (outbfd, ".nlmsections",
+                                       SEC_HAS_CONTENTS);
   if (secsec == NULL)
     bfd_fatal (_("make .nlmsections section"));
   if (secsec == NULL)
     bfd_fatal (_("make .nlmsections section"));
-  if (! bfd_set_section_flags (outbfd, secsec, SEC_HAS_CONTENTS))
-    bfd_fatal (_("set .nlmsections flags"));
 
 #ifdef NLMCONV_POWERPC
   /* For PowerPC NetWare we need to build stubs for calls to undefined
 
 #ifdef NLMCONV_POWERPC
   /* For PowerPC NetWare we need to build stubs for calls to undefined
@@ -474,23 +475,23 @@ main (int argc, char **argv)
                    ++sym->name;
                  else
                    {
                    ++sym->name;
                  else
                    {
-                     char *new;
+                     char *new_name;
 
 
-                     new = xmalloc (strlen (bfd_asymbol_name (sym)) + 1);
-                     new[0] = outlead;
-                     strcpy (new + 1, bfd_asymbol_name (sym) + 1);
-                     sym->name = new;
+                     new_name = xmalloc (strlen (bfd_asymbol_name (sym)) + 1);
+                     new_name[0] = outlead;
+                     strcpy (new_name + 1, bfd_asymbol_name (sym) + 1);
+                     sym->name = new_name;
                    }
                }
            }
          else
            {
                    }
                }
            }
          else
            {
-             char *new;
+             char *new_name;
 
 
-             new = xmalloc (strlen (bfd_asymbol_name (sym)) + 2);
-             new[0] = outlead;
-             strcpy (new + 1, bfd_asymbol_name (sym));
-             sym->name = new;
+             new_name = xmalloc (strlen (bfd_asymbol_name (sym)) + 2);
+             new_name[0] = outlead;
+             strcpy (new_name + 1, bfd_asymbol_name (sym));
+             sym->name = new_name;
            }
        }
 
            }
        }
 
@@ -712,11 +713,10 @@ main (int argc, char **argv)
       else
        {
          custom_size = st.st_size;
       else
        {
          custom_size = st.st_size;
-         custom_section = bfd_make_section (outbfd, ".nlmcustom");
+         custom_section = bfd_make_section_with_flags (outbfd, ".nlmcustom",
+                                                       SEC_HAS_CONTENTS);
          if (custom_section == NULL
          if (custom_section == NULL
-             || ! bfd_set_section_size (outbfd, custom_section, custom_size)
-             || ! bfd_set_section_flags (outbfd, custom_section,
-                                         SEC_HAS_CONTENTS))
+             || ! bfd_set_section_size (outbfd, custom_section, custom_size))
            bfd_fatal (_("custom section"));
        }
     }
            bfd_fatal (_("custom section"));
        }
     }
@@ -733,11 +733,10 @@ main (int argc, char **argv)
       else
        {
          help_size = st.st_size;
       else
        {
          help_size = st.st_size;
-         help_section = bfd_make_section (outbfd, ".nlmhelp");
+         help_section = bfd_make_section_with_flags (outbfd, ".nlmhelp",
+                                                     SEC_HAS_CONTENTS);
          if (help_section == NULL
          if (help_section == NULL
-             || ! bfd_set_section_size (outbfd, help_section, help_size)
-             || ! bfd_set_section_flags (outbfd, help_section,
-                                         SEC_HAS_CONTENTS))
+             || ! bfd_set_section_size (outbfd, help_section, help_size))
            bfd_fatal (_("help section"));
          LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
        }
            bfd_fatal (_("help section"));
          LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
        }
@@ -755,11 +754,11 @@ main (int argc, char **argv)
       else
        {
          message_size = st.st_size;
       else
        {
          message_size = st.st_size;
-         message_section = bfd_make_section (outbfd, ".nlmmessages");
+         message_section = bfd_make_section_with_flags (outbfd,
+                                                        ".nlmmessages",
+                                                        SEC_HAS_CONTENTS);
          if (message_section == NULL
          if (message_section == NULL
-             || ! bfd_set_section_size (outbfd, message_section, message_size)
-             || ! bfd_set_section_flags (outbfd, message_section,
-                                         SEC_HAS_CONTENTS))
+             || ! bfd_set_section_size (outbfd, message_section, message_size))
            bfd_fatal (_("message section"));
          LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
        }
            bfd_fatal (_("message section"));
          LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
        }
@@ -771,11 +770,10 @@ main (int argc, char **argv)
       module_size = 0;
       for (l = modules; l != NULL; l = l->next)
        module_size += strlen (l->string) + 1;
       module_size = 0;
       for (l = modules; l != NULL; l = l->next)
        module_size += strlen (l->string) + 1;
-      module_section = bfd_make_section (outbfd, ".nlmmodules");
+      module_section = bfd_make_section_with_flags (outbfd, ".nlmmodules",
+                                                   SEC_HAS_CONTENTS);
       if (module_section == NULL
       if (module_section == NULL
-         || ! bfd_set_section_size (outbfd, module_section, module_size)
-         || ! bfd_set_section_flags (outbfd, module_section,
-                                     SEC_HAS_CONTENTS))
+         || ! bfd_set_section_size (outbfd, module_section, module_size))
        bfd_fatal (_("module section"));
     }
   if (rpc_file != NULL)
        bfd_fatal (_("module section"));
     }
   if (rpc_file != NULL)
@@ -791,11 +789,10 @@ main (int argc, char **argv)
       else
        {
          rpc_size = st.st_size;
       else
        {
          rpc_size = st.st_size;
-         rpc_section = bfd_make_section (outbfd, ".nlmrpc");
+         rpc_section = bfd_make_section_with_flags (outbfd, ".nlmrpc",
+                                                    SEC_HAS_CONTENTS);
          if (rpc_section == NULL
          if (rpc_section == NULL
-             || ! bfd_set_section_size (outbfd, rpc_section, rpc_size)
-             || ! bfd_set_section_flags (outbfd, rpc_section,
-                                         SEC_HAS_CONTENTS))
+             || ! bfd_set_section_size (outbfd, rpc_section, rpc_size))
            bfd_fatal (_("rpc section"));
          LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
        }
            bfd_fatal (_("rpc section"));
          LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
        }
@@ -847,12 +844,12 @@ main (int argc, char **argv)
              if (shared_offset > (size_t) sharedhdr.publicsOffset)
                shared_offset = sharedhdr.publicsOffset;
              shared_size = st.st_size - shared_offset;
              if (shared_offset > (size_t) sharedhdr.publicsOffset)
                shared_offset = sharedhdr.publicsOffset;
              shared_size = st.st_size - shared_offset;
-             shared_section = bfd_make_section (outbfd, ".nlmshared");
+             shared_section = bfd_make_section_with_flags (outbfd,
+                                                           ".nlmshared",
+                                                           SEC_HAS_CONTENTS);
              if (shared_section == NULL
                  || ! bfd_set_section_size (outbfd, shared_section,
              if (shared_section == NULL
                  || ! bfd_set_section_size (outbfd, shared_section,
-                                            shared_size)
-                 || ! bfd_set_section_flags (outbfd, shared_section,
-                                             SEC_HAS_CONTENTS))
+                                            shared_size))
                bfd_fatal (_("shared section"));
              LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
            }
                bfd_fatal (_("shared section"));
              LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
            }
@@ -1061,7 +1058,7 @@ main (int argc, char **argv)
   {
     const int    max_len  = NLM_MODULE_NAME_SIZE - 2;
     const char * filename = lbasename (output_file);
   {
     const int    max_len  = NLM_MODULE_NAME_SIZE - 2;
     const char * filename = lbasename (output_file);
-    
+
     len = strlen (filename);
     if (len > max_len)
       len = max_len;
     len = strlen (filename);
     if (len > max_len)
       len = max_len;
@@ -1419,6 +1416,9 @@ i386_mangle_relocs (bfd *outbfd, asection *insec, arelent ***relocs_ptr,
       bfd_vma addend;
 
       rel = *relocs++;
       bfd_vma addend;
 
       rel = *relocs++;
+      /* PR 17512: file: 057f89c1.  */
+      if (rel->sym_ptr_ptr == NULL)
+       continue;
       sym = *rel->sym_ptr_ptr;
 
       /* We're moving the relocs from the input section to the output
       sym = *rel->sym_ptr_ptr;
 
       /* We're moving the relocs from the input section to the output
@@ -1699,13 +1699,12 @@ powerpc_build_stubs (bfd *inbfd, bfd *outbfd ATTRIBUTE_UNUSED,
 
   /* Make a section to hold stubs.  We don't set SEC_HAS_CONTENTS for
      the section to prevent copy_sections from reading from it.  */
 
   /* Make a section to hold stubs.  We don't set SEC_HAS_CONTENTS for
      the section to prevent copy_sections from reading from it.  */
-  stub_sec = bfd_make_section (inbfd, ".stubs");
+  stub_sec = bfd_make_section_with_flags (inbfd, ".stubs",
+                                         (SEC_CODE
+                                          | SEC_RELOC
+                                          | SEC_ALLOC
+                                          | SEC_LOAD));
   if (stub_sec == (asection *) NULL
   if (stub_sec == (asection *) NULL
-      || ! bfd_set_section_flags (inbfd, stub_sec,
-                                 (SEC_CODE
-                                  | SEC_RELOC
-                                  | SEC_ALLOC
-                                  | SEC_LOAD))
       || ! bfd_set_section_alignment (inbfd, stub_sec, 2))
     bfd_fatal (".stubs");
 
       || ! bfd_set_section_alignment (inbfd, stub_sec, 2))
     bfd_fatal (".stubs");
 
@@ -1713,14 +1712,13 @@ powerpc_build_stubs (bfd *inbfd, bfd *outbfd ATTRIBUTE_UNUSED,
   got_sec = bfd_get_section_by_name (inbfd, ".got");
   if (got_sec == (asection *) NULL)
     {
   got_sec = bfd_get_section_by_name (inbfd, ".got");
   if (got_sec == (asection *) NULL)
     {
-      got_sec = bfd_make_section (inbfd, ".got");
+      got_sec = bfd_make_section_with_flags (inbfd, ".got",
+                                            (SEC_DATA
+                                             | SEC_RELOC
+                                             | SEC_ALLOC
+                                             | SEC_LOAD
+                                             | SEC_HAS_CONTENTS));
       if (got_sec == (asection *) NULL
       if (got_sec == (asection *) NULL
-         || ! bfd_set_section_flags (inbfd, got_sec,
-                                     (SEC_DATA
-                                      | SEC_RELOC
-                                      | SEC_ALLOC
-                                      | SEC_LOAD
-                                      | SEC_HAS_CONTENTS))
          || ! bfd_set_section_alignment (inbfd, got_sec, 2))
        bfd_fatal (".got");
     }
          || ! bfd_set_section_alignment (inbfd, got_sec, 2))
        bfd_fatal (".got");
     }
@@ -1877,7 +1875,7 @@ powerpc_mangle_relocs (bfd *outbfd, asection *insec,
 
   toc_howto = bfd_reloc_type_lookup (insec->owner, BFD_RELOC_PPC_TOC16);
   if (toc_howto == (reloc_howto_type *) NULL)
 
   toc_howto = bfd_reloc_type_lookup (insec->owner, BFD_RELOC_PPC_TOC16);
   if (toc_howto == (reloc_howto_type *) NULL)
-    abort ();
+    fatal (_("Unable to locate PPC_TOC16 reloc information"));
 
   /* If this is the .got section, clear out all the contents beyond
      the initial size.  We must do this here because copy_sections is
 
   /* If this is the .got section, clear out all the contents beyond
      the initial size.  We must do this here because copy_sections is
@@ -1916,6 +1914,10 @@ powerpc_mangle_relocs (bfd *outbfd, asection *insec,
            }
        }
 
            }
        }
 
+      /* PR 17512: file: 70cfde95.  */
+      if (rel->howto == NULL)
+       continue;
+
       /* We must be able to resolve all PC relative relocs at this
         point.  If we get a branch to an undefined symbol we build a
         stub, since NetWare will resolve undefined symbols into a
       /* We must be able to resolve all PC relative relocs at this
         point.  If we get a branch to an undefined symbol we build a
         stub, since NetWare will resolve undefined symbols into a
@@ -1933,6 +1935,13 @@ powerpc_mangle_relocs (bfd *outbfd, asection *insec,
            {
              bfd_vma val;
 
            {
              bfd_vma val;
 
+             if (rel->address > contents_size - 4)
+               {
+                 non_fatal (_("Out of range relocation: %lx"),
+                            (long) rel->address);
+                 break;
+               }
+
              assert (rel->howto->size == 2 && rel->howto->pcrel_offset);
              val = bfd_get_32 (outbfd, (bfd_byte *) contents + rel->address);
              val = ((val &~ rel->howto->dst_mask)
              assert (rel->howto->size == 2 && rel->howto->pcrel_offset);
              val = bfd_get_32 (outbfd, (bfd_byte *) contents + rel->address);
              val = ((val &~ rel->howto->dst_mask)
@@ -1982,6 +1991,13 @@ powerpc_mangle_relocs (bfd *outbfd, asection *insec,
          switch (rel->howto->size)
            {
            case 1:
          switch (rel->howto->size)
            {
            case 1:
+             if (rel->address > contents_size - 2)
+               {
+                 non_fatal (_("Out of range relocation: %lx"),
+                            (long) rel->address);
+                 break;
+               }
+
              val = bfd_get_16 (outbfd,
                                (bfd_byte *) contents + rel->address);
              val = ((val &~ rel->howto->dst_mask)
              val = bfd_get_16 (outbfd,
                                (bfd_byte *) contents + rel->address);
              val = ((val &~ rel->howto->dst_mask)
@@ -1997,6 +2013,14 @@ powerpc_mangle_relocs (bfd *outbfd, asection *insec,
              break;
 
            case 2:
              break;
 
            case 2:
+             /* PR 17512: file: 0455a112.  */
+             if (rel->address > contents_size - 4)
+               {
+                 non_fatal (_("Out of range relocation: %lx"),
+                            (long) rel->address);
+                 break;
+               }
+
              val = bfd_get_32 (outbfd,
                                (bfd_byte *) contents + rel->address);
              val = ((val &~ rel->howto->dst_mask)
              val = bfd_get_32 (outbfd,
                                (bfd_byte *) contents + rel->address);
              val = ((val &~ rel->howto->dst_mask)
@@ -2008,7 +2032,7 @@ powerpc_mangle_relocs (bfd *outbfd, asection *insec,
              break;
 
            default:
              break;
 
            default:
-             abort ();
+             fatal (_("Unsupported relocation size: %d"), rel->howto->size);
            }
 
          if (! bfd_is_und_section (bfd_get_section (sym)))
            }
 
          if (! bfd_is_und_section (bfd_get_section (sym)))
@@ -2043,7 +2067,7 @@ powerpc_mangle_relocs (bfd *outbfd, asection *insec,
    file.  */
 
 static char *
    file.  */
 
 static char *
-link_inputs (struct string_list *inputs, char *ld, char * map_file)
+link_inputs (struct string_list *inputs, char *ld, char * mfile)
 {
   size_t c;
   struct string_list *q;
 {
   size_t c;
   struct string_list *q;
@@ -2058,7 +2082,7 @@ link_inputs (struct string_list *inputs, char *ld, char * map_file)
   for (q = inputs; q != NULL; q = q->next)
     ++c;
 
   for (q = inputs; q != NULL; q = q->next)
     ++c;
 
-  argv = (char **) alloca ((c + 7) * sizeof (char *));
+  argv = (char **) xmalloc ((c + 7) * sizeof (char *));
 
 #ifndef __MSDOS__
   if (ld == NULL)
 
 #ifndef __MSDOS__
   if (ld == NULL)
@@ -2092,12 +2116,12 @@ link_inputs (struct string_list *inputs, char *ld, char * map_file)
   argv[3] = unlink_on_exit;
   /* If we have been given the name of a mapfile and that
      name is not 'stderr' then pass it on to the linker.  */
   argv[3] = unlink_on_exit;
   /* If we have been given the name of a mapfile and that
      name is not 'stderr' then pass it on to the linker.  */
-  if (map_file
-      && * map_file
-      && strcmp (map_file, "stderr") == 0)
+  if (mfile
+      && * mfile
+      && strcmp (mfile, "stderr") == 0)
     {
       argv[4] = (char *) "-Map";
     {
       argv[4] = (char *) "-Map";
-      argv[5] = map_file;
+      argv[5] = mfile;
       i = 6;
     }
   else
       i = 6;
     }
   else
@@ -2116,6 +2140,8 @@ link_inputs (struct string_list *inputs, char *ld, char * map_file)
 
   pid = pexecute (ld, argv, program_name, (char *) NULL, &errfmt, &errarg,
                  PEXECUTE_SEARCH | PEXECUTE_ONE);
 
   pid = pexecute (ld, argv, program_name, (char *) NULL, &errfmt, &errarg,
                  PEXECUTE_SEARCH | PEXECUTE_ONE);
+  free (argv);
+
   if (pid == -1)
     {
       fprintf (stderr, _("%s: execution of %s failed: "), program_name, ld);
   if (pid == -1)
     {
       fprintf (stderr, _("%s: execution of %s failed: "), program_name, ld);
This page took 0.029122 seconds and 4 git commands to generate.