From 06e6eb0e53edcac2603577d2f8db1ad85f562d95 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 31 Mar 1994 06:50:42 +0000 Subject: [PATCH] * som.c (som_begin_writing): New approach at dealing with holes in executables left by the HP linker. Does not rely on subspace alignments as subspaces are *NOT* guaranteed to be properly aligned in an executable (can you believe that!). --- bfd/ChangeLog | 7 +++++++ bfd/som.c | 45 +++++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8d8cd7d686f..c2d010550bf 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -155,6 +155,13 @@ Mon Mar 28 12:53:27 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) * aoutx.h (translate_from_native_sym_flags): Set SEC_RELOC flag for generated constructor section. +Sun Mar 27 16:25:22 1994 Jeffrey A. Law (law@snake.cs.utah.edu) + + * som.c (som_begin_writing): New approach at dealing with holes + in executables left by the HP linker. Does not rely on subspace + alignments as subspaces are *NOT* guaranteed to be properly + aligned in an executable (can you believe that!). + Sat Mar 26 10:25:43 1994 Jeffrey A. Law (law@snake.cs.utah.edu) * som.c (som_get_section_contents): New function. Do not try diff --git a/bfd/som.c b/bfd/som.c index 7d56537c526..98991e1bc2f 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -2922,6 +2922,7 @@ som_begin_writing (abfd) { asection *subsection; int first_subspace; + unsigned int subspace_offset = 0; /* Find a space. */ while (!som_is_space (section)) @@ -2970,31 +2971,38 @@ som_begin_writing (abfd) exec_header.exec_dfile = current_offset; } + /* Keep track of exactly where we are within a particular + space. This is necessary as the braindamaged HPUX + loader will create holes between subspaces *and* + subspace alignments are *NOT* preserved. What a crock. */ + subspace_offset = subsection->vma; + /* Only do this for the first subspace within each space. */ first_subspace = 0; } else if (abfd->flags & EXEC_P) { - /* Have to keep proper alignments for the subspaces - in executables too! */ + /* The braindamaged HPUX loader may have created a hole + between two subspaces. It is *not* sufficient to use + the alignment specifications within the subspaces to + account for these holes -- I've run into at least one + case where the loader left one code subspace unaligned + in a final executable. + + To combat this we keep a current offset within each space, + and use the subspace vma fields to detect and preserve + holes. What a crock! + + ps. This is not necessary for unloadable space/subspaces. */ + current_offset += subsection->vma - subspace_offset; if (subsection->flags & SEC_CODE) - { - unsigned tmp = exec_header.exec_tsize; - - tmp = SOM_ALIGN (tmp, 1 << subsection->alignment_power); - current_offset += (tmp - exec_header.exec_tsize); - exec_header.exec_tsize = tmp; - } + exec_header.exec_tsize += subsection->vma - subspace_offset; else - { - unsigned tmp = exec_header.exec_dsize; - - tmp = SOM_ALIGN (tmp, 1 << subsection->alignment_power); - current_offset += (tmp - exec_header.exec_dsize); - exec_header.exec_dsize = tmp; - } + exec_header.exec_dsize += subsection->vma - subspace_offset; + subspace_offset += subsection->vma - subspace_offset; } + subsection->target_index = total_subspaces++; /* This is real data to be loaded from the file. */ if (subsection->flags & SEC_LOAD) @@ -3008,8 +3016,9 @@ som_begin_writing (abfd) exec_header.exec_dsize += subsection->_cooked_size; som_section_data (subsection)->subspace_dict->file_loc_init_value = current_offset; - section->filepos = current_offset; + subsection->filepos = current_offset; current_offset += bfd_section_size (abfd, subsection); + subspace_offset += bfd_section_size (abfd, subsection); } /* Looks like uninitialized data. */ else @@ -3065,7 +3074,7 @@ som_begin_writing (abfd) { som_section_data (subsection)->subspace_dict->file_loc_init_value = current_offset; - section->filepos = current_offset; + subsection->filepos = current_offset; current_offset += bfd_section_size (abfd, subsection); } /* Looks like uninitialized data. */ -- 2.30.2