* 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
{
asection *subsection;
int first_subspace;
+ unsigned int subspace_offset = 0;
/* Find a space. */
while (!som_is_space (section))
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)
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
{
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. */