diff options
-rw-r--r-- | binutils/ChangeLog | 7 | ||||
-rw-r--r-- | binutils/objcopy.c | 24 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19005.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19005.s | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19005.t | 6 |
6 files changed, 61 insertions, 4 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 128cce5637e..8d2f984868e 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2015-09-29 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/19005 + * objcopy.c (copy_object): Adjust the output section size to + skip gap fills between sections when copying from input sections + to output sections. + 2015-09-28 Nick Clifton <nickc@redhat.com> * po/fr.po: Updated French translation. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index e4cb3e2d3fb..c94d515a389 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -1640,6 +1640,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) void *dhandle; enum bfd_architecture iarch; unsigned int imach; + unsigned int c, i; if (ibfd->xvec->byteorder != obfd->xvec->byteorder && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN @@ -2071,11 +2072,11 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) } } - if (bfd_count_sections (obfd) != 0 + c = bfd_count_sections (obfd); + if (c != 0 && (gap_fill_set || pad_to_set)) { asection **set; - unsigned int c, i; /* We must fill in gaps between the sections and/or we must pad the last section to a specified address. We do this by @@ -2083,7 +2084,6 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) increasing the section sizes as required to fill the gaps. We write out the gap contents below. */ - c = bfd_count_sections (obfd); osections = (asection **) xmalloc (c * sizeof (asection *)); set = osections; bfd_map_over_sections (obfd, get_sections, &set); @@ -2212,7 +2212,24 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) bfd_map_over_sections (ibfd, copy_relocations_in_section, obfd); /* This has to happen after the symbol table has been set. */ + if (gap_fill_set) + { + /* Adjust the output section size to skip gap fills between + sections. */ + c = bfd_count_sections (obfd); + for (i = 0; i < c; i++) + if (gaps[i] != 0) + osections[i]->size -= gaps[i]; + } bfd_map_over_sections (ibfd, copy_section, obfd); + if (gap_fill_set) + { + /* Restore the output section size for gap fills between + sections. */ + for (i = 0; i < c; i++) + if (gaps[i] != 0) + osections[i]->size += gaps[i]; + } if (add_sections != NULL) { @@ -2264,7 +2281,6 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) if (gap_fill_set || pad_to_set) { bfd_byte *buf; - int c, i; /* Fill in the gaps. */ if (max_gap > 8192) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3a6a5094b85..40eb3589c6f 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2015-09-29 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/19005 + * ld-elf/pr19005.d: New file. + * ld-elf/pr19005.s: Likewise. + * ld-elf/pr19005.t: Likewise. + 2015-08-11 Peter Zotov <whitequark@whitequark.org> PR ld/18759 diff --git a/ld/testsuite/ld-elf/pr19005.d b/ld/testsuite/ld-elf/pr19005.d new file mode 100644 index 00000000000..a4df0d30b2a --- /dev/null +++ b/ld/testsuite/ld-elf/pr19005.d @@ -0,0 +1,10 @@ +#ld: -Tpr19005.t +#objcopy_linked_file: -O binary -j .foo -j .bar --gap-fill=0xff +#objdump: -b binary -s + +#... +Contents of section .data: + 0000 10ffffff ffffffff ffffffff ffffffff ................ + 0010 ffffffff ffffffff ffffffff ffffffff ................ + 0020 20.* +#pass diff --git a/ld/testsuite/ld-elf/pr19005.s b/ld/testsuite/ld-elf/pr19005.s new file mode 100644 index 00000000000..8bd860f5546 --- /dev/null +++ b/ld/testsuite/ld-elf/pr19005.s @@ -0,0 +1,11 @@ + .section .foo,"ax",%progbits + .globl _start + .type _start, %function +_start: + .byte 0x10 + .section .bar,"ax",%progbits + .globl aligned + .type aligned, %function + .p2align 5 +aligned: + .byte 0x20 diff --git a/ld/testsuite/ld-elf/pr19005.t b/ld/testsuite/ld-elf/pr19005.t new file mode 100644 index 00000000000..0e89e0b6342 --- /dev/null +++ b/ld/testsuite/ld-elf/pr19005.t @@ -0,0 +1,6 @@ +SECTIONS +{ + .foo : { *(.foo) } + .bar : { *(.bar) } + /DISCARD/ : { *(.*) } +} |