PR binutils/3110
* objcopy.c (copy_archive): Add new parameter: force_output_target. If not true, then perserve the file formats of each copied archive element, otherwise force them to be one specific file format. (copy_file): Compute force_output_target parameter to pass to copy_archive.
This commit is contained in:
parent
f512f76fcd
commit
ee873e002e
|
@ -1,3 +1,13 @@
|
||||||
|
2006-09-09 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
PR binutils/3110
|
||||||
|
* objcopy.c (copy_archive): Add new parameter:
|
||||||
|
force_output_target. If not true, then perserve the file formats
|
||||||
|
of each copied archive element, otherwise force them to be one
|
||||||
|
specific file format.
|
||||||
|
(copy_file): Compute force_output_target parameter to pass to
|
||||||
|
copy_archive.
|
||||||
|
|
||||||
2006-09-05 Nick Clifton <nickc@redhat.com>
|
2006-09-05 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
PR binutils/3166
|
PR binutils/3166
|
||||||
|
|
|
@ -1730,10 +1730,14 @@ copy_object (bfd *ibfd, bfd *obfd)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Read each archive element in turn from IBFD, copy the
|
/* Read each archive element in turn from IBFD, copy the
|
||||||
contents to temp file, and keep the temp file handle. */
|
contents to temp file, and keep the temp file handle.
|
||||||
|
If 'force_output_target' is TRUE then make sure that
|
||||||
|
all elements in the new archive are of the type
|
||||||
|
'output_target'. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
copy_archive (bfd *ibfd, bfd *obfd, const char *output_target)
|
copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
|
||||||
|
bfd_boolean force_output_target)
|
||||||
{
|
{
|
||||||
struct name_list
|
struct name_list
|
||||||
{
|
{
|
||||||
|
@ -1789,7 +1793,6 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target)
|
||||||
bfd_get_filename (this_element), (char *) 0);
|
bfd_get_filename (this_element), (char *) 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
output_bfd = bfd_openw (output_name, output_target);
|
|
||||||
if (preserve_dates)
|
if (preserve_dates)
|
||||||
{
|
{
|
||||||
stat_status = bfd_stat_arch_elt (this_element, &buf);
|
stat_status = bfd_stat_arch_elt (this_element, &buf);
|
||||||
|
@ -1805,11 +1808,18 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target)
|
||||||
l->obfd = NULL;
|
l->obfd = NULL;
|
||||||
list = l;
|
list = l;
|
||||||
|
|
||||||
if (output_bfd == NULL)
|
|
||||||
RETURN_NONFATAL (output_name);
|
|
||||||
|
|
||||||
if (bfd_check_format (this_element, bfd_object))
|
if (bfd_check_format (this_element, bfd_object))
|
||||||
{
|
{
|
||||||
|
/* PR binutils/3110: Cope with archives
|
||||||
|
containing multiple target types. */
|
||||||
|
if (force_output_target)
|
||||||
|
output_bfd = bfd_openw (output_name, output_target);
|
||||||
|
else
|
||||||
|
output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
|
||||||
|
|
||||||
|
if (output_bfd == NULL)
|
||||||
|
RETURN_NONFATAL (output_name);
|
||||||
|
|
||||||
delete = ! copy_object (this_element, output_bfd);
|
delete = ! copy_object (this_element, output_bfd);
|
||||||
|
|
||||||
if (! delete
|
if (! delete
|
||||||
|
@ -1830,6 +1840,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target)
|
||||||
non_fatal (_("Unable to recognise the format of the input file `%s'"),
|
non_fatal (_("Unable to recognise the format of the input file `%s'"),
|
||||||
bfd_get_archive_filename (this_element));
|
bfd_get_archive_filename (this_element));
|
||||||
|
|
||||||
|
output_bfd = bfd_openw (output_name, output_target);
|
||||||
copy_unknown_element:
|
copy_unknown_element:
|
||||||
delete = !copy_unknown_object (this_element, output_bfd);
|
delete = !copy_unknown_object (this_element, output_bfd);
|
||||||
if (!bfd_close_all_done (output_bfd))
|
if (!bfd_close_all_done (output_bfd))
|
||||||
|
@ -1911,18 +1922,24 @@ copy_file (const char *input_filename, const char *output_filename,
|
||||||
|
|
||||||
if (bfd_check_format (ibfd, bfd_archive))
|
if (bfd_check_format (ibfd, bfd_archive))
|
||||||
{
|
{
|
||||||
|
bfd_boolean force_output_target;
|
||||||
bfd *obfd;
|
bfd *obfd;
|
||||||
|
|
||||||
/* 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)
|
||||||
output_target = bfd_get_target (ibfd);
|
{
|
||||||
|
output_target = bfd_get_target (ibfd);
|
||||||
|
force_output_target = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
force_output_target = TRUE;
|
||||||
|
|
||||||
obfd = bfd_openw (output_filename, output_target);
|
obfd = bfd_openw (output_filename, output_target);
|
||||||
if (obfd == NULL)
|
if (obfd == NULL)
|
||||||
RETURN_NONFATAL (output_filename);
|
RETURN_NONFATAL (output_filename);
|
||||||
|
|
||||||
copy_archive (ibfd, obfd, output_target);
|
copy_archive (ibfd, obfd, output_target, force_output_target);
|
||||||
}
|
}
|
||||||
else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
|
else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue