* doc/binutils.texi (objdump): Document support for disassembling the 440 PowerPC...
[deliverable/binutils-gdb.git] / binutils / nlmconv.c
index 5a644e44669f874f83d52979d0453ebf69d1b18c..6b8db6d9b5de23df64d73657f589d43697e89f19 100644 (file)
@@ -1,6 +1,6 @@
 /* nlmconv.c -- NLM conversion program
-   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+   2003, 2004, 2005, 2006 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
@@ -133,7 +129,7 @@ static void mangle_relocs
   (bfd *, asection *, arelent ***, long *, char *, bfd_size_type);
 static void default_mangle_relocs
   (bfd *, asection *, arelent ***, long *, char *, bfd_size_type);
-static char *link_inputs (struct string_list *, char *);
+static char *link_inputs (struct string_list *, char *, char *);
 
 #ifdef NLMCONV_I386
 static void i386_mangle_relocs (bfd *, asection *, arelent ***, long *, char *, bfd_size_type);
@@ -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 ();
 
@@ -320,7 +318,7 @@ main (int argc, char **argv)
       if (input_files->next == NULL)
        input_file = input_files->string;
       else
-       input_file = link_inputs (input_files, ld_arg);
+       input_file = link_inputs (input_files, ld_arg, map_file);
     }
   else if (input_file == NULL)
     {
@@ -431,7 +429,7 @@ main (int argc, char **argv)
     {
       bfd_size_type add;
 
-      vma = bfd_get_section_size_before_reloc (data_sec);
+      vma = bfd_get_section_size (data_sec);
       align = 1 << bss_sec->alignment_power;
       add = ((vma + align - 1) &~ (align - 1)) - vma;
       vma += add;
@@ -441,7 +439,7 @@ main (int argc, char **argv)
        {
          bfd_size_type data_size;
 
-         data_size = bfd_get_section_size_before_reloc (data_sec);
+         data_size = bfd_get_section_size (data_sec);
          if (! bfd_set_section_size (outbfd, data_sec, data_size + add))
            bfd_fatal (_("set .data size"));
        }
@@ -459,7 +457,7 @@ main (int argc, char **argv)
   endsym = NULL;
   for (i = 0; i < symcount; i++)
     {
-      register asymbol *sym;
+      asymbol *sym;
 
       sym = symbols[i];
 
@@ -499,14 +497,14 @@ main (int argc, char **argv)
         symbols into the .bss section, and mark them as exported.  */
       if (bfd_is_com_section (bfd_get_section (sym)))
        {
-         bfd_vma size;
+         bfd_vma size = sym->value;
 
          sym->section = bss_sec;
-         size = sym->value;
-         sym->value = bss_sec->_raw_size;
-         bss_sec->_raw_size += size;
+         sym->value = bfd_get_section_size (bss_sec);
+         size += sym->value;
          align = 1 << bss_sec->alignment_power;
-         bss_sec->_raw_size = (bss_sec->_raw_size + align - 1) &~ (align - 1);
+         size = (size + align - 1) & ~(align - 1);
+         bfd_set_section_size (outbfd, bss_sec, size);
          sym->flags |= BSF_EXPORT | BSF_GLOBAL;
        }
       else if (bfd_get_section (sym)->output_section != NULL)
@@ -555,7 +553,7 @@ main (int argc, char **argv)
       /* If this is a global symbol, check the export list.  */
       if ((sym->flags & (BSF_EXPORT | BSF_GLOBAL)) != 0)
        {
-         register struct string_list *l;
+         struct string_list *l;
          int found_simple;
 
          /* Unfortunately, a symbol can appear multiple times on the
@@ -603,7 +601,7 @@ main (int argc, char **argv)
         Change the prefix if necessary.  */
       if (bfd_is_und_section (bfd_get_section (sym)))
        {
-         register struct string_list *l;
+         struct string_list *l;
 
          for (l = import_symbols; l != NULL; l = l->next)
            {
@@ -670,7 +668,7 @@ main (int argc, char **argv)
 
   if (endsym != NULL)
     {
-      endsym->value = bfd_get_section_size_before_reloc (bss_sec);
+      endsym->value = bfd_get_section_size (bss_sec);
 
       /* FIXME: If any relocs referring to _end use inplace addends,
         then I think they need to be updated.  This is handled by
@@ -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
@@ -922,8 +920,8 @@ main (int argc, char **argv)
         export information and the debugging information.  */
       nlm_fixed_header (outbfd)->debugInfoOffset = (file_ptr) -1;
     }
-  if (map_file != NULL)
-    non_fatal (_("warning: MAP and FULLMAP are not supported; try ld -M"));
+  if (full_map)
+    non_fatal (_("warning: FULLMAP is not supported; try ld -M"));
   if (help_file != NULL)
     {
       void *data;
@@ -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,6 +1105,7 @@ 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\
 "));
@@ -1230,11 +1235,7 @@ copy_sections (bfd *inbfd, asection *insec, void *data_ptr)
   outsec = insec->output_section;
   assert (outsec != NULL);
 
-  size = bfd_get_section_size_before_reloc (insec);
-
-  /* FIXME: Why are these necessary?  */
-  insec->_cooked_size = insec->_raw_size;
-  insec->reloc_done = TRUE;
+  size = bfd_get_section_size (insec);
 
   if ((bfd_get_section_flags (inbfd, insec) & SEC_HAS_CONTENTS) == 0)
     contents = NULL;
@@ -1365,8 +1366,8 @@ default_mangle_relocs (bfd *outbfd ATTRIBUTE_UNUSED, asection *insec,
   if (insec->output_offset != 0)
     {
       long reloc_count;
-      register arelent **relocs;
-      register long i;
+      arelent **relocs;
+      long i;
 
       reloc_count = *reloc_count_ptr;
       relocs = *relocs_ptr;
@@ -1553,13 +1554,13 @@ static reloc_howto_type nlm32_alpha_nw_howto =
 
 static void
 alpha_mangle_relocs (bfd *outbfd, asection *insec,
-                    register arelent ***relocs_ptr, long *reloc_count_ptr,
+                    arelent ***relocs_ptr, long *reloc_count_ptr,
                     char *contents ATTRIBUTE_UNUSED,
                     bfd_size_type contents_size ATTRIBUTE_UNUSED)
 {
   long old_reloc_count;
   arelent **old_relocs;
-  register arelent **relocs;
+  arelent **relocs;
 
   old_reloc_count = *reloc_count_ptr;
   old_relocs = *relocs_ptr;
@@ -1615,7 +1616,7 @@ alpha_mangle_relocs (bfd *outbfd, asection *insec,
 
   if (insec->output_offset != 0)
     {
-      register bfd_size_type i;
+      bfd_size_type i;
 
       for (i = 0; i < (bfd_size_type) old_reloc_count; i++, relocs++)
        (*relocs)->address += insec->output_offset;
@@ -1746,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;
 
@@ -1863,14 +1864,14 @@ powerpc_resolve_stubs (bfd *inbfd, bfd *outbfd)
 
 static void
 powerpc_mangle_relocs (bfd *outbfd, asection *insec,
-                      register arelent ***relocs_ptr,
+                      arelent ***relocs_ptr,
                       long *reloc_count_ptr, char *contents,
                       bfd_size_type contents_size ATTRIBUTE_UNUSED)
 {
   reloc_howto_type *toc_howto;
   long reloc_count;
-  register arelent **relocs;
-  register long i;
+  arelent **relocs;
+  long i;
 
   toc_howto = bfd_reloc_type_lookup (insec->owner, BFD_RELOC_PPC_TOC16);
   if (toc_howto == (reloc_howto_type *) NULL)
@@ -1881,8 +1882,7 @@ powerpc_mangle_relocs (bfd *outbfd, asection *insec,
      going to write out whatever we return in the contents field.  */
   if (strcmp (bfd_get_section_name (insec->owner, insec), ".got") == 0)
     memset (contents + powerpc_initial_got_size, 0,
-           (size_t) (bfd_get_section_size_after_reloc (insec)
-                     - powerpc_initial_got_size));
+           (size_t) (bfd_get_section_size (insec) - powerpc_initial_got_size));
 
   reloc_count = *reloc_count_ptr;
   relocs = *relocs_ptr;
@@ -2041,7 +2041,7 @@ powerpc_mangle_relocs (bfd *outbfd, asection *insec,
    file.  */
 
 static char *
-link_inputs (struct string_list *inputs, char *ld)
+link_inputs (struct string_list *inputs, char *ld, char * map_file)
 {
   size_t c;
   struct string_list *q;
@@ -2056,7 +2056,7 @@ link_inputs (struct string_list *inputs, char *ld)
   for (q = inputs; q != NULL; q = q->next)
     ++c;
 
-  argv = (char **) alloca ((c + 5) * sizeof(char *));
+  argv = (char **) alloca ((c + 7) * sizeof (char *));
 
 #ifndef __MSDOS__
   if (ld == NULL)
@@ -2088,7 +2088,19 @@ link_inputs (struct string_list *inputs, char *ld)
   argv[1] = (char *) "-Ur";
   argv[2] = (char *) "-o";
   argv[3] = unlink_on_exit;
-  i = 4;
+  /* 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)
+    {
+      argv[4] = (char *) "-Map";
+      argv[5] = map_file;
+      i = 6;
+    }
+  else
+    i = 4;
+
   for (q = inputs; q != NULL; q = q->next, i++)
     argv[i] = q->string;
   argv[i] = NULL;
This page took 0.029279 seconds and 4 git commands to generate.