Submitted By: Bruce Dubbs Date: 2021-08-13 Initial Package Version: 2.37 Upstream Status: Committed Origin: Upstream Description: bfd: Close the file descriptor if there is no archive fd From 1c611b40e6bfc8029bff7696814330b5bc0ee5c0 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" 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) --- 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 + +extern int a7(void); + +int +a0(void) +{ + return 0; +} + +int +main() +{ + if (a7() == 7) + { + printf ("PASS\n"); + return 0; + } + return 1; +} -- 2.27.0