* som.c (som_prep_headers): New function.
authorJeff Law <law@redhat.com>
Sat, 13 Nov 1993 06:44:29 +0000 (06:44 +0000)
committerJeff Law <law@redhat.com>
Sat, 13 Nov 1993 06:44:29 +0000 (06:44 +0000)
bfd/ChangeLog
bfd/som.c

index 4050edb6eca6bd458c93158b81cc34cb275c0481..d3341c36d425ad40ee44f2d2c5452dce674fa20a 100644 (file)
@@ -1,5 +1,7 @@
 Fri Nov 12 15:29:36 1993  Jeffrey A. Law  (law@snake.cs.utah.edu)
 
+       * som.c (som_prep_headers): New function.
+
        * som.c (som_count_spaces): New function.
        (som_count_subspaces): New function.
        (compare_syms): New function.
index 3bcc1d5f758fdf3ba708de22eb876d374f4c24e7..2593206c184d69261e2d0264b8b51280fbd36d8b 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -153,7 +153,8 @@ static unsigned long som_count_spaces PARAMS ((bfd *));
 static unsigned long som_count_subspaces PARAMS ((bfd *));
 static int compare_syms PARAMS ((asymbol **, asymbol **));
 static unsigned long som_compute_checksum PARAMS ((bfd *));
-
+static boolean som_prep_headers PARAMS ((bfd *));
 static reloc_howto_type som_hppa_howto_table[] =
 {
   {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"},
@@ -1165,6 +1166,98 @@ som_mkobject (abfd)
   return true;
 }
 
+/* Initialize some information in the file header.  This routine makes
+   not attempt at doing the right thing for a full executable; it
+   is only meant to handle relocatable objects.  */
+
+static boolean
+som_prep_headers (abfd)
+     bfd *abfd;
+{
+  struct header *file_hdr = obj_som_file_hdr (abfd);
+  asection *section;
+
+  /* FIXME.  This should really be conditional based on whether or not
+     PA1.1 instructions/registers have been used.  */
+  file_hdr->system_id = HP9000S800_ID;
+
+  /* FIXME.  Only correct for building relocatable objects.  */
+  if (abfd->flags & EXEC_P)
+    abort ();
+  else
+    file_hdr->a_magic = RELOC_MAGIC;
+
+  /* Only new format SOM is supported.  */
+  file_hdr->version_id = NEW_VERSION_ID;
+
+  /* These fields are optional, and embedding timestamps is not always
+     a wise thing to do, it makes comparing objects during a multi-stage
+     bootstrap difficult.  */
+  file_hdr->file_time.secs = 0;
+  file_hdr->file_time.nanosecs = 0; 
+
+  if (abfd->flags & EXEC_P)
+    abort ();
+  else
+    {
+      file_hdr->entry_space = 0;
+      file_hdr->entry_subspace = 0;
+      file_hdr->entry_offset = 0;
+    }
+  
+  /* FIXME.  I do not know if we ever need to put anything other
+     than zero in this field.  */
+  file_hdr->presumed_dp = 0;
+
+  /* Now iterate over the sections translating information from
+     BFD sections to SOM spaces/subspaces.  */
+
+  for (section = abfd->sections; section != NULL; section = section->next)
+    {
+      /* Ignore anything which has not been marked as a space or
+        subspace.  */
+      if (som_section_data (section)->is_space == 0
+
+         && som_section_data (section)->is_subspace == 0)
+       continue;
+
+      if (som_section_data (section)->is_space)
+       {
+         /* Set space attributes.  Note most attributes of SOM spaces
+            are set based on the subspaces it contains.  */
+         som_section_data (section)->space_dict.loader_fix_index = -1;
+         som_section_data (section)->space_dict.init_pointer_index = -1;
+       }
+      else
+       {
+         /* Set subspace attributes.  Basic stuff is done here, additional
+            attributes are filled in later as more information becomes
+            available.  */
+         if (section->flags & SEC_IS_COMMON)
+           {
+             som_section_data (section)->subspace_dict.dup_common = 1;
+             som_section_data (section)->subspace_dict.is_common = 1;
+           }
+
+         if (section->flags & SEC_ALLOC)
+           som_section_data (section)->subspace_dict.is_loadable = 1;
+
+         if (section->flags & SEC_CODE)
+           som_section_data (section)->subspace_dict.code_only = 1;
+
+         som_section_data (section)->subspace_dict.subspace_start = 
+           section->vma;
+         som_section_data (section)->subspace_dict.subspace_length =
+           bfd_section_size (abfd, section);
+         som_section_data (section)->subspace_dict.initialization_length =
+           bfd_section_size (abfd, section);
+         som_section_data (section)->subspace_dict.alignment = 
+           1 << section->alignment_power;
+       }
+    }
+  return true;
+}
+
 /* Count and return the number of spaces attached to the given BFD.  */
 
 static unsigned long