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.
This commit is contained in:
H.J. Lu
2021-07-06 06:21:54 -07:00
parent b180e8298b
commit 7a30ac441a
2 changed files with 16 additions and 13 deletions

View 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;