tstellar / rpms / binutils

Forked from rpms/binutils 2 years ago
Clone
Blob Blame History Raw
diff -rup binutils.orig/bfd/plugin.c binutils-2.36.1/bfd/plugin.c
--- binutils.orig/bfd/plugin.c	2021-05-24 11:35:17.208423540 +0100
+++ binutils-2.36.1/bfd/plugin.c	2021-05-24 11:35:29.419349585 +0100
@@ -209,7 +209,35 @@ bfd_plugin_open_input (bfd *ibfd, struct
      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)
     {