diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 01987b1d05cd608d7b901eb64b6a30f1054b89e2..64440a4498785e60e45525a54a730a64f1d93655 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,15 @@
+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
diff --git a/bfd/bfdwin.c b/bfd/bfdwin.c
index d3e4ba83d1e23a409197d4a46fc8ac9cf47b4d7c..1450ab0e9690f6df9bbcdeb3bf66263519b0365b 100644
--- a/bfd/bfdwin.c
+++ b/bfd/bfdwin.c
@@ -153,6 +153,8 @@ bfd_get_file_window (bfd *abfd,
 	  abfd = abfd->my_archive;
 	}
       f = bfd_cache_lookup (abfd);
+      if (f == NULL)
+	return FALSE;
       fd = fileno (f);
 
       /* Compute offsets and size for mmap and for the user's data.  */
diff --git a/bfd/cache.c b/bfd/cache.c
index 88d0c984552333300f93f915047e4c0dbde93f0c..13f4a078b373ff0107ec437421f623cb9d42508e 100644
--- a/bfd/cache.c
+++ b/bfd/cache.c
@@ -51,13 +51,19 @@ static bfd_boolean bfd_cache_delete (bfd *);
 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.
@@ -70,6 +76,7 @@ cache_bseek (struct bfd *abfd, file_ptr offset, int whence)
 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
@@ -83,10 +90,14 @@ cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
   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.  */
@@ -96,11 +107,11 @@ cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
       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;
@@ -112,8 +123,12 @@ cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
 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;
@@ -130,7 +145,11 @@ cache_bclose (struct bfd *abfd)
 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;
@@ -139,7 +158,11 @@ cache_bflush (struct bfd *abfd)
 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;
@@ -470,8 +493,8 @@ DESCRIPTION
 	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 *
@@ -504,6 +527,5 @@ bfd_cache_lookup_worker (bfd *abfd)
 
   (*_bfd_error_handler) (_("reopening %B: %s\n"),
 			 orig_bfd, bfd_errmsg (bfd_get_error ()));
-  abort ();
   return NULL;
 }
diff --git a/bfd/hppabsd-core.c b/bfd/hppabsd-core.c
index 2ad27351b8a574fcedab93466a48e102712c0abf..b17acc699fcd925374674e03baa624a03bf8ef26 100644
--- a/bfd/hppabsd-core.c
+++ b/bfd/hppabsd-core.c
@@ -140,6 +140,8 @@ hppabsd_core_core_file_p (abfd)
     FILE *stream = bfd_cache_lookup (abfd);
     struct stat statbuf;
 
+    if (stream == NULL)
+      return NULL;
     if (fstat (fileno (stream), &statbuf) < 0)
       {
 	bfd_set_error (bfd_error_system_call);
diff --git a/bfd/sco5-core.c b/bfd/sco5-core.c
index e9b5159e6b3e4e4617716c687501fddc05aae334..e85c4d3793c7497c6750d5ab1f0b36012b0ba74d 100644
--- a/bfd/sco5-core.c
+++ b/bfd/sco5-core.c
@@ -129,6 +129,8 @@ sco5_core_file_p (abfd)
     FILE *stream = bfd_cache_lookup (abfd);
     struct stat statbuf;
 
+    if (stream == NULL)
+      return NULL;
     if (fstat (fileno (stream), &statbuf) < 0)
       {
 	bfd_set_error (bfd_error_system_call);
diff --git a/bfd/trad-core.c b/bfd/trad-core.c
index defad69f4677e95c55c0aeb38a82f41e0827a25c..c958683344a6d014fb4442a46517968fc51eeb8d 100644
--- a/bfd/trad-core.c
+++ b/bfd/trad-core.c
@@ -112,6 +112,8 @@ trad_unix_core_file_p (abfd)
     FILE *stream = bfd_cache_lookup (abfd);
     struct stat statbuf;
 
+    if (stream == NULL)
+      return 0;
     if (fstat (fileno (stream), &statbuf) < 0)
       {
 	bfd_set_error (bfd_error_system_call);