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