bfd: Close the file descriptor if there is no archive fd

Close the file descriptor if there is no archive plugin file descriptor
to avoid running out of file descriptors on thin archives with many
archive members.

bfd/

	PR ld/28138
	* plugin.c (bfd_plugin_close_file_descriptor): Close the file
	descriptor there is no archive plugin file descriptor.

ld/

	PR ld/28138
	* testsuite/ld-plugin/lto.exp: Run ld/28138 tests.
	* testsuite/ld-plugin/pr28138.c: New file.
	* testsuite/ld-plugin/pr28138-1.c: Likewise.
	* testsuite/ld-plugin/pr28138-2.c: Likewise.
	* testsuite/ld-plugin/pr28138-3.c: Likewise.
	* testsuite/ld-plugin/pr28138-4.c: Likewise.
	* testsuite/ld-plugin/pr28138-5.c: Likewise.
	* testsuite/ld-plugin/pr28138-6.c: Likewise.
	* testsuite/ld-plugin/pr28138-7.c: Likewise.
This commit is contained in:
H.J. Lu 2021-07-26 05:59:55 -07:00
parent 265dcb69c2
commit 5a98fb7513
10 changed files with 100 additions and 0 deletions

View file

@ -291,6 +291,14 @@ bfd_plugin_close_file_descriptor (bfd *abfd, int fd)
&& !bfd_is_thin_archive (abfd->my_archive))
abfd = abfd->my_archive;
/* Close the file descriptor if there is no archive plugin file
descriptor. */
if (abfd->archive_plugin_fd == -1)
{
close (fd);
return;
}
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. */

View file

@ -930,4 +930,34 @@ if { [check_lto_fat_available] } {
}
}
run_cc_link_tests [list \
[list \
"Build pr28138.a" \
"-T" "" \
{pr28138-1.c pr28138-2.c pr28138-3.c pr28138-4.c pr28138-5.c \
pr28138-6.c pr28138-7.c} {} "pr28138.a" \
] \
[list \
"Build pr28138.o" \
"" "" \
{pr28138.c} {} \
] \
]
set exec_output [run_host_cmd "sh" \
"-c \"ulimit -n 20; \
$CC -Btmpdir/ld -o tmpdir/pr28138 \
tmpdir/pr28138.o tmpdir/pr28138.a\""]
set exec_output [prune_warnings $exec_output]
if [string match "" $exec_output] then {
set exec_output [run_host_cmd "tmpdir/pr28138" ""]
if [string match "PASS" $exec_output] then {
pass "PR ld/28138"
} else {
fail "PR ld/28138"
}
} else {
fail "PR ld/28138"
}
restore_notify

View file

@ -0,0 +1,6 @@
extern int a0(void);
int
a1(void)
{
return 1 + a0();
}

View file

@ -0,0 +1,6 @@
extern int a1(void);
int
a2(void)
{
return 1 + a1();
}

View file

@ -0,0 +1,6 @@
extern int a2(void);
int
a3(void)
{
return 1 + a2();
}

View file

@ -0,0 +1,6 @@
extern int a3(void);
int
a4(void)
{
return 1 + a3();
}

View file

@ -0,0 +1,6 @@
extern int a4(void);
int
a5(void)
{
return 1 + a4();
}

View file

@ -0,0 +1,6 @@
extern int a5(void);
int
a6(void)
{
return 1 + a5();
}

View file

@ -0,0 +1,6 @@
extern int a6(void);
int
a7(void)
{
return 1 + a6();
}

View file

@ -0,0 +1,20 @@
#include <stdio.h>
extern int a7(void);
int
a0(void)
{
return 0;
}
int
main()
{
if (a7() == 7)
{
printf ("PASS\n");
return 0;
}
return 1;
}