diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4050edb6eca..d3341c36d42 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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. diff --git a/bfd/som.c b/bfd/som.c index 3bcc1d5f758..2593206c184 100644 --- 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