@section File caching
The file caching mechanism is embedded within BFD and allows
the application to open as many BFDs as it wants without
regard to the underlying operating system's file descriptor
limit (often as low as 20 open files).  The module in
@code{cache.c} maintains a least recently used list of
@code{BFD_CACHE_MAX_OPEN} files, and exports the name
@code{bfd_cache_lookup}, which runs around and makes sure that
the required BFD is open. If not, then it chooses a file to
close, closes it and opens the one wanted, returning its file
handle.

@subsection Caching functions


@findex bfd_cache_init
@subsubsection @code{bfd_cache_init}
@strong{Synopsis}
@example
bfd_boolean bfd_cache_init (bfd *abfd);
@end example
@strong{Description}@*
Add a newly opened BFD to the cache.

@findex bfd_cache_close
@subsubsection @code{bfd_cache_close}
@strong{Synopsis}
@example
bfd_boolean bfd_cache_close (bfd *abfd);
@end example
@strong{Description}@*
Remove the BFD @var{abfd} from the cache. If the attached file is open,
then close it too.

@strong{Returns}@*
@code{FALSE} is returned if closing the file fails, @code{TRUE} is
returned if all is well.

@findex bfd_cache_close_all
@subsubsection @code{bfd_cache_close_all}
@strong{Synopsis}
@example
bfd_boolean bfd_cache_close_all (void);
@end example
@strong{Description}@*
Remove all BFDs from the cache. If the attached file is open,
then close it too.

@strong{Returns}@*
@code{FALSE} is returned if closing one of the file fails, @code{TRUE} is
returned if all is well.

@findex bfd_open_file
@subsubsection @code{bfd_open_file}
@strong{Synopsis}
@example
FILE* bfd_open_file (bfd *abfd);
@end example
@strong{Description}@*
Call the OS to open a file for @var{abfd}.  Return the @code{FILE *}
(possibly @code{NULL}) that results from this operation.  Set up the
BFD so that future accesses know the file is open. If the @code{FILE *}
returned is @code{NULL}, then it won't have been put in the
cache, so it won't have to be removed from it.

