* som.c (som_begin_writing): New approach at dealing with holes
authorJeff Law <law@redhat.com>
Thu, 31 Mar 1994 06:50:42 +0000 (06:50 +0000)
committerJeff Law <law@redhat.com>
Thu, 31 Mar 1994 06:50:42 +0000 (06:50 +0000)
        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
bfd/som.c

index 8d8cd7d686f610df2ec32d1f735bc7ac62b75577..c2d010550bf751d2c633eec19197a9c750525459 100644 (file)
@@ -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
index 7d56537c52693d11b58a4785f63bc5b13cc555f0..98991e1bc2ffb8e033b7bae2929a6a09d5e67d1c 100644 (file)
--- 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.  */