From 500ee42ee091d6e8860d237bd5e74e8cdcf61d70 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 20 Jan 2010 00:09:13 +0000 Subject: [PATCH] binutils/: * 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 | 5 ++ binutils/objcopy.c | 50 ++++++++++--------- binutils/testsuite/ChangeLog | 9 ++++ .../binutils-all/add-empty-section.d | 9 ++++ binutils/testsuite/binutils-all/add-section.d | 11 ++++ binutils/testsuite/binutils-all/empty-file | 0 binutils/testsuite/binutils-all/objcopy.exp | 3 ++ binutils/testsuite/lib/utils-lib.exp | 10 ++++ 8 files changed, 74 insertions(+), 23 deletions(-) create mode 100644 binutils/testsuite/binutils-all/add-empty-section.d create mode 100644 binutils/testsuite/binutils-all/add-section.d create mode 100644 binutils/testsuite/binutils-all/empty-file diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 923cb24acbf..c980f858cb7 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2010-01-19 Ian Lance Taylor + + * objcopy.c (copy_main): Rewrite OPTION_ADD_SECTION code to work + with non-ordinary files like /dev/null. + 2010-01-19 Daisuke Hatayama Alan Modra diff --git a/binutils/objcopy.c b/binutils/objcopy.c index dd16b9b0f4b..5df1449dbf5 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -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); diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index 4ebc7e931cd..45918877f7b 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2010-01-19 Ian Lance Taylor + + * 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 * 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 index 00000000000..c9162a505c7 --- /dev/null +++ b/binutils/testsuite/binutils-all/add-empty-section.d @@ -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 index 00000000000..37a24cf5d25 --- /dev/null +++ b/binutils/testsuite/binutils-all/add-section.d @@ -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 index 00000000000..e69de29bb2d diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp index de9b11670ea..f7f6cde3389 100644 --- a/binutils/testsuite/binutils-all/objcopy.exp +++ b/binutils/testsuite/binutils-all/objcopy.exp @@ -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" diff --git a/binutils/testsuite/lib/utils-lib.exp b/binutils/testsuite/lib/utils-lib.exp index 393aae89cb8..66a97a4cab7 100644 --- a/binutils/testsuite/lib/utils-lib.exp +++ b/binutils/testsuite/lib/utils-lib.exp @@ -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)] { -- 2.30.2