a576827
From 1c611b40e6bfc8029bff7696814330b5bc0ee5c0 Mon Sep 17 00:00:00 2001
a576827
From: "H.J. Lu" <hjl.tools@gmail.com>
a576827
Date: Mon, 26 Jul 2021 05:59:55 -0700
a576827
Subject: [PATCH] bfd: Close the file descriptor if there is no archive fd
a576827
a576827
Close the file descriptor if there is no archive plugin file descriptor
a576827
to avoid running out of file descriptors on thin archives with many
a576827
archive members.
a576827
a576827
bfd/
a576827
a576827
	PR ld/28138
a576827
	* plugin.c (bfd_plugin_close_file_descriptor): Close the file
a576827
	descriptor there is no archive plugin file descriptor.
a576827
a576827
ld/
a576827
a576827
	PR ld/28138
a576827
	* testsuite/ld-plugin/lto.exp: Run tmpdir/pr28138 only for
a576827
	native build.
a576827
a576827
	PR ld/28138
a576827
	* testsuite/ld-plugin/lto.exp: Run ld/28138 tests.
a576827
	* testsuite/ld-plugin/pr28138.c: New file.
a576827
	* testsuite/ld-plugin/pr28138-1.c: Likewise.
a576827
	* testsuite/ld-plugin/pr28138-2.c: Likewise.
a576827
	* testsuite/ld-plugin/pr28138-3.c: Likewise.
a576827
	* testsuite/ld-plugin/pr28138-4.c: Likewise.
a576827
	* testsuite/ld-plugin/pr28138-5.c: Likewise.
a576827
	* testsuite/ld-plugin/pr28138-6.c: Likewise.
a576827
	* testsuite/ld-plugin/pr28138-7.c: Likewise.
a576827
a576827
(cherry picked from commit 5a98fb7513b559e20dfebdbaa2a471afda3b4742)
a576827
(cherry picked from commit 7dc37e1e1209c80e0bab784df6b6bac335e836f2)
a576827
---
a576827
 bfd/plugin.c                       |  8 +++++++
a576827
 ld/testsuite/ld-plugin/lto.exp     | 34 ++++++++++++++++++++++++++++++
a576827
 ld/testsuite/ld-plugin/pr28138-1.c |  6 ++++++
a576827
 ld/testsuite/ld-plugin/pr28138-2.c |  6 ++++++
a576827
 ld/testsuite/ld-plugin/pr28138-3.c |  6 ++++++
a576827
 ld/testsuite/ld-plugin/pr28138-4.c |  6 ++++++
a576827
 ld/testsuite/ld-plugin/pr28138-5.c |  6 ++++++
a576827
 ld/testsuite/ld-plugin/pr28138-6.c |  6 ++++++
a576827
 ld/testsuite/ld-plugin/pr28138-7.c |  6 ++++++
a576827
 ld/testsuite/ld-plugin/pr28138.c   | 20 ++++++++++++++++++
a576827
 10 files changed, 104 insertions(+)
a576827
 create mode 100644 ld/testsuite/ld-plugin/pr28138-1.c
a576827
 create mode 100644 ld/testsuite/ld-plugin/pr28138-2.c
a576827
 create mode 100644 ld/testsuite/ld-plugin/pr28138-3.c
a576827
 create mode 100644 ld/testsuite/ld-plugin/pr28138-4.c
a576827
 create mode 100644 ld/testsuite/ld-plugin/pr28138-5.c
a576827
 create mode 100644 ld/testsuite/ld-plugin/pr28138-6.c
a576827
 create mode 100644 ld/testsuite/ld-plugin/pr28138-7.c
a576827
 create mode 100644 ld/testsuite/ld-plugin/pr28138.c
a576827
a576827
diff --git a/bfd/plugin.c b/bfd/plugin.c
a576827
index 6cfa2b66470..3bab8febe88 100644
a576827
--- a/bfd/plugin.c
a576827
+++ b/bfd/plugin.c
a576827
@@ -291,6 +291,14 @@ bfd_plugin_close_file_descriptor (bfd *abfd, int fd)
a576827
 	     && !bfd_is_thin_archive (abfd->my_archive))
a576827
 	abfd = abfd->my_archive;
a576827
 
a576827
+      /* Close the file descriptor if there is no archive plugin file
a576827
+	 descriptor.  */
a576827
+      if (abfd->archive_plugin_fd == -1)
a576827
+	{
a576827
+	  close (fd);
a576827
+	  return;
a576827
+	}
a576827
+
a576827
       abfd->archive_plugin_fd_open_count--;
a576827
       /* Dup the archive plugin file descriptor for later use, which
a576827
 	 will be closed by _bfd_archive_close_and_cleanup.  */
a576827
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
a576827
index def69e43ab3..999d911ce6a 100644
a576827
--- a/ld/testsuite/ld-plugin/lto.exp
a576827
+++ b/ld/testsuite/ld-plugin/lto.exp
a576827
@@ -687,6 +687,40 @@ if { [is_elf_format] && [check_lto_shared_available] } {
a576827
     }
a576827
 }
a576827
 
