Don't use the output section size to copy input section
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 29 Sep 2015 16:35:47 +0000 (09:35 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 29 Sep 2015 20:31:57 +0000 (13:31 -0700)
We can't use the output section size to copy input section since
--interleave will shrink the output section.  Instead, we change
bfd_convert_section_contents to return the updated input section
size.  When we do that, we don't need to adjust the output section
size to skip gap fills.

bfd/

PR binutils/19020
* bfd.c (bfd_convert_section_contents): Add ptr_size parameter.
* bfd-in2.h: Regenerated.

binutils/

PR binutils/19020
* objcopy.c (copy_object): Don't adjust the output section size
when copying from input sections.
(copy_section): Use input section size for the copy.  Get the
updated section size from bfd_convert_section_contents.

binutils/testsuite/

PR binutils/19020
* binutils-all/objcopy.exp: Run pr19020a and pr19020b.
* lib/utils-lib.exp (run_dump_test): Support binary input.
* binutils-all/pr19020.in: New file.
* binutils-all/pr19020a.d: Likewise.
* binutils-all/pr19020b.d: Likewise.

bfd/ChangeLog
bfd/bfd-in2.h
bfd/bfd.c
binutils/ChangeLog
binutils/objcopy.c
binutils/testsuite/ChangeLog
binutils/testsuite/binutils-all/objcopy.exp
binutils/testsuite/binutils-all/pr19020.in [new file with mode: 0644]
binutils/testsuite/binutils-all/pr19020a.d [new file with mode: 0644]
binutils/testsuite/binutils-all/pr19020b.d [new file with mode: 0644]
binutils/testsuite/lib/utils-lib.exp

index d8068c48c0f2891bc48bb7e2f8ff9e8d33ff33e7..bcbe0e1665539bfbccf7e02781706128ffd64992 100644 (file)
@@ -1,3 +1,10 @@
+2015-09-29  Andrew Stubbs  <ams@codesourcery.com>
+           H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/19020
+       * bfd.c (bfd_convert_section_contents): Add ptr_size parameter.
+       * bfd-in2.h: Regenerated.
+
 2015-08-11  Peter Zotov  <whitequark@whitequark.org>
 
        PR ld/18759
index f06d76e430d3ea34cf7d53be9dd1d23b22a3e29a..0d096f9034e77ac62b82a4de8aade72f586d4f0f 100644 (file)
@@ -6933,7 +6933,8 @@ bfd_size_type bfd_convert_section_size
    (bfd *ibfd, asection *isec, bfd *obfd, bfd_size_type size);
 
 bfd_boolean bfd_convert_section_contents
-   (bfd *ibfd, asection *isec, bfd *obfd, bfd_byte **ptr);
+   (bfd *ibfd, asection *isec, bfd *obfd,
+    bfd_byte **ptr, bfd_size_type *ptr_size);
 
 /* Extracted from archive.c.  */
 symindex bfd_get_next_mapent
index 449dfe610da6889ad17d92c3941fc64ad93141a9..f68f665d9c7e2f22ca5f42e5803c1ede3484d77a 100644 (file)
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -2165,19 +2165,20 @@ FUNCTION
 
 SYNOPSIS
        bfd_boolean bfd_convert_section_contents
-         (bfd *ibfd, asection *isec, bfd *obfd, bfd_byte **ptr);
+         (bfd *ibfd, asection *isec, bfd *obfd,
+          bfd_byte **ptr, bfd_size_type *ptr_size);
 
 DESCRIPTION
        Convert the contents, stored in @var{*ptr}, of the section
        @var{isec} in input BFD @var{ibfd} to output BFD @var{obfd}
        if needed.  The original buffer pointed to by @var{*ptr} may
        be freed and @var{*ptr} is returned with memory malloc'd by this
-       function.
+       function, and the new size written to @var{ptr_size}.
 */
 
 bfd_boolean
 bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd,
-                             bfd_byte **ptr)
+                             bfd_byte **ptr, bfd_size_type *ptr_size)
 {
   bfd_byte *contents;
   bfd_size_type ihdr_size, ohdr_size, size;
@@ -2264,5 +2265,6 @@ bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd,
       *ptr = contents;
     }
 
+  *ptr_size = size;
   return TRUE;
 }
index 8d2f984868e143ed71eea69834b4f91ee5dafce6..16ed7c4f4e0152bb230c7d08c5618cc1a908be9e 100644 (file)
@@ -1,3 +1,12 @@
+2015-09-29  Andrew Stubbs  <ams@codesourcery.com>
+           H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/19020
+       * objcopy.c (copy_object): Don't adjust the output section size
+       when copying from input sections.
+       (copy_section): Use input section size for the copy.  Get the
+       updated section size from bfd_convert_section_contents.
+
 2015-09-29  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR binutils/19005
