2007-03-24 Paul Brook <paul@codesourcery.com>
[binutils-gdb.git] / binutils / nlmconv.c
index 9b5e4c8ead7d15ea0161956c61b4c5db352c7cd5..1d477086a8eea5001f525f67b15f5695fab94e6a 100644 (file)
@@ -1,6 +1,6 @@
 /* nlmconv.c -- NLM conversion program
    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
 
@@ -16,7 +16,7 @@
 
    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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 /* Written by Ian Lance Taylor <ian@cygnus.com>.
 
 #undef strerror
 extern char *strerror (int);
 
-#ifndef localtime
-extern struct tm *localtime ();
-#endif
-
 #ifndef SEEK_SET
 #define SEEK_SET 0
 #endif
@@ -197,7 +193,7 @@ main (int argc, char **argv)
   bfd *sharedbfd;
   size_t shared_offset = 0;
   size_t shared_size = 0;
-  Nlm_Internal_Fixed_Header sharedhdr;
+  static Nlm_Internal_Fixed_Header sharedhdr;
   int len;
   char *modname;
   char **matching;
@@ -214,6 +210,8 @@ main (int argc, char **argv)
   program_name = argv[0];
   xmalloc_set_program_name (program_name);
 
+  expandargv (&argc, &argv);
+
   bfd_init ();
   set_default_bfd_target ();
 
@@ -739,7 +737,7 @@ main (int argc, char **argv)
              || ! bfd_set_section_flags (outbfd, help_section,
                                          SEC_HAS_CONTENTS))
            bfd_fatal (_("help section"));
-         strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8);
+         LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
        }
     }
   if (message_file != NULL)
@@ -761,7 +759,7 @@ main (int argc, char **argv)
              || ! bfd_set_section_flags (outbfd, message_section,
                                          SEC_HAS_CONTENTS))
            bfd_fatal (_("message section"));
-         strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8);
+         LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
        }
     }
   if (modules != NULL)
@@ -797,7 +795,7 @@ main (int argc, char **argv)
              || ! bfd_set_section_flags (outbfd, rpc_section,
                                          SEC_HAS_CONTENTS))
            bfd_fatal (_("rpc section"));
-         strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8);
+         LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
        }
     }
   if (sharelib_file != NULL)
@@ -854,20 +852,20 @@ main (int argc, char **argv)
                  || ! bfd_set_section_flags (outbfd, shared_section,
                                              SEC_HAS_CONTENTS))
                bfd_fatal (_("shared section"));
-             strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8);
+             LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
            }
        }
     }
 
   /* Check whether a version was given.  */
-  if (strncmp (version_hdr->stamp, "VeRsIoN#", 8) != 0)
+  if (!CONST_STRNEQ (version_hdr->stamp, "VeRsIoN#"))
     non_fatal (_("warning: No version number given"));
 
   /* At least for now, always create an extended header, because that
      is what NLMLINK does.  */
-  strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8);
+  LITMEMCPY (nlm_extended_header (outbfd)->stamp, "MeSsAgEs");
 
-  strncpy (nlm_cygnus_ext_header (outbfd)->stamp, "CyGnUsEx", 8);
+  LITMEMCPY (nlm_cygnus_ext_header (outbfd)->stamp, "CyGnUsEx");
 
   /* If the date was not given, force it in.  */
   if (nlm_version_header (outbfd)->month == 0
@@ -882,7 +880,7 @@ main (int argc, char **argv)
       nlm_version_header (outbfd)->month = ptm->tm_mon + 1;
       nlm_version_header (outbfd)->day = ptm->tm_mday;
       nlm_version_header (outbfd)->year = ptm->tm_year + 1900;
-      strncpy (version_hdr->stamp, "VeRsIoN#", 8);
+      LITMEMCPY (version_hdr->stamp, "VeRsIoN#");
     }
 
 #ifdef NLMCONV_POWERPC
@@ -980,7 +978,7 @@ main (int argc, char **argv)
       for (l = modules; l != NULL; l = l->next)
        {
          *set = strlen (l->string);
-         strncpy (set + 1, l->string, *set);
+         strncpy ((char *) set + 1, l->string, *set);
          set += *set + 1;
          ++c;
        }
@@ -1057,18 +1055,24 @@ main (int argc, char **argv)
        sharedhdr.exitProcedureOffset;
       free (data);
     }
-  len = strlen (output_file);
-  if (len > NLM_MODULE_NAME_SIZE - 2)
-    len = NLM_MODULE_NAME_SIZE - 2;
-  nlm_fixed_header (outbfd)->moduleName[0] = len;
-
-  strncpy (nlm_fixed_header (outbfd)->moduleName + 1, output_file,
-          NLM_MODULE_NAME_SIZE - 2);
-  nlm_fixed_header (outbfd)->moduleName[NLM_MODULE_NAME_SIZE - 1] = '\0';
-  for (modname = nlm_fixed_header (outbfd)->moduleName;
-       *modname != '\0';
-       modname++)
-    *modname = TOUPPER (*modname);
+
+  {
+    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;
+    nlm_fixed_header (outbfd)->moduleName[0] = len;
+
+    strncpy (nlm_fixed_header (outbfd)->moduleName + 1, filename, max_len);
+    nlm_fixed_header (outbfd)->moduleName[max_len + 1] = '\0';
+
+    for (modname = nlm_fixed_header (outbfd)->moduleName;
+        *modname != '\0';
+        modname++)
+      *modname = TOUPPER (*modname);
+  }
 
   strncpy (nlm_variable_header (outbfd)->oldThreadName, " LONG",
           NLM_OLD_THREAD_NAME_LENGTH);
@@ -1101,10 +1105,11 @@ show_usage (FILE *file, int status)
   -T --header-file=<file>       Read <file> for NLM header information\n\
   -l --linker=<linker>          Use <linker> for any linking\n\
   -d --debug                    Display on stderr the linker command line\n\
+  @<file>                       Read options from <file>.\n\
   -h --help                     Display this information\n\
   -v --version                  Display the program's version\n\
 "));
-  if (status == 0)
+  if (REPORT_BUGS_TO[0] && status == 0)
     fprintf (file, _("Report bugs to %s\n"), REPORT_BUGS_TO);
   exit (status);
 }
@@ -1742,9 +1747,9 @@ powerpc_build_stubs (bfd *inbfd, bfd *outbfd ATTRIBUTE_UNUSED,
 
       /* Make a new undefined symbol with the same name but without
         the leading `.'.  */
-      newsym = (asymbol *) xmalloc (sizeof (asymbol));
+      newsym = xmalloc (sizeof (asymbol));
       *newsym = *sym;
-      newname = (char *) xmalloc (strlen (bfd_asymbol_name (sym)));
+      newname = xmalloc (strlen (bfd_asymbol_name (sym)));
       strcpy (newname, bfd_asymbol_name (sym) + 1);
       newsym->name = newname;