diff options
author | Jeff Law <law@redhat.com> | 1993-11-13 08:02:43 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1993-11-13 08:02:43 +0000 |
commit | efc0df7cff1b364e7057d718c332753e88406b5f (patch) | |
tree | 3f5e3fd667f8df27d527150ea3cbdc0a0898e501 /bfd/som.c | |
parent | 7057b78fb81a4611d80ae987ae6ebff702254345 (diff) | |
download | gdb-efc0df7cff1b364e7057d718c332753e88406b5f.zip gdb-efc0df7cff1b364e7057d718c332753e88406b5f.tar.gz gdb-efc0df7cff1b364e7057d718c332753e88406b5f.tar.bz2 |
* som.c (som_write_headers): New function.
Diffstat (limited to 'bfd/som.c')
-rw-r--r-- | bfd/som.c | 177 |
1 files changed, 177 insertions, 0 deletions
@@ -159,6 +159,7 @@ static int compare_syms PARAMS ((asymbol **, asymbol **)); static unsigned long som_compute_checksum PARAMS ((bfd *)); static boolean som_prep_headers PARAMS ((bfd *)); static int som_sizeof_headers PARAMS ((bfd *, boolean)); +static boolean som_write_headers PARAMS ((bfd *)); static reloc_howto_type som_hppa_howto_table[] = { @@ -1440,6 +1441,182 @@ compare_syms (sym1, sym2) return 0; } +/* Finally, scribble out the various headers to the disk. */ + +static boolean +som_write_headers (abfd) + bfd *abfd; +{ + int num_spaces = som_count_spaces (abfd); + int i; + int subspace_index = 0; + file_ptr location; + asection *section; + + /* Subspaces are written first so that we can set up information + about them in their containing spaces as the subspace is written. */ + + /* Seek to the start of the subspace dictionary records. */ + location = obj_som_file_hdr (abfd)->subspace_location; + bfd_seek (abfd, location, SEEK_SET); + section = abfd->sections; + /* Now for each loadable space write out records for its subspaces. */ + for (i = 0; i < num_spaces; i++) + { + asection *subsection; + + /* Find a space. */ + while (som_section_data (section)->is_space == 0) + section = section->next; + + /* Now look for all its subspaces. */ + for (subsection = abfd->sections; + subsection != NULL; + subsection = subsection->next) + { + + /* Skip any section which does not correspond to a space + or subspace. Or does not have SEC_ALLOC set (and therefore + has no real bits on the disk). */ + if (som_section_data (subsection)->is_subspace == 0 + || som_section_data (subsection)->containing_space != section + || (subsection->flags & SEC_ALLOC) == 0) + continue; + + /* If this is the first subspace for this space, then save + the index of the subspace in its containing space. Also + set "is_loadable" in the containing space. */ + + if (som_section_data (section)->space_dict.subspace_quantity == 0) + { + som_section_data (section)->space_dict.is_loadable = 1; + som_section_data (section)->space_dict.subspace_index + = subspace_index; + } + + /* Increment the number of subspaces seen and the number of + subspaces contained within the current space. */ + subspace_index++; + som_section_data (section)->space_dict.subspace_quantity++; + + /* Mark the index of the current space within the subspace's + dictionary record. */ + som_section_data (subsection)->subspace_dict.space_index = i; + + /* Dump the current subspace header. */ + if (bfd_write ((PTR) &som_section_data (subsection)->subspace_dict, + sizeof (struct subspace_dictionary_record), 1, abfd) + != sizeof (struct subspace_dictionary_record)) + { + bfd_error = system_call_error; + return false; + } + } + /* Goto the next section. */ + section = section->next; + } + + /* Now repeat the process for unloadable subspaces. */ + section = abfd->sections; + /* Now for each space write out records for its subspaces. */ + for (i = 0; i < num_spaces; i++) + { + asection *subsection; + + /* Find a space. */ + while (som_section_data (section)->is_space == 0) + section = section->next; + + /* Now look for all its subspaces. */ + for (subsection = abfd->sections; + subsection != NULL; + subsection = subsection->next) + { + + /* Skip any section which does not correspond to a space or + subspace, or which SEC_ALLOC set (and therefore handled + in the loadable spaces/subspaces code above. */ + + if (som_section_data (subsection)->is_subspace == 0 + || som_section_data (subsection)->containing_space != section + || (subsection->flags & SEC_ALLOC) != 0) + continue; + + /* If this is the first subspace for this space, then save + the index of the subspace in its containing space. Clear + "is_loadable". */ + + if (som_section_data (section)->space_dict.subspace_quantity == 0) + { + som_section_data (section)->space_dict.is_loadable = 0; + som_section_data (section)->space_dict.subspace_index + = subspace_index; + } + + /* Increment the number of subspaces seen and the number of + subspaces contained within the current space. */ + som_section_data (section)->space_dict.subspace_quantity++; + subspace_index++; + + /* Mark the index of the current space within the subspace's + dictionary record. */ + som_section_data (subsection)->subspace_dict.space_index = i; + + /* Dump this subspace header. */ + if (bfd_write ((PTR) &som_section_data (subsection)->subspace_dict, + sizeof (struct subspace_dictionary_record), 1, abfd) + != sizeof (struct subspace_dictionary_record)) + { + bfd_error = system_call_error; + return false; + } + } + /* Goto the next section. */ + section = section->next; + } + + /* All the subspace dictiondary records are written, and all the + fields are set up in the space dictionary records. + + Seek to the right location and start writing the space + dictionary records. */ + location = obj_som_file_hdr (abfd)->space_location; + bfd_seek (abfd, location, SEEK_SET); + + section = abfd->sections; + for (i = 0; i < num_spaces; i++) + { + + /* Find a space. */ + while (som_section_data (section)->is_space == 0) + section = section->next; + + /* Dump its header */ + if (bfd_write ((PTR) &som_section_data (section)->space_dict, + sizeof (struct space_dictionary_record), 1, abfd) + != sizeof (struct space_dictionary_record)) + { + bfd_error = system_call_error; + return false; + } + + /* Goto the next section. */ + section = section->next; + } + + /* Only thing left to do is write out the file header. It is always + at location zero. Seek there and write it. */ + bfd_seek (abfd, (file_ptr) 0, SEEK_SET); + if (bfd_write ((PTR) obj_som_file_hdr (abfd), + sizeof (struct header), 1, abfd) + != sizeof (struct header)) + { + bfd_error = system_call_error; + return false; + } + return true; +} + static unsigned long som_compute_checksum (abfd) bfd *abfd; |