index c94d515a389c1975e8946859acf1811814be4597..2cd55fd7129a0e9417b532c65c32135cc52e6ea6 100644 (file)
@@ -2212,24 +2212,7 @@ 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)
     {
@@ -3127,10 +3110,10 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
 
   osection = isection->output_section;
   /* The output SHF_COMPRESSED section size is different from input if
-     ELF classes of input and output aren't the same.  We must use the
-     output section size here, which has been updated in setup_section
-     via bfd_convert_section_size.  */
-  size = bfd_get_section_size (osection);
+     ELF classes of input and output aren't the same.  We can't use
+     the output section size since --interleave will shrink the output
+     section.   Size will be updated if the section is converted.   */
+  size = bfd_get_section_size (isection);
 
   if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
       && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
@@ -3139,7 +3122,7 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
 
       if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)
          || !bfd_convert_section_contents (ibfd, isection, obfd,
-                                           &memhunk))
+                                           &memhunk, &size))
        {
          status = 1;
          bfd_nonfatal_message (NULL, ibfd, isection, NULL);
index 9efe4dcbf18f20ccdf1d2f41a4c96caaaf840858..f444dc7c007ec239465bc3dce421070e9e3476a1 100644 (file)
@@ -1,3 +1,12 @@
+2015-09-29  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/19020
+       * binutils-all/objcopy.exp: Run pr19020a and pr19020b.
+       * lib/utils-lib.exp (run_dump_test): Support binary input.
+       * binutils-all/pr19020.in: New file.
+       * binutils-all/pr19020a.d: Likewise.
+       * binutils-all/pr19020b.d: Likewise.
+
 2015-08-11  Alan Modra  <amodra@gmail.com>
 
        * binutils-all/strip-12.s: Align .bss section.
index cb8e33b5f7108f759ec858f1fad2ec01eb3a331a..bb33e4fb63017030a7d4defab054abe7c081a1f5 100644 (file)
@@ -1022,6 +1022,8 @@ if [is_elf_format] {
 run_dump_test "copy-2"
 run_dump_test "copy-3"
 run_dump_test "copy-4"
+run_dump_test "pr19020a"
+run_dump_test "pr19020b"
 
 if [is_elf_format] {
     run_dump_test "strip-1"
diff --git a/binutils/testsuite/binutils-all/pr19020.in b/binutils/testsuite/binutils-all/pr19020.in
new file mode 100644 (file)
index 0000000..1656f92
--- /dev/null
@@ -0,0 +1 @@
+abcdefgh
\ No newline at end of file
diff --git a/binutils/testsuite/binutils-all/pr19020a.d b/binutils/testsuite/binutils-all/pr19020a.d
new file mode 100644 (file)
index 0000000..71d5813
--- /dev/null
@@ -0,0 +1,9 @@
+#PROG: objcopy
+#source: pr19020.in
+#as: binary
+#objcopy: -O binary -I binary --pad-to=10 --gap-fill=65 --interleave=2 --interleave-width=1 --byte=0
+#objdump: -b binary -s
+
+#...
+Contents of section .data:
+ 0000 61636567 41414141 4141 +acegAAAAAA +
diff --git a/binutils/testsuite/binutils-all/pr19020b.d b/binutils/testsuite/binutils-all/pr19020b.d
new file mode 100644 (file)
index 0000000..41dc650
--- /dev/null
@@ -0,0 +1,9 @@
+#PROG: objcopy
+#source: pr19020.in
+#as: binary
+#objcopy: -O binary -I binary --pad-to=10 --gap-fill=65 --reverse-bytes=8
+#objdump: -b binary -s
+
+#...
+Contents of section .data:
+ 0000 68676665 64636261 4141 +hgfedcbaAA +
index 9c24cf17ba7ba4e1d5feeb9b996123e5d686de11..fd5b6f630a3d4be64ab813d19c4435008059e735 100644 (file)
@@ -447,12 +447,16 @@ proc run_dump_test { name {extra_options {}} } {
        set srcfile $srcdir/$subdir/$opts(source)
     }
 
-    set exec_output [binutils_assemble_flags ${srcfile} $tempfile $opts(as)]
-    if [string match "" $exec_output] then {
-       send_log "$exec_output\n"
-       verbose "$exec_output"
-       fail $testname
-       return
+    if { $opts(as) == "binary" } {
+       file copy -force ${srcfile} $tempfile
+    } else {
+       set exec_output [binutils_assemble_flags ${srcfile} $tempfile $opts(as)]
+       if [string match "" $exec_output] then {
+           send_log "$exec_output\n"
+           verbose "$exec_output"
+           fail $testname
+          return
+       }
     }
 
     set progopts1 $opts($program)