From 83b0a6865c081de2f6e8f56870d832b9fb65edde Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 19 May 2021 11:53:23 +0100 Subject: [PATCH] Warn when the plugin interface runs out of file descriptors. * plugin.c (bfd_plugin_open_input): Inform the user if the limit on the number of open files is reached. If possible, try to increase this limit before failing. --- bfd/ChangeLog | 6 ++++++ bfd/plugin.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b399aefd120..a389fdfc8b1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2021-05-19 Nick Clifton + + * plugin.c (bfd_plugin_open_input): Inform the user if the limit + on the number of open files is reached. If possible, try to + increase this limit before failing. + 2021-05-14 Nelson Chu * elfnn-riscv.c (riscv_resolve_pcrel_lo_relocs): Check the values diff --git a/bfd/plugin.c b/bfd/plugin.c index c4f2be8999e..1fee4d0c870 100644 --- a/bfd/plugin.c +++ b/bfd/plugin.c @@ -209,7 +209,35 @@ bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file) the same underlying file descriptor. */ file->fd = open (file->name, O_RDONLY | O_BINARY); if (file->fd < 0) - return 0; + { +#ifndef EMFILE + return 0; +#else + if (errno != EMFILE) + return 0; + +#ifdef HAVE_GETRLIMIT + struct rlimit lim; + + /* Complicated links involving lots of files and/or large archives + can exhaust the number of file descriptors available to us. + If possible, try to allocate more descriptors. */ + if (getrlimit (RLIMIT_NOFILE, & lim) == 0 + && lim.rlim_cur < lim.rlim_max) + { + lim.rlim_cur = lim.rlim_max; + if (setrlimit (RLIMIT_NOFILE, &lim) == 0) + file->fd = open (file->name, O_RDONLY | O_BINARY); + } + + if (file->fd < 0) +#endif + { + _bfd_error_handler (_("plugin framework: out of file descriptors. Try using fewer objects/archives\n")); + return 0; + } +#endif + } if (iobfd == ibfd) { -- 2.30.2