Do not produce any output if the output file will be empty

This commit is contained in:
Nick Clifton 2004-01-12 13:10:02 +00:00
parent cc3d92a51a
commit 950d48e718
2 changed files with 108 additions and 44 deletions

View file

@ -1,3 +1,10 @@
2004-01-12 Nick Clifton <nickc@redhat.com>
* objcopy.c (copy_object): Make the function boolean, returning
FALSE upon failure.
(copy_archive): Handle the return value from copy_object.
(copy_file): Likewise.
2004-01-07 Nick Clifton <nickc@redhat.com> 2004-01-07 Nick Clifton <nickc@redhat.com>
* readelf.c (find_section): New function. Locates a named * readelf.c (find_section): New function. Locates a named

View file

@ -1084,9 +1084,10 @@ add_redefine_syms_file (const char *filename)
free (buf); free (buf);
} }
/* Copy object file IBFD onto OBFD. */ /* Copy object file IBFD onto OBFD.
Trues TRUE upon success, FALSE otherwise. */
static void static bfd_boolean
copy_object (bfd *ibfd, bfd *obfd) copy_object (bfd *ibfd, bfd *obfd)
{ {
bfd_vma start; bfd_vma start;
@ -1103,13 +1104,13 @@ copy_object (bfd *ibfd, bfd *obfd)
if (ibfd->xvec->byteorder != obfd->xvec->byteorder if (ibfd->xvec->byteorder != obfd->xvec->byteorder
&& ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
&& obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN) && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
{ fatal (_("Unable to change endianness of input file(s)"));
fatal (_("Unable to change endianness of input file(s)"));
return;
}
if (!bfd_set_format (obfd, bfd_get_format (ibfd))) if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
RETURN_NONFATAL (bfd_get_filename (obfd)); {
bfd_nonfatal (bfd_get_filename (obfd));
return FALSE;
}
if (verbose) if (verbose)
printf (_("copy from %s(%s) to %s(%s)\n"), printf (_("copy from %s(%s) to %s(%s)\n"),
@ -1135,7 +1136,10 @@ copy_object (bfd *ibfd, bfd *obfd)
if (!bfd_set_start_address (obfd, start) if (!bfd_set_start_address (obfd, start)
|| !bfd_set_file_flags (obfd, flags)) || !bfd_set_file_flags (obfd, flags))
RETURN_NONFATAL (bfd_get_filename (ibfd)); {
bfd_nonfatal (bfd_get_filename (ibfd));
return FALSE;
}
} }
/* Copy architecture of input file to output file. */ /* Copy architecture of input file to output file. */
@ -1153,13 +1157,15 @@ copy_object (bfd *ibfd, bfd *obfd)
non_fatal (_("Warning: Output file cannot represent architecture %s"), non_fatal (_("Warning: Output file cannot represent architecture %s"),
bfd_printable_arch_mach (bfd_get_arch (ibfd), bfd_printable_arch_mach (bfd_get_arch (ibfd),
bfd_get_mach (ibfd))); bfd_get_mach (ibfd)));
status = 1; return FALSE;
return;
} }
} }
if (!bfd_set_format (obfd, bfd_get_format (ibfd))) if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
RETURN_NONFATAL (bfd_get_filename (ibfd)); {
bfd_nonfatal (bfd_get_filename (ibfd));
return FALSE;
}
if (isympp) if (isympp)
free (isympp); free (isympp);
@ -1185,12 +1191,14 @@ copy_object (bfd *ibfd, bfd *obfd)
{ {
non_fatal (_("can't create section `%s': %s"), non_fatal (_("can't create section `%s': %s"),
padd->name, bfd_errmsg (bfd_get_error ())); padd->name, bfd_errmsg (bfd_get_error ()));
status = 1; return FALSE;
return;
} }
if (! bfd_set_section_size (obfd, padd->section, padd->size)) if (! bfd_set_section_size (obfd, padd->section, padd->size))
RETURN_NONFATAL (bfd_get_filename (obfd)); {
bfd_nonfatal (bfd_get_filename (obfd));
return FALSE;
}
pset = find_section_list (padd->name, FALSE); pset = find_section_list (padd->name, FALSE);
if (pset != NULL) if (pset != NULL)
@ -1202,23 +1210,32 @@ copy_object (bfd *ibfd, bfd *obfd)
flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA; flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
if (! bfd_set_section_flags (obfd, padd->section, flags)) if (! bfd_set_section_flags (obfd, padd->section, flags))
RETURN_NONFATAL (bfd_get_filename (obfd)); {
bfd_nonfatal (bfd_get_filename (obfd));
return FALSE;
}
if (pset != NULL) if (pset != NULL)
{ {
if (pset->change_vma != CHANGE_IGNORE) if (pset->change_vma != CHANGE_IGNORE)
if (! bfd_set_section_vma (obfd, padd->section, if (! bfd_set_section_vma (obfd, padd->section,
pset->vma_val)) pset->vma_val))
RETURN_NONFATAL (bfd_get_filename (obfd)); {
bfd_nonfatal (bfd_get_filename (obfd));
return FALSE;
}
if (pset->change_lma != CHANGE_IGNORE) if (pset->change_lma != CHANGE_IGNORE)
{ {
padd->section->lma = pset->lma_val; padd->section->lma = pset->lma_val;
if (! bfd_set_section_alignment if (! bfd_set_section_alignment
(obfd, padd->section, (obfd, padd->section,
bfd_section_alignment (obfd, padd->section))) bfd_section_alignment (obfd, padd->section)))
RETURN_NONFATAL (bfd_get_filename (obfd)); {
bfd_nonfatal (bfd_get_filename (obfd));
return FALSE;
}
} }
} }
} }
@ -1230,7 +1247,16 @@ copy_object (bfd *ibfd, bfd *obfd)
(obfd, gnu_debuglink_filename); (obfd, gnu_debuglink_filename);
if (gnu_debuglink_section == NULL) if (gnu_debuglink_section == NULL)
RETURN_NONFATAL (gnu_debuglink_filename); {
bfd_nonfatal (gnu_debuglink_filename);
return FALSE;
}
}
if (bfd_count_sections (obfd) == 0)
{
non_fatal (_("there are no sections to be copied!"));
return FALSE;
} }
if (gap_fill_set || pad_to_set) if (gap_fill_set || pad_to_set)
@ -1320,12 +1346,18 @@ copy_object (bfd *ibfd, bfd *obfd)
dhandle = NULL; dhandle = NULL;
symsize = bfd_get_symtab_upper_bound (ibfd); symsize = bfd_get_symtab_upper_bound (ibfd);
if (symsize < 0) if (symsize < 0)
RETURN_NONFATAL (bfd_get_filename (ibfd)); {
bfd_nonfatal (bfd_get_filename (ibfd));
return FALSE;
}
osympp = isympp = xmalloc (symsize); osympp = isympp = xmalloc (symsize);
symcount = bfd_canonicalize_symtab (ibfd, isympp); symcount = bfd_canonicalize_symtab (ibfd, isympp);
if (symcount < 0) if (symcount < 0)
RETURN_NONFATAL (bfd_get_filename (ibfd)); {
bfd_nonfatal (bfd_get_filename (ibfd));
return FALSE;
}
if (convert_debugging) if (convert_debugging)
dhandle = read_debugging_info (ibfd, isympp, symcount); dhandle = read_debugging_info (ibfd, isympp, symcount);
@ -1370,7 +1402,7 @@ copy_object (bfd *ibfd, bfd *obfd)
if (! write_debugging_info (obfd, dhandle, &symcount, &osympp)) if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
{ {
status = 1; status = 1;
return; return FALSE;
} }
} }
@ -1387,7 +1419,10 @@ copy_object (bfd *ibfd, bfd *obfd)
{ {
if (! bfd_set_section_contents (obfd, padd->section, padd->contents, if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
0, padd->size)) 0, padd->size))
RETURN_NONFATAL (bfd_get_filename (obfd)); {
bfd_nonfatal (bfd_get_filename (obfd));
return FALSE;
}
} }
} }
@ -1395,7 +1430,10 @@ copy_object (bfd *ibfd, bfd *obfd)
{ {
if (! bfd_fill_in_gnu_debuglink_section if (! bfd_fill_in_gnu_debuglink_section
(obfd, gnu_debuglink_section, gnu_debuglink_filename)) (obfd, gnu_debuglink_section, gnu_debuglink_filename))
RETURN_NONFATAL (gnu_debuglink_filename); {
bfd_nonfatal (gnu_debuglink_filename);
return FALSE;
}
} }
if (gap_fill_set || pad_to_set) if (gap_fill_set || pad_to_set)
@ -1431,7 +1469,10 @@ copy_object (bfd *ibfd, bfd *obfd)
if (! bfd_set_section_contents (obfd, osections[i], buf, if (! bfd_set_section_contents (obfd, osections[i], buf,
off, now)) off, now))
RETURN_NONFATAL (bfd_get_filename (obfd)); {
bfd_nonfatal (bfd_get_filename (obfd));
return FALSE;
}
left -= now; left -= now;
off += now; off += now;
@ -1454,18 +1495,17 @@ copy_object (bfd *ibfd, bfd *obfd)
non_fatal (_("%s: error copying private BFD data: %s"), non_fatal (_("%s: error copying private BFD data: %s"),
bfd_get_filename (obfd), bfd_get_filename (obfd),
bfd_errmsg (bfd_get_error ())); bfd_errmsg (bfd_get_error ()));
status = 1; return FALSE;
return;
} }
/* Switch to the alternate machine code. We have to do this at the /* Switch to the alternate machine code. We have to do this at the
very end, because we only initialize the header when we create very end, because we only initialize the header when we create
the first section. */ the first section. */
if (use_alt_mach_code != 0) if (use_alt_mach_code != 0
{ && ! bfd_alt_mach_code (obfd, use_alt_mach_code))
if (!bfd_alt_mach_code (obfd, use_alt_mach_code)) non_fatal (_("unknown alternate machine code, ignored"));
non_fatal (_("unknown alternate machine code, ignored"));
} return TRUE;
} }
#undef MKDIR #undef MKDIR
@ -1512,6 +1552,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target)
bfd *last_element; bfd *last_element;
struct stat buf; struct stat buf;
int stat_status = 0; int stat_status = 0;
bfd_boolean delete = TRUE;
/* Create an output file for this member. */ /* Create an output file for this member. */
output_name = concat (dir, "/", output_name = concat (dir, "/",
@ -1553,7 +1594,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target)
RETURN_NONFATAL (output_name); RETURN_NONFATAL (output_name);
if (bfd_check_format (this_element, bfd_object)) if (bfd_check_format (this_element, bfd_object))
copy_object (this_element, output_bfd); delete = ! copy_object (this_element, output_bfd);
if (!bfd_close (output_bfd)) if (!bfd_close (output_bfd))
{ {
@ -1562,22 +1603,30 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target)
status = 1; status = 1;
} }
if (preserve_dates && stat_status == 0) if (delete)
set_times (output_name, &buf); {
unlink (output_name);
status = 1;
}
else
{
if (preserve_dates && stat_status == 0)
set_times (output_name, &buf);
/* Open the newly output file and attach to our list. */ /* Open the newly output file and attach to our list. */
output_bfd = bfd_openr (output_name, output_target); output_bfd = bfd_openr (output_name, output_target);
l->obfd = output_bfd; l->obfd = output_bfd;
*ptr = output_bfd; *ptr = output_bfd;
ptr = &output_bfd->next; ptr = &output_bfd->next;
last_element = this_element; last_element = this_element;
this_element = bfd_openr_next_archived_file (ibfd, last_element); this_element = bfd_openr_next_archived_file (ibfd, last_element);
bfd_close (last_element); bfd_close (last_element);
}
} }
*ptr = NULL; *ptr = NULL;
@ -1641,7 +1690,9 @@ copy_file (const char *input_filename, const char *output_filename,
else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching)) else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
{ {
bfd *obfd; bfd *obfd;
bfd_boolean delete;
do_copy: do_copy:
/* bfd_get_target does not return the correct value until /* bfd_get_target does not return the correct value until
bfd_check_format succeeds. */ bfd_check_format succeeds. */
if (output_target == NULL) if (output_target == NULL)
@ -1651,13 +1702,19 @@ copy_file (const char *input_filename, const char *output_filename,
if (obfd == NULL) if (obfd == NULL)
RETURN_NONFATAL (output_filename); RETURN_NONFATAL (output_filename);
copy_object (ibfd, obfd); delete = ! copy_object (ibfd, obfd);
if (!bfd_close (obfd)) if (!bfd_close (obfd))
RETURN_NONFATAL (output_filename); RETURN_NONFATAL (output_filename);
if (!bfd_close (ibfd)) if (!bfd_close (ibfd))
RETURN_NONFATAL (input_filename); RETURN_NONFATAL (input_filename);
if (delete)
{
unlink (output_filename);
status = 1;
}
} }
else else
{ {