mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 12:03:41 +08:00
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 commit5a98fb7513
) (cherry picked from commit7dc37e1e12
)
This commit is contained in:
parent
9d6d087078
commit
1c611b40e6
@ -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. */
|
||||
|
@ -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"]
|
||||
|
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…
Reference in New Issue
Block a user