1*4882a593SmuzhiyunFrom 1c611b40e6bfc8029bff7696814330b5bc0ee5c0 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: "H.J. Lu" <hjl.tools@gmail.com>
3*4882a593SmuzhiyunDate: Mon, 26 Jul 2021 05:59:55 -0700
4*4882a593SmuzhiyunSubject: [PATCH] bfd: Close the file descriptor if there is no archive fd
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunClose the file descriptor if there is no archive plugin file descriptor
7*4882a593Smuzhiyunto avoid running out of file descriptors on thin archives with many
8*4882a593Smuzhiyunarchive members.
9*4882a593Smuzhiyun
10*4882a593Smuzhiyunbfd/
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun	PR ld/28138
13*4882a593Smuzhiyun	* plugin.c (bfd_plugin_close_file_descriptor): Close the file
14*4882a593Smuzhiyun	descriptor there is no archive plugin file descriptor.
15*4882a593Smuzhiyun
16*4882a593Smuzhiyunld/
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun	PR ld/28138
19*4882a593Smuzhiyun	* testsuite/ld-plugin/lto.exp: Run tmpdir/pr28138 only for
20*4882a593Smuzhiyun	native build.
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun	PR ld/28138
23*4882a593Smuzhiyun	* testsuite/ld-plugin/lto.exp: Run ld/28138 tests.
24*4882a593Smuzhiyun	* testsuite/ld-plugin/pr28138.c: New file.
25*4882a593Smuzhiyun	* testsuite/ld-plugin/pr28138-1.c: Likewise.
26*4882a593Smuzhiyun	* testsuite/ld-plugin/pr28138-2.c: Likewise.
27*4882a593Smuzhiyun	* testsuite/ld-plugin/pr28138-3.c: Likewise.
28*4882a593Smuzhiyun	* testsuite/ld-plugin/pr28138-4.c: Likewise.
29*4882a593Smuzhiyun	* testsuite/ld-plugin/pr28138-5.c: Likewise.
30*4882a593Smuzhiyun	* testsuite/ld-plugin/pr28138-6.c: Likewise.
31*4882a593Smuzhiyun	* testsuite/ld-plugin/pr28138-7.c: Likewise.
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun(cherry picked from commit 5a98fb7513b559e20dfebdbaa2a471afda3b4742)
34*4882a593Smuzhiyun(cherry picked from commit 7dc37e1e1209c80e0bab784df6b6bac335e836f2)
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun[Upstream:
37*4882a593Smuzhiyun https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1c611b40e6bfc8029bff7696814330b5bc0ee5c0]
38*4882a593SmuzhiyunSigned-off-by: Peter Seiderer <ps.report@gmx.net>
39*4882a593Smuzhiyun---
40*4882a593Smuzhiyun bfd/plugin.c                       |  8 +++++++
41*4882a593Smuzhiyun ld/testsuite/ld-plugin/lto.exp     | 34 ++++++++++++++++++++++++++++++
42*4882a593Smuzhiyun ld/testsuite/ld-plugin/pr28138-1.c |  6 ++++++
43*4882a593Smuzhiyun ld/testsuite/ld-plugin/pr28138-2.c |  6 ++++++
44*4882a593Smuzhiyun ld/testsuite/ld-plugin/pr28138-3.c |  6 ++++++
45*4882a593Smuzhiyun ld/testsuite/ld-plugin/pr28138-4.c |  6 ++++++
46*4882a593Smuzhiyun ld/testsuite/ld-plugin/pr28138-5.c |  6 ++++++
47*4882a593Smuzhiyun ld/testsuite/ld-plugin/pr28138-6.c |  6 ++++++
48*4882a593Smuzhiyun ld/testsuite/ld-plugin/pr28138-7.c |  6 ++++++
49*4882a593Smuzhiyun ld/testsuite/ld-plugin/pr28138.c   | 20 ++++++++++++++++++
50*4882a593Smuzhiyun 10 files changed, 104 insertions(+)
51*4882a593Smuzhiyun create mode 100644 ld/testsuite/ld-plugin/pr28138-1.c
52*4882a593Smuzhiyun create mode 100644 ld/testsuite/ld-plugin/pr28138-2.c
53*4882a593Smuzhiyun create mode 100644 ld/testsuite/ld-plugin/pr28138-3.c
54*4882a593Smuzhiyun create mode 100644 ld/testsuite/ld-plugin/pr28138-4.c
55*4882a593Smuzhiyun create mode 100644 ld/testsuite/ld-plugin/pr28138-5.c
56*4882a593Smuzhiyun create mode 100644 ld/testsuite/ld-plugin/pr28138-6.c
57*4882a593Smuzhiyun create mode 100644 ld/testsuite/ld-plugin/pr28138-7.c
58*4882a593Smuzhiyun create mode 100644 ld/testsuite/ld-plugin/pr28138.c
59*4882a593Smuzhiyun
60*4882a593Smuzhiyundiff --git a/bfd/plugin.c b/bfd/plugin.c
61*4882a593Smuzhiyunindex 6cfa2b66470..3bab8febe88 100644
62*4882a593Smuzhiyun--- a/bfd/plugin.c
63*4882a593Smuzhiyun+++ b/bfd/plugin.c
64*4882a593Smuzhiyun@@ -291,6 +291,14 @@ bfd_plugin_close_file_descriptor (bfd *abfd, int fd)
65*4882a593Smuzhiyun 	     && !bfd_is_thin_archive (abfd->my_archive))
66*4882a593Smuzhiyun 	abfd = abfd->my_archive;
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun+      /* Close the file descriptor if there is no archive plugin file
69*4882a593Smuzhiyun+	 descriptor.  */
70*4882a593Smuzhiyun+      if (abfd->archive_plugin_fd == -1)
71*4882a593Smuzhiyun+	{
72*4882a593Smuzhiyun+	  close (fd);
73*4882a593Smuzhiyun+	  return;
74*4882a593Smuzhiyun+	}
75*4882a593Smuzhiyun+
76*4882a593Smuzhiyun       abfd->archive_plugin_fd_open_count--;
77*4882a593Smuzhiyun       /* Dup the archive plugin file descriptor for later use, which
78*4882a593Smuzhiyun 	 will be closed by _bfd_archive_close_and_cleanup.  */
79*4882a593Smuzhiyundiff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
80*4882a593Smuzhiyunindex def69e43ab3..999d911ce6a 100644
81*4882a593Smuzhiyun--- a/ld/testsuite/ld-plugin/lto.exp
82*4882a593Smuzhiyun+++ b/ld/testsuite/ld-plugin/lto.exp
83*4882a593Smuzhiyun@@ -687,6 +687,40 @@ if { [is_elf_format] && [check_lto_shared_available] } {
84*4882a593Smuzhiyun     }
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun+run_cc_link_tests [list \
88*4882a593Smuzhiyun+    [list \
89*4882a593Smuzhiyun+	"Build pr28138.a" \
90*4882a593Smuzhiyun+	"-T" "" \
91*4882a593Smuzhiyun+	{pr28138-1.c pr28138-2.c pr28138-3.c pr28138-4.c pr28138-5.c \
92*4882a593Smuzhiyun+	 pr28138-6.c pr28138-7.c} {} "pr28138.a" \
93*4882a593Smuzhiyun+    ] \
94*4882a593Smuzhiyun+    [list \
95*4882a593Smuzhiyun+	"Build pr28138.o" \
96*4882a593Smuzhiyun+	"" "" \
97*4882a593Smuzhiyun+	{pr28138.c} {} \
98*4882a593Smuzhiyun+    ] \
99*4882a593Smuzhiyun+]
100*4882a593Smuzhiyun+
101*4882a593Smuzhiyun+set exec_output [run_host_cmd "sh" \
102*4882a593Smuzhiyun+			      "-c \"ulimit -n 20; \
103*4882a593Smuzhiyun+			      $CC -Btmpdir/ld -o tmpdir/pr28138 \
104*4882a593Smuzhiyun+			      tmpdir/pr28138.o tmpdir/pr28138.a\""]
105*4882a593Smuzhiyun+set exec_output [prune_warnings $exec_output]
106*4882a593Smuzhiyun+if [string match "" $exec_output] then {
107*4882a593Smuzhiyun+    if { [isnative] } {
108*4882a593Smuzhiyun+	set exec_output [run_host_cmd "tmpdir/pr28138" ""]
109*4882a593Smuzhiyun+	if [string match "PASS" $exec_output] then {
110*4882a593Smuzhiyun+	    pass "PR ld/28138"
111*4882a593Smuzhiyun+	} else {
112*4882a593Smuzhiyun+	    fail "PR ld/28138"
113*4882a593Smuzhiyun+	}
114*4882a593Smuzhiyun+    } else {
115*4882a593Smuzhiyun+	pass "PR ld/28138"
116*4882a593Smuzhiyun+    }
117*4882a593Smuzhiyun+} else {
118*4882a593Smuzhiyun+    fail "PR ld/28138"
119*4882a593Smuzhiyun+}
120*4882a593Smuzhiyun+
121*4882a593Smuzhiyun set testname "Build liblto-11.a"
122*4882a593Smuzhiyun remote_file host delete "tmpdir/liblto-11.a"
123*4882a593Smuzhiyun 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"]
124*4882a593Smuzhiyundiff --git a/ld/testsuite/ld-plugin/pr28138-1.c b/ld/testsuite/ld-plugin/pr28138-1.c
125*4882a593Smuzhiyunnew file mode 100644
126*4882a593Smuzhiyunindex 00000000000..51d119e1642
127*4882a593Smuzhiyun--- /dev/null
128*4882a593Smuzhiyun+++ b/ld/testsuite/ld-plugin/pr28138-1.c
129*4882a593Smuzhiyun@@ -0,0 +1,6 @@
130*4882a593Smuzhiyun+extern int a0(void);
131*4882a593Smuzhiyun+int
132*4882a593Smuzhiyun+a1(void)
133*4882a593Smuzhiyun+{
134*4882a593Smuzhiyun+  return 1 + a0();
135*4882a593Smuzhiyun+}
136*4882a593Smuzhiyundiff --git a/ld/testsuite/ld-plugin/pr28138-2.c b/ld/testsuite/ld-plugin/pr28138-2.c
137*4882a593Smuzhiyunnew file mode 100644
138*4882a593Smuzhiyunindex 00000000000..1120cd797e9
139*4882a593Smuzhiyun--- /dev/null
140*4882a593Smuzhiyun+++ b/ld/testsuite/ld-plugin/pr28138-2.c
141*4882a593Smuzhiyun@@ -0,0 +1,6 @@
142*4882a593Smuzhiyun+extern int a1(void);
143*4882a593Smuzhiyun+int
144*4882a593Smuzhiyun+a2(void)
145*4882a593Smuzhiyun+{
146*4882a593Smuzhiyun+  return 1 + a1();
147*4882a593Smuzhiyun+}
148*4882a593Smuzhiyundiff --git a/ld/testsuite/ld-plugin/pr28138-3.c b/ld/testsuite/ld-plugin/pr28138-3.c
149*4882a593Smuzhiyunnew file mode 100644
150*4882a593Smuzhiyunindex 00000000000..ec464947ee6
151*4882a593Smuzhiyun--- /dev/null
152*4882a593Smuzhiyun+++ b/ld/testsuite/ld-plugin/pr28138-3.c
153*4882a593Smuzhiyun@@ -0,0 +1,6 @@
154*4882a593Smuzhiyun+extern int a2(void);
155*4882a593Smuzhiyun+int
156*4882a593Smuzhiyun+a3(void)
157*4882a593Smuzhiyun+{
158*4882a593Smuzhiyun+  return 1 + a2();
159*4882a593Smuzhiyun+}
160*4882a593Smuzhiyundiff --git a/ld/testsuite/ld-plugin/pr28138-4.c b/ld/testsuite/ld-plugin/pr28138-4.c
161*4882a593Smuzhiyunnew file mode 100644
162*4882a593Smuzhiyunindex 00000000000..475701b2c5c
163*4882a593Smuzhiyun--- /dev/null
164*4882a593Smuzhiyun+++ b/ld/testsuite/ld-plugin/pr28138-4.c
165*4882a593Smuzhiyun@@ -0,0 +1,6 @@
166*4882a593Smuzhiyun+extern int a3(void);
167*4882a593Smuzhiyun+int
168*4882a593Smuzhiyun+a4(void)
169*4882a593Smuzhiyun+{
170*4882a593Smuzhiyun+  return 1 + a3();
171*4882a593Smuzhiyun+}
172*4882a593Smuzhiyundiff --git a/ld/testsuite/ld-plugin/pr28138-5.c b/ld/testsuite/ld-plugin/pr28138-5.c
173*4882a593Smuzhiyunnew file mode 100644
174*4882a593Smuzhiyunindex 00000000000..e24f86c363e
175*4882a593Smuzhiyun--- /dev/null
176*4882a593Smuzhiyun+++ b/ld/testsuite/ld-plugin/pr28138-5.c
177*4882a593Smuzhiyun@@ -0,0 +1,6 @@
178*4882a593Smuzhiyun+extern int a4(void);
179*4882a593Smuzhiyun+int
180*4882a593Smuzhiyun+a5(void)
181*4882a593Smuzhiyun+{
182*4882a593Smuzhiyun+  return 1 + a4();
183*4882a593Smuzhiyun+}
184*4882a593Smuzhiyundiff --git a/ld/testsuite/ld-plugin/pr28138-6.c b/ld/testsuite/ld-plugin/pr28138-6.c
185*4882a593Smuzhiyunnew file mode 100644
186*4882a593Smuzhiyunindex 00000000000..b5b938bdb21
187*4882a593Smuzhiyun--- /dev/null
188*4882a593Smuzhiyun+++ b/ld/testsuite/ld-plugin/pr28138-6.c
189*4882a593Smuzhiyun@@ -0,0 +1,6 @@
190*4882a593Smuzhiyun+extern int a5(void);
191*4882a593Smuzhiyun+int
192*4882a593Smuzhiyun+a6(void)
193*4882a593Smuzhiyun+{
194*4882a593Smuzhiyun+  return 1 + a5();
195*4882a593Smuzhiyun+}
196*4882a593Smuzhiyundiff --git a/ld/testsuite/ld-plugin/pr28138-7.c b/ld/testsuite/ld-plugin/pr28138-7.c
197*4882a593Smuzhiyunnew file mode 100644
198*4882a593Smuzhiyunindex 00000000000..4ef75bf0f0c
199*4882a593Smuzhiyun--- /dev/null
200*4882a593Smuzhiyun+++ b/ld/testsuite/ld-plugin/pr28138-7.c
201*4882a593Smuzhiyun@@ -0,0 +1,6 @@
202*4882a593Smuzhiyun+extern int a6(void);
203*4882a593Smuzhiyun+int
204*4882a593Smuzhiyun+a7(void)
205*4882a593Smuzhiyun+{
206*4882a593Smuzhiyun+  return 1 + a6();
207*4882a593Smuzhiyun+}
208*4882a593Smuzhiyundiff --git a/ld/testsuite/ld-plugin/pr28138.c b/ld/testsuite/ld-plugin/pr28138.c
209*4882a593Smuzhiyunnew file mode 100644
210*4882a593Smuzhiyunindex 00000000000..68252c9f382
211*4882a593Smuzhiyun--- /dev/null
212*4882a593Smuzhiyun+++ b/ld/testsuite/ld-plugin/pr28138.c
213*4882a593Smuzhiyun@@ -0,0 +1,20 @@
214*4882a593Smuzhiyun+#include <stdio.h>
215*4882a593Smuzhiyun+
216*4882a593Smuzhiyun+extern int a7(void);
217*4882a593Smuzhiyun+
218*4882a593Smuzhiyun+int
219*4882a593Smuzhiyun+a0(void)
220*4882a593Smuzhiyun+{
221*4882a593Smuzhiyun+  return 0;
222*4882a593Smuzhiyun+}
223*4882a593Smuzhiyun+
224*4882a593Smuzhiyun+int
225*4882a593Smuzhiyun+main()
226*4882a593Smuzhiyun+{
227*4882a593Smuzhiyun+  if (a7() == 7)
228*4882a593Smuzhiyun+    {
229*4882a593Smuzhiyun+      printf ("PASS\n");
230*4882a593Smuzhiyun+      return 0;
231*4882a593Smuzhiyun+    }
232*4882a593Smuzhiyun+  return 1;
233*4882a593Smuzhiyun+}
234*4882a593Smuzhiyun--
235*4882a593Smuzhiyun2.34.1
236*4882a593Smuzhiyun
237