* nlmconv.c (secsec): New static variable.
authorIan Lance Taylor <ian@airs.com>
Thu, 21 Apr 1994 16:15:00 +0000 (16:15 +0000)
committerIan Lance Taylor <ian@airs.com>
Thu, 21 Apr 1994 16:15:00 +0000 (16:15 +0000)
(main): Create .nlmsections section in output BFD.  Store
information about it in sections header.
(setup_sections): Allocate space in sections header.
(copy_sections): Copy zero sized sections.  Put information about
each section in the sections header.

binutils/ChangeLog
binutils/nlmconv.c

index 2d3afa4..7bf72cc 100644 (file)
@@ -1,3 +1,12 @@
+Thu Apr 21 12:12:26 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
+
+       * nlmconv.c (secsec): New static variable.
+       (main): Create .nlmsections section in output BFD.  Store
+       information about it in sections header.
+       (setup_sections): Allocate space in sections header.
+       (copy_sections): Copy zero sized sections.  Put information about
+       each section in the sections header.
+
 Wed Apr 20 14:34:51 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 start-sanitize-powerpc-netware
 
index 0a58328..90178cf 100644 (file)
@@ -87,6 +87,20 @@ static int debug;
 /* The symbol table.  */
 static asymbol **symbols;
 
+/* A section we create in the output file to hold pointers to where
+   the sections of the input file end up.  We will put a pointer to
+   this section in the NLM header.  These is an entry for each input
+   section.  The format is
+       null terminated section name
+       zeroes to adjust to 4 byte boundary
+       4 byte section data file pointer
+       4 byte section size
+   We don't need a version number.  The way we find this information
+   is by finding a stamp in the NLM header information.  If we need to
+   change the format of this information, we can simply change the
+   stamp.  */
+static asection *secsec;
+
 /* A temporary file name to be unlinked on exit.  Actually, for most
    errors, we leave it around.  It's not clear whether that is helpful
    or not.  */
@@ -376,6 +390,16 @@ main (argc, argv)
          || ! bfd_set_section_alignment (outbfd, bss_sec, 1))
        bfd_fatal ("make .bss section");
     }
+
+  /* We store the original section names in the .nlmsections section,
+     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");
+  if (secsec == NULL)
+    bfd_fatal ("make .nlmsections section");
+  if (! bfd_set_section_flags (outbfd, secsec, SEC_HAS_CONTENTS))
+    bfd_fatal ("set .nlmsections flags");
 /* start-sanitize-powerpc-netware */
 
   /* For PowerPC NetWare we need to build stubs for calls to undefined
@@ -840,6 +864,8 @@ main (argc, argv)
      is what NLMLINK does.  */
   strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8);
 
+  strncpy (nlm_cygnus_section_header (outbfd)->stamp, "CyGnUsSeCs", 10);
+
   /* If the date was not given, force it in.  */
   if (nlm_version_header (outbfd)->month == 0
       && nlm_version_header (outbfd)->day == 0
@@ -1052,6 +1078,10 @@ main (argc, argv)
   strncpy (nlm_variable_header (outbfd)->oldThreadName, " LONG",
           NLM_OLD_THREAD_NAME_LENGTH);
 
+  nlm_cygnus_section_header (outbfd)->offset = secsec->filepos;
+  nlm_cygnus_section_header (outbfd)->length =
+    bfd_section_size (outbfd, secsec);
+
   if (! bfd_close (outbfd))
     bfd_fatal (output_file);
   if (! bfd_close (inbfd))
@@ -1138,6 +1168,7 @@ setup_sections (inbfd, insec, data_ptr)
   bfd_vma offset;
   bfd_size_type align;
   bfd_size_type add;
+  bfd_size_type secsecsize;
 
   /* FIXME: We don't want to copy the .reginfo section of an ECOFF
      file.  However, I don't have a good way to describe this section.
@@ -1187,6 +1218,15 @@ setup_sections (inbfd, insec, data_ptr)
     bfd_fatal ("set section flags");
 
   bfd_set_reloc (outbfd, outsec, (arelent **) NULL, 0);
+
+  /* For each input section we allocate space for an entry in
+     .nlmsections.  */
+  secsecsize = bfd_section_size (outbfd, secsec);
+  secsecsize += strlen (bfd_section_name (inbfd, insec)) + 1;
+  secsecsize = (secsecsize + 3) &~ 3;
+  secsecsize += 8;
+  if (! bfd_set_section_size (outbfd, secsec, secsecsize))
+    bfd_fatal ("set .nlmsections size");
 }
 
 /* Copy the section contents.  */
@@ -1197,25 +1237,29 @@ copy_sections (inbfd, insec, data_ptr)
      asection *insec;
      PTR data_ptr;
 {
+  static bfd_size_type secsecoff = 0;
   bfd *outbfd = (bfd *) data_ptr;
+  const char *inname;
   asection *outsec;
   bfd_size_type size;
   PTR contents;
   long reloc_size;
+  bfd_byte buf[4];
+  bfd_size_type add;
+
+  inname = bfd_section_name (inbfd, insec);
 
   /* FIXME: We don't want to copy the .reginfo section of an ECOFF
      file.  However, I don't have a good way to describe this section.
      We do want to copy the section when using objcopy.  */
   if (bfd_get_flavour (inbfd) == bfd_target_ecoff_flavour
-      && strcmp (bfd_section_name (inbfd, insec), ".reginfo") == 0)
+      && strcmp (inname, ".reginfo") == 0)
     return;
 
   outsec = insec->output_section;
   assert (outsec != NULL);
 
   size = bfd_get_section_size_before_reloc (insec);
-  if (size == 0)
-    return;
 
   /* FIXME: Why are these necessary?  */
   insec->_cooked_size = insec->_raw_size;
@@ -1273,6 +1317,34 @@ copy_sections (inbfd, insec, data_ptr)
        bfd_fatal (bfd_get_filename (outbfd));
       free (contents);
     }
+
+  /* Add this section to .nlmsections.  */
+  if (! bfd_set_section_contents (outbfd, secsec, (PTR) inname, secsecoff,
+                                 strlen (inname) + 1))
+    bfd_fatal ("set .nlmsection contents");
+  secsecoff += strlen (inname) + 1;
+
+  add = ((secsecoff + 3) &~ 3) - secsecoff;
+  if (add != 0)
+    {
+      bfd_h_put_32 (outbfd, (bfd_vma) 0, buf);
+      if (! bfd_set_section_contents (outbfd, secsec, buf, secsecoff, add))
+       bfd_fatal ("set .nlmsection contents");
+      secsecoff += add;
+    }
+
+  if (contents != NULL)
+    bfd_h_put_32 (outbfd, (bfd_vma) outsec->filepos, buf);
+  else
+    bfd_h_put_32 (outbfd, (bfd_vma) 0, buf);
+  if (! bfd_set_section_contents (outbfd, secsec, buf, secsecoff, 4))
+    bfd_fatal ("set .nlmsection contents");
+  secsecoff += 4;
+
+  bfd_h_put_32 (outbfd, (bfd_vma) size, buf);
+  if (! bfd_set_section_contents (outbfd, secsec, buf, secsecoff, 4))
+    bfd_fatal ("set .nlmsection contents");
+  secsecoff += 4;
 }
 
 /* Some, perhaps all, NetWare targets require changing the relocs used