+2005-10-26  Alan Modra  <amodra@bigpond.net.au>
+
+       * cache.c (bfd_cache_lookup_worker): Don't abort on failing to
+       reopen file.
+       (cache_btell, cache_bseek, cache_bflush, cache_bstat): Return -1 on
+       bfd_cache_lookup failure.
+       (cache_bread, cache_bwrite): Return 0 on the same.
+       * bfdwin.c (bfd_get_file_window): Likewise.
+       * hppabsd-core.c (hppabsd_core_core_file_p): Likewise.
+       * sco5-core.c (sco5_core_file_p): Likewise.
+       * trad-core.c (trad_unix_core_file_p): Likewise.
+
 2005-10-26  Alan Modra  <amodra@bigpond.net.au>
 
        * cache.c (bfd_cache_lookup_worker): Use bfd_error_handler
 
 static file_ptr
 cache_btell (struct bfd *abfd)
 {
-  return real_ftell (bfd_cache_lookup (abfd));
+  FILE *f = bfd_cache_lookup (abfd);
+  if (f == NULL)
+    return -1;
+  return real_ftell (f);
 }
 
 static int
 cache_bseek (struct bfd *abfd, file_ptr offset, int whence)
 {
-  return real_fseek (bfd_cache_lookup (abfd), offset, whence);
+  FILE *f = bfd_cache_lookup (abfd);
+  if (f == NULL)
+    return -1;
+  return real_fseek (f, offset, whence);
 }
 
 /* Note that archive entries don't have streams; they share their parent's.
 static file_ptr
 cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
 {
+  FILE *f;
   file_ptr nread;
   /* FIXME - this looks like an optimization, but it's really to cover
      up for a feature of some OSs (not solaris - sigh) that
   if (nbytes == 0)
     return 0;
 
+  f = bfd_cache_lookup (abfd);
+  if (f == NULL)
+    return 0;
+
 #if defined (__VAX) && defined (VMS)
   /* Apparently fread on Vax VMS does not keep the record length
      information.  */
-  nread = read (fileno (bfd_cache_lookup (abfd)), buf, nbytes);
+  nread = read (fileno (f), buf, nbytes);
   /* Set bfd_error if we did not read as much data as we expected.  If
      the read failed due to an error set the bfd_error_system_call,
      else set bfd_error_file_truncated.  */
       return -1;
     }
 #else
-  nread = fread (buf, 1, nbytes, bfd_cache_lookup (abfd));
+  nread = fread (buf, 1, nbytes, f);
   /* Set bfd_error if we did not read as much data as we expected.  If
      the read failed due to an error set the bfd_error_system_call,
      else set bfd_error_file_truncated.  */
-  if (nread < nbytes && ferror (bfd_cache_lookup (abfd)))
+  if (nread < nbytes && ferror (f))
     {
       bfd_set_error (bfd_error_system_call);
       return -1;
 static file_ptr
 cache_bwrite (struct bfd *abfd, const void *where, file_ptr nbytes)
 {
-  file_ptr nwrite = fwrite (where, 1, nbytes, bfd_cache_lookup (abfd));
-  if (nwrite < nbytes && ferror (bfd_cache_lookup (abfd)))
+  file_ptr nwrite;
+  FILE *f = bfd_cache_lookup (abfd);
+  if (f == NULL)
+    return 0;
+  nwrite = fwrite (where, 1, nbytes, f);
+  if (nwrite < nbytes && ferror (f))
     {
       bfd_set_error (bfd_error_system_call);
       return -1;
 static int
 cache_bflush (struct bfd *abfd)
 {
-  int sts = fflush (bfd_cache_lookup (abfd));
+  int sts;
+  FILE *f = bfd_cache_lookup (abfd);
+  if (f == NULL)
+    return -1;
+  sts = fflush (f);
   if (sts < 0)
     bfd_set_error (bfd_error_system_call);
   return sts;
 static int
 cache_bstat (struct bfd *abfd, struct stat *sb)
 {
-  int sts = fstat (fileno (bfd_cache_lookup (abfd)), sb);
+  int sts;
+  FILE *f = bfd_cache_lookup (abfd);
+  if (f == NULL)
+    return -1;
+  sts = fstat (fileno (f), sb);
   if (sts < 0)
     bfd_set_error (bfd_error_system_call);
   return sts;
        quick answer.  Find a file descriptor for @var{abfd}.  If
        necessary, it open it.  If there are already more than
        <<BFD_CACHE_MAX_OPEN>> files open, it tries to close one first, to
-       avoid running out of file descriptors.  It will abort rather than
-       returning NULL if it is unable to (re)open the @var{abfd}.
+       avoid running out of file descriptors.  It will return NULL
+       if it is unable to (re)open the @var{abfd}.
 */
 
 FILE *
 
   (*_bfd_error_handler) (_("reopening %B: %s\n"),
                         orig_bfd, bfd_errmsg (bfd_get_error ()));
-  abort ();
   return NULL;
 }