diff options
author | Christian Eggers <ceggers@gmx.de> | 2020-03-02 22:08:20 +0100 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-03-04 10:59:30 +1030 |
commit | eef64366e1e9052b121a0c235c49be362aa2fe65 (patch) | |
tree | 994f441e0a19d37e36327f12303bb75a7ee0e3eb /binutils/objcopy.c | |
parent | 3ba07c177d504ded569198b530ff448602e017cb (diff) | |
download | gdb-eef64366e1e9052b121a0c235c49be362aa2fe65.zip gdb-eef64366e1e9052b121a0c235c49be362aa2fe65.tar.gz gdb-eef64366e1e9052b121a0c235c49be362aa2fe65.tar.bz2 |
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.
Diffstat (limited to 'binutils/objcopy.c')
-rw-r--r-- | binutils/objcopy.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/binutils/objcopy.c b/binutils/objcopy.c index fd94d63..daee570 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); } } } |