summaryrefslogtreecommitdiff
path: root/bfd/mmo.c
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2002-06-29 21:45:09 +0000
committerHans-Peter Nilsson <hp@axis.com>2002-06-29 21:45:09 +0000
commitdffdcdf745f5f8a1578a70e569e75a1605b57bc8 (patch)
tree10443e4eae3a325ae82fc1d30d826e1c479407a9 /bfd/mmo.c
parent0772fd3f33231703df6463b5945b481e785c8c80 (diff)
downloadbinutils-redhat-dffdcdf745f5f8a1578a70e569e75a1605b57bc8.tar.gz
* mmo.c (mmo_write_loc_chunk): Don't eliminate leading and
trailing zero-sequences when there's previous left-over data.
Diffstat (limited to 'bfd/mmo.c')
-rw-r--r--bfd/mmo.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/bfd/mmo.c b/bfd/mmo.c
index 7bf064dfc4..96c654e8ee 100644
--- a/bfd/mmo.c
+++ b/bfd/mmo.c
@@ -913,16 +913,23 @@ mmo_write_loc_chunk (abfd, vma, loc, len, last_vmap)
/* Find an initial and trailing section of zero tetras; we don't need to
write out zeros. FIXME: When we do this, we should emit section size
and address specifiers, else objcopy can't always perform an identity
- translation. */
- while (len >= 4 && bfd_get_32 (abfd, loc) == 0)
+ translation. Only do this if we *don't* have left-over data from a
+ previous write or the vma of this chunk is *not* the next address,
+ because then data isn't tetrabyte-aligned and we're concatenating to
+ that left-over data. */
+
+ if (abfd->tdata.mmo_data->byte_no == 0 || vma != *last_vmap)
{
- vma += 4;
- len -= 4;
- loc += 4;
- }
+ while (len >= 4 && bfd_get_32 (abfd, loc) == 0)
+ {
+ vma += 4;
+ len -= 4;
+ loc += 4;
+ }
- while (len >= 4 && bfd_get_32 (abfd, loc + len - 4) == 0)
- len -= 4;
+ while (len >= 4 && bfd_get_32 (abfd, loc + len - 4) == 0)
+ len -= 4;
+ }
/* Only write out the location if it's different than the one the caller
(supposedly) previously handled, accounting for omitted leading zeros. */