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