Stop objcopy from attempting to copy thin archives.
authorNick Clifton <nickc@redhat.com>
Mon, 4 Mar 2019 13:11:08 +0000 (13:11 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 4 Mar 2019 13:11:08 +0000 (13:11 +0000)
PR 24281
* objcopy.c (copy_archive): Do not copy thin  archives.

binutils/ChangeLog
binutils/objcopy.c

index 6bb43845739a53bdfd0f0f83821f9869dc723066..aa33e52ae066e13b060477e80bf6542fc5f81ed6 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-04  Nick Clifton  <nickc@redhat.com>
+
+       PR 24281
+       * objcopy.c (copy_archive): Do not copy thin  archives.
+
 2019-02-27  Matthew Malcomson  <matthew.malcomson@arm.com>
 
        * testsuite/lib/binutils-common.exp: Allow multiple "as" lines.
index 0e17b863d5a7d4b95b1dfbc7aa8d6b683b85d592..330b93c1ad3f87a0f5777ac88dc4af1398959bbe 100644 (file)
@@ -3276,6 +3276,27 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
   char *dir;
   const char *filename;
 
+  /* PR 24281: It is not clear what should happen when copying a thin archive.
+     One part is straight forward - if the output archive is in a different
+     directory from the input archive then any relative paths in the library
+     should be adjusted to the new location.  But if any transformation
+     options are active (eg strip, rename, add, etc) then the implication is
+     that these should be applied to the files pointed to by the archive.
+     But since objcopy is not destructive, this means that new files must be
+     created, and there is no guidance for the names of the new files.  (Plus
+     this conflicts with one of the goals of thin libraries - only taking up
+     a  minimal amount of space in the file system).
+
+     So for now we fail if an attempt is made to copy such libraries.  */
+  if (ibfd->is_thin_archive)
+    {
+      status = 1;
+      bfd_set_error (bfd_error_invalid_operation);
+      bfd_nonfatal_message (NULL, ibfd, NULL,
+                           _("sorry: copying thin archives is not currently supported"));
+      return;
+    }
+
   /* Make a temp directory to hold the contents.  */
   dir = make_tempdir (bfd_get_filename (obfd));
   if (dir == NULL)