diff options
author | 2021-07-07 07:47:00 -0700 | |
---|---|---|
committer | 2021-07-07 07:47:17 -0700 | |
commit | f9b771014915eebbd20791870ffd175b9156ce42 (patch) | |
tree | 35cc54b623d3f19ba9c701d96f022c1b14dc9eff | |
parent | Fix Solaris gprof build with --disable-nls (diff) | |
download | binutils-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/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/plugin.c | 25 | ||||
-rw-r--r-- | ld/ChangeLog | 7 | ||||
-rw-r--r-- | ld/plugin.c | 4 |
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; |