From 404ed0cf486cc61956570a0fe4291abf28a013d7 Mon Sep 17 00:00:00 2001 From: Dave Anglin Date: Wed, 28 Jul 2004 22:23:53 +0000 Subject: [PATCH] PR 273 * som.c (setup_sections): Improve estimation of space sizes in relocatable objects. --- bfd/ChangeLog | 7 +++++++ bfd/som.c | 28 +++++++++++++++++++++++----- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index beac39c2a33..ef719fc3013 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2004-07-28 Nick Clifton + John David Anglin + + PR 273 + * som.c (setup_sections): Improve estimation of space sizes in + relocatable objects. + 2004-07-27 Jason Thorpe * config.bfd (hppa*-*-netbsd*): Set targ_defvec to bfd_elf32_hppa_nbsd_vec. Add bfd_elf32_hppa_linux_vec diff --git a/bfd/som.c b/bfd/som.c index 4b40f1bf12a..c35b344f1d0 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -1913,6 +1913,7 @@ setup_sections (abfd, file_hdr, current_offset) struct som_subspace_dictionary_record subspace, save_subspace; unsigned int subspace_index; asection *space_asect; + bfd_size_type space_size = 0; char *newname; /* Read the space dictionary element. */ @@ -2104,6 +2105,9 @@ setup_sections (abfd, file_hdr, current_offset) subspace_asect->alignment_power = exact_log2 (subspace.alignment); if (subspace_asect->alignment_power == (unsigned) -1) goto error_return; + + /* Keep track of the accumulated sizes of the sections. */ + space_size += subspace.subspace_length; } /* This can happen for a .o which defines symbols in otherwise @@ -2111,11 +2115,25 @@ setup_sections (abfd, file_hdr, current_offset) if (!save_subspace.file_loc_init_value) space_asect->size = 0; else - /* Setup the size for the space section based upon the info in the - last subspace of the space. */ - space_asect->size = (save_subspace.subspace_start - - space_asect->vma - + save_subspace.subspace_length); + { + if (file_hdr->a_magic != RELOC_MAGIC) + { + /* Setup the size for the space section based upon the info + in the last subspace of the space. */ + space_asect->size = (save_subspace.subspace_start + - space_asect->vma + + save_subspace.subspace_length); + } + else + { + /* The subspace_start field is not initialised in relocatable + only objects, so it cannot be used for length calculations. + Instead we use the space_size value which we have been + accumulating. This isn't an accurate estimate since it + ignores alignment and ordering issues. */ + space_asect->size = space_size; + } + } } /* Now that we've read in all the subspace records, we need to assign a target index to each subspace. */ -- 2.30.2