objcopy: Fix for pr19005 on machines with more than one octet per byte.
authorChristian Eggers <ceggers@gmx.de>
Mon, 2 Mar 2020 21:08:20 +0000 (22:08 +0100)
committerAlan Modra <amodra@gmail.com>
Wed, 4 Mar 2020 00:29:30 +0000 (10:59 +1030)
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.

binutils/ChangeLog
binutils/objcopy.c

index afc380392e01de528215e2be0ebdaa84c426a3f9..35d3fada64060e829d59433be16fc786e820efb3 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-04  Christian Eggers  <ceggers@gmx.de>
+
+       * objcopy.c (copy_object): Convert from bytes to octets for
+       --gap-fill and --pad-to.
+
 2020-03-03  Nick Clifton  <nickc@redhat.com>
 
        PR 25625
index fd94d63773e9b8ee4b73358c38987e7ddee7bd7d..daee57076379d1fd59500d2775c616d52479a0f8 100644 (file)
@@ -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);
                }
            }
        }