From: Christian Eggers Date: Mon, 2 Mar 2020 21:08:20 +0000 (+0100) Subject: objcopy: Fix for pr19005 on machines with more than one octet per byte. X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=eef64366e1e9052b121a0c235c49be362aa2fe65;p=deliverable%2Fbinutils-gdb.git objcopy: Fix for pr19005 on machines with more than one octet per byte. On machines with more than one octet per byte, objcopy fills only a part of the gap between sections. * objcopy.c (copy_object): Convert from bytes to octets for --gap-fill and --pad-to. --- diff --git a/binutils/ChangeLog b/binutils/ChangeLog index afc380392e..35d3fada64 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2020-03-04 Christian Eggers + + * objcopy.c (copy_object): Convert from bytes to octets for + --gap-fill and --pad-to. + 2020-03-03 Nick Clifton PR 25625 diff --git a/binutils/objcopy.c b/binutils/objcopy.c index fd94d63773..daee570763 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -3101,8 +3101,10 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) for (i = 0; i < c - 1; i++) { flagword flags; - bfd_size_type size; - bfd_vma gap_start, gap_stop; + bfd_size_type size; /* Octets. */ + bfd_vma gap_start, gap_stop; /* Octets. */ + unsigned int opb1 = bfd_octets_per_byte (obfd, osections[i]); + unsigned int opb2 = bfd_octets_per_byte (obfd, osections[i+1]); flags = bfd_section_flags (osections[i]); if ((flags & SEC_HAS_CONTENTS) == 0 @@ -3110,8 +3112,8 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) continue; size = bfd_section_size (osections[i]); - gap_start = bfd_section_lma (osections[i]) + size; - gap_stop = bfd_section_lma (osections[i + 1]); + gap_start = bfd_section_lma (osections[i]) * opb1 + size; + gap_stop = bfd_section_lma (osections[i + 1]) * opb2; if (gap_start < gap_stop) { if (!bfd_set_section_size (osections[i], @@ -3131,14 +3133,16 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) if (pad_to_set) { - bfd_vma lma; - bfd_size_type size; + bfd_vma lma; /* Octets. */ + bfd_size_type size; /* Octets. */ + unsigned int opb = bfd_octets_per_byte (obfd, osections[c - 1]); + bfd_vma _pad_to = pad_to * opb; - lma = bfd_section_lma (osections[c - 1]); + lma = bfd_section_lma (osections[c - 1]) * opb; size = bfd_section_size (osections[c - 1]); - if (lma + size < pad_to) + if (lma + size < _pad_to) { - if (!bfd_set_section_size (osections[c - 1], pad_to - lma)) + if (!bfd_set_section_size (osections[c - 1], _pad_to - lma)) { bfd_nonfatal_message (NULL, obfd, osections[c - 1], _("can't add padding")); @@ -3146,9 +3150,9 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) } else { - gaps[c - 1] = pad_to - (lma + size); - if (max_gap < pad_to - (lma + size)) - max_gap = pad_to - (lma + size); + gaps[c - 1] = _pad_to - (lma + size); + if (max_gap < _pad_to - (lma + size)) + max_gap = _pad_to - (lma + size); } } }