summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/ChangeLog7
-rw-r--r--binutils/objcopy.c24
-rw-r--r--ld/testsuite/ChangeLog7
-rw-r--r--ld/testsuite/ld-elf/pr19005.d10
-rw-r--r--ld/testsuite/ld-elf/pr19005.s11
-rw-r--r--ld/testsuite/ld-elf/pr19005.t6
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/ : { *(.*) }
+}