123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- From 1c611b40e6bfc8029bff7696814330b5bc0ee5c0 Mon Sep 17 00:00:00 2001
- From: "H.J. Lu" <hjl.tools@gmail.com>
- Date: Mon, 26 Jul 2021 05:59:55 -0700
- Subject: [PATCH] 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 5a98fb7513b559e20dfebdbaa2a471afda3b4742)
- (cherry picked from commit 7dc37e1e1209c80e0bab784df6b6bac335e836f2)
- Upstream-Status: Accepted[https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=1c611b40e6bfc8029bff7696814330b5bc0ee5c0]
- ---
- bfd/plugin.c | 8 +++++++
- ld/testsuite/ld-plugin/lto.exp | 34 ++++++++++++++++++++++++++++++
- ld/testsuite/ld-plugin/pr28138-1.c | 6 ++++++
- ld/testsuite/ld-plugin/pr28138-2.c | 6 ++++++
- ld/testsuite/ld-plugin/pr28138-3.c | 6 ++++++
- ld/testsuite/ld-plugin/pr28138-4.c | 6 ++++++
- ld/testsuite/ld-plugin/pr28138-5.c | 6 ++++++
- ld/testsuite/ld-plugin/pr28138-6.c | 6 ++++++
- ld/testsuite/ld-plugin/pr28138-7.c | 6 ++++++
- ld/testsuite/ld-plugin/pr28138.c | 20 ++++++++++++++++++
- 10 files changed, 104 insertions(+)
- create mode 100644 ld/testsuite/ld-plugin/pr28138-1.c
- create mode 100644 ld/testsuite/ld-plugin/pr28138-2.c
- create mode 100644 ld/testsuite/ld-plugin/pr28138-3.c
- create mode 100644 ld/testsuite/ld-plugin/pr28138-4.c
- create mode 100644 ld/testsuite/ld-plugin/pr28138-5.c
- create mode 100644 ld/testsuite/ld-plugin/pr28138-6.c
- create mode 100644 ld/testsuite/ld-plugin/pr28138-7.c
- create mode 100644 ld/testsuite/ld-plugin/pr28138.c
- diff --git a/bfd/plugin.c b/bfd/plugin.c
- index 6cfa2b66470..3bab8febe88 100644
- --- a/bfd/plugin.c
- +++ b/bfd/plugin.c
- @@ -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. */
- diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
- index def69e43ab3..999d911ce6a 100644
- --- a/ld/testsuite/ld-plugin/lto.exp
- +++ b/ld/testsuite/ld-plugin/lto.exp
- @@ -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"]
- diff --git a/ld/testsuite/ld-plugin/pr28138-1.c b/ld/testsuite/ld-plugin/pr28138-1.c
- new file mode 100644
- index 00000000000..51d119e1642
- --- /dev/null
- +++ b/ld/testsuite/ld-plugin/pr28138-1.c
- @@ -0,0 +1,6 @@
- +extern int a0(void);
- +int
- +a1(void)
- +{
- + return 1 + a0();
- +}
- diff --git a/ld/testsuite/ld-plugin/pr28138-2.c b/ld/testsuite/ld-plugin/pr28138-2.c
- new file mode 100644
- index 00000000000..1120cd797e9
- --- /dev/null
- +++ b/ld/testsuite/ld-plugin/pr28138-2.c
- @@ -0,0 +1,6 @@
- +extern int a1(void);
- +int
- +a2(void)
- +{
- + return 1 + a1();
- +}
- diff --git a/ld/testsuite/ld-plugin/pr28138-3.c b/ld/testsuite/ld-plugin/pr28138-3.c
- new file mode 100644
- index 00000000000..ec464947ee6
- --- /dev/null
- +++ b/ld/testsuite/ld-plugin/pr28138-3.c
- @@ -0,0 +1,6 @@
- +extern int a2(void);
- +int
- +a3(void)
- +{
- + return 1 + a2();
- +}
- diff --git a/ld/testsuite/ld-plugin/pr28138-4.c b/ld/testsuite/ld-plugin/pr28138-4.c
- new file mode 100644
- index 00000000000..475701b2c5c
- --- /dev/null
- +++ b/ld/testsuite/ld-plugin/pr28138-4.c
- @@ -0,0 +1,6 @@
- +extern int a3(void);
- +int
- +a4(void)
- +{
- + return 1 + a3();
- +}
- diff --git a/ld/testsuite/ld-plugin/pr28138-5.c b/ld/testsuite/ld-plugin/pr28138-5.c
- new file mode 100644
- index 00000000000..e24f86c363e
- --- /dev/null
- +++ b/ld/testsuite/ld-plugin/pr28138-5.c
- @@ -0,0 +1,6 @@
- +extern int a4(void);
- +int
- +a5(void)
- +{
- + return 1 + a4();
- +}
- diff --git a/ld/testsuite/ld-plugin/pr28138-6.c b/ld/testsuite/ld-plugin/pr28138-6.c
- new file mode 100644
- index 00000000000..b5b938bdb21
- --- /dev/null
- +++ b/ld/testsuite/ld-plugin/pr28138-6.c
- @@ -0,0 +1,6 @@
- +extern int a5(void);
- +int
- +a6(void)
- +{
- + return 1 + a5();
- +}
- diff --git a/ld/testsuite/ld-plugin/pr28138-7.c b/ld/testsuite/ld-plugin/pr28138-7.c
- new file mode 100644
- index 00000000000..4ef75bf0f0c
- --- /dev/null
- +++ b/ld/testsuite/ld-plugin/pr28138-7.c
- @@ -0,0 +1,6 @@
- +extern int a6(void);
- +int
- +a7(void)
- +{
- + return 1 + a6();
- +}
- diff --git a/ld/testsuite/ld-plugin/pr28138.c b/ld/testsuite/ld-plugin/pr28138.c
- new file mode 100644
- index 00000000000..68252c9f382
- --- /dev/null
- +++ b/ld/testsuite/ld-plugin/pr28138.c
- @@ -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;
- +}
- --
- 2.31.1
|