binutils/:
authorIan Lance Taylor <ian@airs.com>
Wed, 20 Jan 2010 00:09:13 +0000 (00:09 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 20 Jan 2010 00:09:13 +0000 (00:09 +0000)
* objcopy.c (copy_main): Rewrite OPTION_ADD_SECTION code to work
with non-ordinary files like /dev/null.
binutils/testsuite/:
* lib/utils-lib.exp (run_dump_test): Permit option values to use
$srcdir to refer to the source directory.
* binutils-all/add-section.d: New test.
* binutils-all/add-empty-section.d: New test.
* binutils-all/empty-file: New test input file.
* binutils-all/objcopy.exp: Run new tests.

binutils/ChangeLog
binutils/objcopy.c
binutils/testsuite/ChangeLog
binutils/testsuite/binutils-all/add-empty-section.d [new file with mode: 0644]
binutils/testsuite/binutils-all/add-section.d [new file with mode: 0644]
binutils/testsuite/binutils-all/empty-file [new file with mode: 0644]
binutils/testsuite/binutils-all/objcopy.exp
binutils/testsuite/lib/utils-lib.exp

index 923cb24..c980f85 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-19  Ian Lance Taylor  <iant@google.com>
+
+       * objcopy.c (copy_main): Rewrite OPTION_ADD_SECTION code to work
+       with non-ordinary files like /dev/null.
+
 2010-01-19  Daisuke Hatayama  <d.hatayama@jp.fujitsu.com>
            Alan Modra <amodra@gmail.com>
 
index dd16b9b..5df1449 100644 (file)
@@ -3306,10 +3306,8 @@ copy_main (int argc, char *argv[])
        case OPTION_ADD_SECTION:
          {
            const char *s;
-           off_t size;
+           size_t off, alloc;
            struct section_add *pa;
-           int len;
-           char *name;
            FILE *f;
 
            s = strchr (optarg, '=');
@@ -3317,34 +3315,40 @@ copy_main (int argc, char *argv[])
            if (s == NULL)
              fatal (_("bad format for %s"), "--add-section");
 
-           size = get_file_size (s + 1);
-           if (size < 1)
-             {
-               status = 1;
-               break;
-             }
-
            pa = (struct section_add *) xmalloc (sizeof (struct section_add));
-
-           len = s - optarg;
-           name = (char *) xmalloc (len + 1);
-           strncpy (name, optarg, len);
-           name[len] = '\0';
-           pa->name = name;
-
+           pa->name = xstrndup (optarg, s - optarg);
            pa->filename = s + 1;
-           pa->size = size;
-           pa->contents = (bfd_byte *) xmalloc (size);
 
-           f = fopen (pa->filename, FOPEN_RB);
+           /* We don't use get_file_size so that we can do
+                --add-section .note.GNU_stack=/dev/null
+              get_file_size doesn't work on /dev/null.  */
 
+           f = fopen (pa->filename, FOPEN_RB);
            if (f == NULL)
              fatal (_("cannot open: %s: %s"),
                     pa->filename, strerror (errno));
 
-           if (fread (pa->contents, 1, pa->size, f) == 0
-               || ferror (f))
-             fatal (_("%s: fread failed"), pa->filename);
+           off = 0;
+           alloc = 4096;
+           pa->contents = (bfd_byte *) xmalloc (alloc);
+           while (!feof (f))
+             {
+               off_t got;
+
+               if (off == alloc)
+                 {
+                   alloc <<= 1;
+                   pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
+                 }
+
+               got = fread (pa->contents + off, 1, alloc - off, f);
+               if (ferror (f))
+                 fatal (_("%s: fread failed"), pa->filename);
+
+               off += got;
+             }
+
+           pa->size = off;
 
            fclose (f);
 
index 4ebc7e9..4591887 100644 (file)
@@ -1,3 +1,12 @@
+2010-01-19  Ian Lance Taylor  <iant@google.com>
+
+       * lib/utils-lib.exp (run_dump_test): Permit option values to use
+       $srcdir to refer to the source directory.
+       * binutils-all/add-section.d: New test.
+       * binutils-all/add-empty-section.d: New test.
+       * binutils-all/empty-file: New test input file.
+       * binutils-all/objcopy.exp: Run new tests.
+
 2010-01-08  H.J. Lu  <hongjiu.lu@intel.com>
 
        * binutils-all/elfedit-2.d: New.
diff --git a/binutils/testsuite/binutils-all/add-empty-section.d b/binutils/testsuite/binutils-all/add-empty-section.d
new file mode 100644 (file)
index 0000000..c9162a5
--- /dev/null
@@ -0,0 +1,9 @@
+#PROG: objcopy
+#name: objcopy add-empty-section
+#source: empty.s
+#objcopy: --add-section NEW=$srcdir/empty-file
+#readelf: -S --wide
+
+#...
+  \[[ 0-9]+\] NEW[ \t]+PROGBITS[ \t]+[0-9a-f]+[ \t]+[0-9a-f]+[ \t]+0+[ \t]+[ \t0-9a-f]+
+#...
diff --git a/binutils/testsuite/binutils-all/add-section.d b/binutils/testsuite/binutils-all/add-section.d
new file mode 100644 (file)
index 0000000..37a24cf
--- /dev/null
@@ -0,0 +1,11 @@
+#PROG: objcopy
+#name: objcopy add-section
+#source: empty.s
+#objcopy: --add-section NEW=$srcdir/empty.s
+#objdump: -s -j NEW
+
+.*: +file format .*
+
+Contents of section NEW:
+ 0000 2320416e 20656d70 74792066 696c652e  # An empty file.
+ 0010 0a                                   .               
diff --git a/binutils/testsuite/binutils-all/empty-file b/binutils/testsuite/binutils-all/empty-file
new file mode 100644 (file)
index 0000000..e69de29
index de9b116..f7f6cde 100644 (file)
@@ -875,5 +875,8 @@ if [is_elf_format] {
     run_dump_test "localize-hidden-1"
     run_dump_test "testranges"
     run_dump_test "testranges-ia64"
+
+    run_dump_test "add-section"
+    run_dump_test "add-empty-section"
 }
 run_dump_test "localize-hidden-2"
index 393aae8..66a97a4 100644 (file)
@@ -327,6 +327,11 @@ proc run_dump_test { name {extra_options {}} } {
            unresolved $subdir/$name
            return
        }
+
+       # Permit the option to use $srcdir to refer to the source
+       # directory.
+       regsub -all "\\\$srcdir" "$opt_val" "$srcdir/$subdir" opt_val
+
        if [string length $opts($opt_name)] {
            perror "option $opt_name multiply set in $file.d"
            unresolved $subdir/$name
@@ -343,6 +348,11 @@ proc run_dump_test { name {extra_options {}} } {
            unresolved $subdir/$name
            return
        }
+
+       # Permit the option to use $srcdir to refer to the source
+       # directory.
+       regsub -all "\\\$srcdir" "$opt_val" "$srcdir/$subdir" opt_val
+
        # add extra option to end of existing option, adding space
        # if necessary.
        if [string length $opts($opt_name)] {