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 tmpdir/pr28138 only for
	native build.

	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.

(cherry picked from commit 5a98fb7513)
(cherry picked from commit 7dc37e1e12)
This commit is contained in:
H.J. Lu 2021-07-26 05:59:55 -07:00
parent 9d6d087078
commit 1c611b40e6
10 changed files with 104 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

@ -687,6 +687,40 @@ if { [is_elf_format] && [check_lto_shared_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 {
if { [isnative] } {
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 {
pass "PR ld/28138"
}
} else {
fail "PR ld/28138"
}
set testname "Build liblto-11.a"
remote_file host delete "tmpdir/liblto-11.a"
set catch_output [run_host_cmd "$ar" "rc $plug_opt tmpdir/liblto-11.a tmpdir/lto-11a.o tmpdir/lto-11b.o tmpdir/lto-11c.o"]

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