aboutsummaryrefslogtreecommitdiff
path: root/bfd/som.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1994-03-31 06:50:42 +0000
committerJeff Law <law@redhat.com>1994-03-31 06:50:42 +0000
commit06e6eb0e53edcac2603577d2f8db1ad85f562d95 (patch)
treeef61384db33fb5eef5e0b267769816b01b3a34c2 /bfd/som.c
parentbfb089946fc55f31ee32ab592c7438c78adc7457 (diff)
downloadgdb-06e6eb0e53edcac2603577d2f8db1ad85f562d95.zip
gdb-06e6eb0e53edcac2603577d2f8db1ad85f562d95.tar.gz
gdb-06e6eb0e53edcac2603577d2f8db1ad85f562d95.tar.bz2
* 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!).
Diffstat (limited to 'bfd/som.c')
-rw-r--r--bfd/som.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/bfd/som.c b/bfd/som.c
index 7d56537..98991e1 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. */