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:
parent
265dcb69c2
commit
5a98fb7513
10 changed files with 100 additions and 0 deletions
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
6
ld/testsuite/ld-plugin/pr28138-1.c
Normal file
6
ld/testsuite/ld-plugin/pr28138-1.c
Normal file
|
@ -0,0 +1,6 @@
|
|||
extern int a0(void);
|
||||
int
|
||||
a1(void)
|
||||
{
|
||||
return 1 + a0();
|
||||
}
|
6
ld/testsuite/ld-plugin/pr28138-2.c
Normal file
6
ld/testsuite/ld-plugin/pr28138-2.c
Normal file
|
@ -0,0 +1,6 @@
|
|||
extern int a1(void);
|
||||
int
|
||||
a2(void)
|
||||
{
|
||||
return 1 + a1();
|
||||
}
|
6
ld/testsuite/ld-plugin/pr28138-3.c
Normal file
6
ld/testsuite/ld-plugin/pr28138-3.c
Normal file
|
@ -0,0 +1,6 @@
|
|||
extern int a2(void);
|
||||
int
|
||||
a3(void)
|
||||
{
|
||||
return 1 + a2();
|
||||
}
|
6
ld/testsuite/ld-plugin/pr28138-4.c
Normal file
6
ld/testsuite/ld-plugin/pr28138-4.c
Normal file
|
@ -0,0 +1,6 @@
|
|||
extern int a3(void);
|
||||
int
|
||||
a4(void)
|
||||
{
|
||||
return 1 + a3();
|
||||
}
|
6
ld/testsuite/ld-plugin/pr28138-5.c
Normal file
6
ld/testsuite/ld-plugin/pr28138-5.c
Normal file
|
@ -0,0 +1,6 @@
|
|||
extern int a4(void);
|
||||
int
|
||||
a5(void)
|
||||
{
|
||||
return 1 + a4();
|
||||
}
|
6
ld/testsuite/ld-plugin/pr28138-6.c
Normal file
6
ld/testsuite/ld-plugin/pr28138-6.c
Normal file
|
@ -0,0 +1,6 @@
|
|||
extern int a5(void);
|
||||
int
|
||||
a6(void)
|
||||
{
|
||||
return 1 + a5();
|
||||
}
|
6
ld/testsuite/ld-plugin/pr28138-7.c
Normal file
6
ld/testsuite/ld-plugin/pr28138-7.c
Normal file
|
@ -0,0 +1,6 @@
|
|||
extern int a6(void);
|
||||
int
|
||||
a7(void)
|
||||
{
|
||||
return 1 + a6();
|
||||
}
|
20
ld/testsuite/ld-plugin/pr28138.c
Normal file
20
ld/testsuite/ld-plugin/pr28138.c
Normal 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue