ld: Check archive only for archive member
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 6 Jul 2021 13:21:54 +0000 (06:21 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 7 Jul 2021 14:44:39 +0000 (07:44 -0700)
Since plugin_maybe_claim calls bfd_close on the original input BFD if it
isn't an archive member, pass NULL to bfd_plugin_close_file_descriptor
to indicate that the BFD isn't an archive member.

bfd/

PR ld/18028
* plugin.c (bfd_plugin_close_file_descriptor): Check archive
only of abfd != NULL.
(try_claim): Pass NULL to bfd_plugin_close_file_descriptor if
it isn't an archive member.

ld/

PR ld/18028
* plugin.c (plugin_input_file): Add comments for abfd and ibfd.
(plugin_object_p): Set input->ibfd to NULL if it isn't an
archive member.

bfd/plugin.c
ld/plugin.c

index b3d6739dabbf172b439454358bfa2af62ef6ff18..6cfa2b6647041772a3492f996c01f93c3ba19aa0 100644 (file)
@@ -277,27 +277,26 @@ bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file)
   return 1;
 }
 
-/* Close the plugin file descriptor.  */
+/* Close the plugin file descriptor FD.  If ABFD isn't NULL, it is an
+   archive member.   */
 
 void
 bfd_plugin_close_file_descriptor (bfd *abfd, int fd)
 {
-  bfd *iobfd;
-
-  iobfd = abfd;
-  while (iobfd->my_archive
-        && !bfd_is_thin_archive (iobfd->my_archive))
-    iobfd = iobfd->my_archive;
-  if (iobfd == abfd)
+  if (abfd == NULL)
     close (fd);
   else
     {
-      iobfd->archive_plugin_fd_open_count--;
+      while (abfd->my_archive
+            && !bfd_is_thin_archive (abfd->my_archive))
+       abfd = abfd->my_archive;
+
+      abfd->archive_plugin_fd_open_count--;
       /* Dup the archive plugin file descriptor for later use, which
         will be closed by _bfd_archive_close_and_cleanup.  */
-      if (iobfd->archive_plugin_fd_open_count == 0)
+      if (abfd->archive_plugin_fd_open_count == 0)
        {
-         iobfd->archive_plugin_fd = dup (fd);
+         abfd->archive_plugin_fd = dup (fd);
          close (fd);
        }
     }
@@ -314,7 +313,9 @@ try_claim (bfd *abfd)
       && current_plugin->claim_file)
     {
       current_plugin->claim_file (&file, &claimed);
-      bfd_plugin_close_file_descriptor (abfd, file.fd);
+      bfd_plugin_close_file_descriptor ((abfd->my_archive != NULL
+                                        ? abfd : NULL),
+                                       file.fd);
     }
 
   return claimed;
index bb369f46955eb641ff9bfcc19b57e83f9e216e5e..b91a958b812db6b16214cf6d56ec972ac6b14417 100644 (file)
@@ -102,7 +102,9 @@ typedef struct view_buffer
    pointer.  */
 typedef struct plugin_input_file
 {
+  /* The dummy BFD.  */
   bfd *abfd;
+  /* The original input BFD.  Non-NULL if it is an archive member.  */
   bfd *ibfd;
   view_buffer_t view_buffer;
   char *name;
@@ -1220,7 +1222,7 @@ plugin_object_p (bfd *ibfd)
 
   file.handle = input;
   input->abfd = abfd;
-  input->ibfd = ibfd;
+  input->ibfd = ibfd->my_archive != NULL ? ibfd : NULL;
   input->view_buffer.addr = NULL;
   input->view_buffer.filesize = 0;
   input->view_buffer.offset = 0;