aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2021-07-07 07:47:00 -0700
committerH.J. Lu <hjl.tools@gmail.com>2021-07-07 07:47:17 -0700
commitf9b771014915eebbd20791870ffd175b9156ce42 (patch)
tree35cc54b623d3f19ba9c701d96f022c1b14dc9eff
parentFix Solaris gprof build with --disable-nls (diff)
downloadbinutils-gdb-f9b771014915eebbd20791870ffd175b9156ce42.tar.gz
binutils-gdb-f9b771014915eebbd20791870ffd175b9156ce42.tar.bz2
binutils-gdb-f9b771014915eebbd20791870ffd175b9156ce42.zip
ld: Check archive only for archive member
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. (cherry picked from commit 7a30ac441a4e776e68399cb916c4731b5192e931)
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/plugin.c25
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/plugin.c4
4 files changed, 31 insertions, 13 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e4f708f9aae..39c7fd73f92 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2021-07-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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.
+
2021-07-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* sysdep.h [!ENABLE_NLS]: Prevent inclusion of <libintl.h> on
diff --git a/bfd/plugin.c b/bfd/plugin.c
index b3d6739dabb..6cfa2b66470 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -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;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 537b5df6311..b7d9656d5d4 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2021-07-07 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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.
+
2021-07-05 H.J. Lu <hongjiu.lu@intel.com>
PR ld/28040
diff --git a/ld/plugin.c b/ld/plugin.c
index bb369f46955..b91a958b812 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -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;