a576827
+run_cc_link_tests [list \
a576827
+    [list \
a576827
+	"Build pr28138.a" \
a576827
+	"-T" "" \
a576827
+	{pr28138-1.c pr28138-2.c pr28138-3.c pr28138-4.c pr28138-5.c \
a576827
+	 pr28138-6.c pr28138-7.c} {} "pr28138.a" \
a576827
+    ] \
a576827
+    [list \
a576827
+	"Build pr28138.o" \
a576827
+	"" "" \
a576827
+	{pr28138.c} {} \
a576827
+    ] \
a576827
+]
a576827
+
a576827
+set exec_output [run_host_cmd "sh" \
a576827
+			      "-c \"ulimit -n 20; \
a576827
+			      $CC -Btmpdir/ld -o tmpdir/pr28138 \
a576827
+			      tmpdir/pr28138.o tmpdir/pr28138.a\""]
a576827
+set exec_output [prune_warnings $exec_output]
a576827
+if [string match "" $exec_output] then {
a576827
+    if { [isnative] } {
a576827
+	set exec_output [run_host_cmd "tmpdir/pr28138" ""]
a576827
+	if [string match "PASS" $exec_output] then {
a576827
+	    pass "PR ld/28138"
a576827
+	} else {
a576827
+	    fail "PR ld/28138"
a576827
+	}
a576827
+    } else {
a576827
+	pass "PR ld/28138"
a576827
+    }
a576827
+} else {
a576827
+    fail "PR ld/28138"
a576827
+}
a576827
+
a576827
 set testname "Build liblto-11.a"
a576827
 remote_file host delete "tmpdir/liblto-11.a"
a576827
 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"]
a576827
diff --git a/ld/testsuite/ld-plugin/pr28138-1.c b/ld/testsuite/ld-plugin/pr28138-1.c
a576827
new file mode 100644
a576827
index 00000000000..51d119e1642
a576827
--- /dev/null
a576827
+++ b/ld/testsuite/ld-plugin/pr28138-1.c
a576827
@@ -0,0 +1,6 @@
a576827
+extern int a0(void);
a576827
+int
a576827
+a1(void)
a576827
+{
a576827
+  return 1 + a0();
a576827
+}
a576827
diff --git a/ld/testsuite/ld-plugin/pr28138-2.c b/ld/testsuite/ld-plugin/pr28138-2.c
a576827
new file mode 100644
a576827
index 00000000000..1120cd797e9
a576827
--- /dev/null
a576827
+++ b/ld/testsuite/ld-plugin/pr28138-2.c
a576827
@@ -0,0 +1,6 @@
a576827
+extern int a1(void);
a576827
+int
a576827
+a2(void)
a576827
+{
a576827
+  return 1 + a1();
a576827
+}
a576827
diff --git a/ld/testsuite/ld-plugin/pr28138-3.c b/ld/testsuite/ld-plugin/pr28138-3.c
a576827
new file mode 100644
a576827
index 00000000000..ec464947ee6
a576827
--- /dev/null
a576827
+++ b/ld/testsuite/ld-plugin/pr28138-3.c
a576827
@@ -0,0 +1,6 @@
a576827
+extern int a2(void);
a576827
+int
a576827
+a3(void)
a576827
+{
a576827
+  return 1 + a2();
a576827
+}
a576827
diff --git a/ld/testsuite/ld-plugin/pr28138-4.c b/ld/testsuite/ld-plugin/pr28138-4.c
a576827
new file mode 100644
a576827
index 00000000000..475701b2c5c
a576827
--- /dev/null
a576827
+++ b/ld/testsuite/ld-plugin/pr28138-4.c
a576827
@@ -0,0 +1,6 @@
a576827
+extern int a3(void);
a576827
+int
a576827
+a4(void)
a576827
+{
a576827
+  return 1 + a3();
a576827
+}
a576827
diff --git a/ld/testsuite/ld-plugin/pr28138-5.c b/ld/testsuite/ld-plugin/pr28138-5.c
a576827
new file mode 100644
a576827
index 00000000000..e24f86c363e
a576827
--- /dev/null
a576827
+++ b/ld/testsuite/ld-plugin/pr28138-5.c
a576827
@@ -0,0 +1,6 @@
a576827
+extern int a4(void);
a576827
+int
a576827
+a5(void)
a576827
+{
a576827
+  return 1 + a4();
a576827
+}
a576827
diff --git a/ld/testsuite/ld-plugin/pr28138-6.c b/ld/testsuite/ld-plugin/pr28138-6.c
a576827
new file mode 100644
a576827
index 00000000000..b5b938bdb21
a576827
--- /dev/null
a576827
+++ b/ld/testsuite/ld-plugin/pr28138-6.c
a576827
@@ -0,0 +1,6 @@
a576827
+extern int a5(void);
a576827
+int
a576827
+a6(void)
a576827
+{
a576827
+  return 1 + a5();
a576827
+}
a576827
diff --git a/ld/testsuite/ld-plugin/pr28138-7.c b/ld/testsuite/ld-plugin/pr28138-7.c
a576827
new file mode 100644
a576827
index 00000000000..4ef75bf0f0c
a576827
--- /dev/null
a576827
+++ b/ld/testsuite/ld-plugin/pr28138-7.c
a576827
@@ -0,0 +1,6 @@
a576827
+extern int a6(void);
a576827
+int
a576827
+a7(void)
a576827
+{
a576827
+  return 1 + a6();
a576827
+}
a576827
diff --git a/ld/testsuite/ld-plugin/pr28138.c b/ld/testsuite/ld-plugin/pr28138.c
a576827
new file mode 100644
a576827
index 00000000000..68252c9f382
a576827
--- /dev/null
a576827
+++ b/ld/testsuite/ld-plugin/pr28138.c
a576827
@@ -0,0 +1,20 @@
a576827
+#include <stdio.h>
a576827
+
a576827
+extern int a7(void);
a576827
+
a576827
+int
a576827
+a0(void)
a576827
+{
a576827
+  return 0;
a576827
+}
a576827
+
a576827
+int
a576827
+main()
a576827
+{
a576827
+  if (a7() == 7)
a576827
+    {
a576827
+      printf ("PASS\n");
a576827
+      return 0;
a576827
+    }
a576827
+  return 1;
a576827
+}
a576827
-- 
a576827
2.27.0
a576827