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.
This commit is contained in:
Ian Lance Taylor 2010-01-20 00:09:13 +00:00
parent 1696f399f7
commit 500ee42ee0
8 changed files with 74 additions and 23 deletions

View 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>

View 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);
/* 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);

View 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.

View File

@ -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]+
#...

View File

@ -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 .

View 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"

View 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)] {