]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix a problem with the maximum number of open files held in the cache when running...
authorStefan Teleman <stefan.teleman@oracle.com>
Fri, 20 Nov 2015 15:28:40 +0000 (15:28 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 10 Dec 2015 13:48:48 +0000 (00:18 +1030)
PR ld/19260
* cache.c (bfd_cache_max_open): Avoid using getrlimit on 32-bit
Solaris as the result is unreliable.

bfd/ChangeLog
bfd/cache.c

index 80a5b2def8df17d8b6cb7f69430aa6c2d5d4941b..3194cc32f32e18e8825c94890e9fbb9533712ee2 100644 (file)
@@ -1,6 +1,11 @@
 2015-12-10  Alan Modra  <amodra@gmail.com>
 
        Apply from master.
+       2015-11-20  Stefan Teleman  <stefan.teleman@oracle.com>
+       PR ld/19260
+       * cache.c (bfd_cache_max_open): Avoid using getrlimit on 32-bit
+       Solaris as the result is unreliable.
+
        2015-11-18  Alan Modra  <amodra@gmail.com>
        PR 19256
        * archive.c (bfd_generic_openr_next_archived_file): Don't allow
index 94a82daff0004da5fa0533a8a714cbc25904a250..8c9a238ab02efe2a9eef7d24550a5211b1cc7db1 100644 (file)
@@ -78,18 +78,36 @@ bfd_cache_max_open (void)
   if (max_open_files == 0)
     {
       int max;
+#if defined(__sun) && !defined(__sparcv9) && !defined(__x86_64__)
+      /* PR ld/19260: 32-bit Solaris has very inelegant handling of the 255
+        file descriptor limit.  The problem is that setrlimit(2) can raise
+        RLIMIT_NOFILE to a value that is not supported by libc, resulting
+         in "Too many open files" errors.  This can happen here even though
+        max_open_files is set to rlim.rlim_cur / 8.  For example, if
+        a parent process has set rlim.rlim_cur to 65536, then max_open_files
+        will be computed as 8192.
+
+        This check essentially reverts to the behavior from binutils 2.23.1
+         for 32-bit Solaris only.  (It is hoped that the 32-bit libc
+        limitation will be removed soon).  64-bit Solaris libc does not have
+        this limitation.  */
+      max = 16;
+#else
 #ifdef HAVE_GETRLIMIT
       struct rlimit rlim;
+
       if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
          && rlim.rlim_cur != (rlim_t) RLIM_INFINITY)
        max = rlim.rlim_cur / 8;
       else
-#endif /* HAVE_GETRLIMIT */
+#endif
 #ifdef _SC_OPEN_MAX
        max = sysconf (_SC_OPEN_MAX) / 8;
 #else
-       max = 10;
-#endif /* _SC_OPEN_MAX */
+        max = 10;
+#endif
+#endif /* not 32-bit Solaris */
+
       max_open_files = max < 10 ? 10 : max;
     }