cache.c revision 218822
1/* BFD library -- caching of file descriptors.
2
3   Copyright 1990, 1991, 1992, 1993, 1994, 1996, 2000, 2001, 2002,
4   2003, 2004, 2005, 2007 Free Software Foundation, Inc.
5
6   Hacked by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
7
8This file is part of BFD, the Binary File Descriptor library.
9
10This program is free software; you can redistribute it and/or modify
11it under the terms of the GNU General Public License as published by
12the Free Software Foundation; either version 2 of the License, or
13(at your option) any later version.
14
15This program is distributed in the hope that it will be useful,
16but WITHOUT ANY WARRANTY; without even the implied warranty of
17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18GNU General Public License for more details.
19
20You should have received a copy of the GNU General Public License
21along with this program; if not, write to the Free Software
22Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
23
24/*
25SECTION
26	File caching
27
28	The file caching mechanism is embedded within BFD and allows
29	the application to open as many BFDs as it wants without
30	regard to the underlying operating system's file descriptor
31	limit (often as low as 20 open files).  The module in
32	<<cache.c>> maintains a least recently used list of
33	<<BFD_CACHE_MAX_OPEN>> files, and exports the name
34	<<bfd_cache_lookup>>, which runs around and makes sure that
35	the required BFD is open. If not, then it chooses a file to
36	close, closes it and opens the one wanted, returning its file
37	handle.
38
39SUBSECTION
40	Caching functions
41*/
42
43#include "sysdep.h"
44#include "bfd.h"
45#include "libbfd.h"
46#include "libiberty.h"
47
48/* In some cases we can optimize cache operation when reopening files.
49   For instance, a flush is entirely unnecessary if the file is already
50   closed, so a flush would use CACHE_NO_OPEN.  Similarly, a seek using
51   SEEK_SET or SEEK_END need not first seek to the current position.
52   For stat we ignore seek errors, just in case the file has changed
53   while we weren't looking.  If it has, then it's possible that the
54   file is shorter and we don't want a seek error to prevent us doing
55   the stat.  */
56enum cache_flag {
57  CACHE_NORMAL = 0,
58  CACHE_NO_OPEN = 1,
59  CACHE_NO_SEEK = 2,
60  CACHE_NO_SEEK_ERROR = 4
61};
62
63/* The maximum number of files which the cache will keep open at
64   one time.  */
65
66#define BFD_CACHE_MAX_OPEN 10
67
68/* The number of BFD files we have open.  */
69
70static int open_files;
71
72/* Zero, or a pointer to the topmost BFD on the chain.  This is
73   used by the <<bfd_cache_lookup>> macro in @file{libbfd.h} to
74   determine when it can avoid a function call.  */
75
76static bfd *bfd_last_cache = NULL;
77
78/* Insert a BFD into the cache.  */
79
80static void
81insert (bfd *abfd)
82{
83  if (bfd_last_cache == NULL)
84    {
85      abfd->lru_next = abfd;
86      abfd->lru_prev = abfd;
87    }
88  else
89    {
90      abfd->lru_next = bfd_last_cache;
91      abfd->lru_prev = bfd_last_cache->lru_prev;
92      abfd->lru_prev->lru_next = abfd;
93      abfd->lru_next->lru_prev = abfd;
94    }
95  bfd_last_cache = abfd;
96}
97
98/* Remove a BFD from the cache.  */
99
100static void
101snip (bfd *abfd)
102{
103  abfd->lru_prev->lru_next = abfd->lru_next;
104  abfd->lru_next->lru_prev = abfd->lru_prev;
105  if (abfd == bfd_last_cache)
106    {
107      bfd_last_cache = abfd->lru_next;
108      if (abfd == bfd_last_cache)
109	bfd_last_cache = NULL;
110    }
111}
112
113/* Close a BFD and remove it from the cache.  */
114
115static bfd_boolean
116bfd_cache_delete (bfd *abfd)
117{
118  bfd_boolean ret;
119
120  if (fclose ((FILE *) abfd->iostream) == 0)
121    ret = TRUE;
122  else
123    {
124      ret = FALSE;
125      bfd_set_error (bfd_error_system_call);
126    }
127
128  snip (abfd);
129
130  abfd->iostream = NULL;
131  --open_files;
132
133  return ret;
134}
135
136/* We need to open a new file, and the cache is full.  Find the least
137   recently used cacheable BFD and close it.  */
138
139static bfd_boolean
140close_one (void)
141{
142  register bfd *kill;
143
144  if (bfd_last_cache == NULL)
145    kill = NULL;
146  else
147    {
148      for (kill = bfd_last_cache->lru_prev;
149	   ! kill->cacheable;
150	   kill = kill->lru_prev)
151	{
152	  if (kill == bfd_last_cache)
153	    {
154	      kill = NULL;
155	      break;
156	    }
157	}
158    }
159
160  if (kill == NULL)
161    {
162      /* There are no open cacheable BFD's.  */
163      return TRUE;
164    }
165
166  kill->where = real_ftell ((FILE *) kill->iostream);
167
168  /* Save the file st_mtime.  This is a hack so that gdb can detect when
169     an executable has been deleted and recreated.  The only thing that
170     makes this reasonable is that st_mtime doesn't change when a file
171     is unlinked, so saving st_mtime makes BFD's file cache operation
172     a little more transparent for this particular usage pattern.  If we
173     hadn't closed the file then we would not have lost the original
174     contents, st_mtime etc.  Of course, if something is writing to an
175     existing file, then this is the wrong thing to do.
176     FIXME: gdb should save these times itself on first opening a file,
177     and this hack be removed.  */
178  if (kill->direction == no_direction || kill->direction == read_direction)
179    {
180      bfd_get_mtime (kill);
181      kill->mtime_set = TRUE;
182    }
183
184  return bfd_cache_delete (kill);
185}
186
187/* Check to see if the required BFD is the same as the last one
188   looked up. If so, then it can use the stream in the BFD with
189   impunity, since it can't have changed since the last lookup;
190   otherwise, it has to perform the complicated lookup function.  */
191
192#define bfd_cache_lookup(x, flag) \
193  ((x) == bfd_last_cache			\
194   ? (FILE *) (bfd_last_cache->iostream)	\
195   : bfd_cache_lookup_worker (x, flag))
196
197/* Called when the macro <<bfd_cache_lookup>> fails to find a
198   quick answer.  Find a file descriptor for @var{abfd}.  If
199   necessary, it open it.  If there are already more than
200   <<BFD_CACHE_MAX_OPEN>> files open, it tries to close one first, to
201   avoid running out of file descriptors.  It will return NULL
202   if it is unable to (re)open the @var{abfd}.  */
203
204static FILE *
205bfd_cache_lookup_worker (bfd *abfd, enum cache_flag flag)
206{
207  bfd *orig_bfd = abfd;
208  if ((abfd->flags & BFD_IN_MEMORY) != 0)
209    abort ();
210
211  if (abfd->my_archive)
212    abfd = abfd->my_archive;
213
214  if (abfd->iostream != NULL)
215    {
216      /* Move the file to the start of the cache.  */
217      if (abfd != bfd_last_cache)
218	{
219	  snip (abfd);
220	  insert (abfd);
221	}
222      return (FILE *) abfd->iostream;
223    }
224
225  if (flag & CACHE_NO_OPEN)
226    return NULL;
227
228  if (bfd_open_file (abfd) == NULL)
229    ;
230  else if (!(flag & CACHE_NO_SEEK)
231	   && real_fseek ((FILE *) abfd->iostream, abfd->where, SEEK_SET) != 0
232	   && !(flag & CACHE_NO_SEEK_ERROR))
233    bfd_set_error (bfd_error_system_call);
234  else
235    return (FILE *) abfd->iostream;
236
237  (*_bfd_error_handler) (_("reopening %B: %s\n"),
238			 orig_bfd, bfd_errmsg (bfd_get_error ()));
239  return NULL;
240}
241
242static file_ptr
243cache_btell (struct bfd *abfd)
244{
245  FILE *f = bfd_cache_lookup (abfd, CACHE_NO_OPEN);
246  if (f == NULL)
247    return abfd->where;
248  return real_ftell (f);
249}
250
251static int
252cache_bseek (struct bfd *abfd, file_ptr offset, int whence)
253{
254  FILE *f = bfd_cache_lookup (abfd, whence != SEEK_CUR ? CACHE_NO_SEEK : 0);
255  if (f == NULL)
256    return -1;
257  return real_fseek (f, offset, whence);
258}
259
260/* Note that archive entries don't have streams; they share their parent's.
261   This allows someone to play with the iostream behind BFD's back.
262
263   Also, note that the origin pointer points to the beginning of a file's
264   contents (0 for non-archive elements).  For archive entries this is the
265   first octet in the file, NOT the beginning of the archive header.  */
266
267static file_ptr
268cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
269{
270  FILE *f;
271  file_ptr nread;
272  /* FIXME - this looks like an optimization, but it's really to cover
273     up for a feature of some OSs (not solaris - sigh) that
274     ld/pe-dll.c takes advantage of (apparently) when it creates BFDs
275     internally and tries to link against them.  BFD seems to be smart
276     enough to realize there are no symbol records in the "file" that
277     doesn't exist but attempts to read them anyway.  On Solaris,
278     attempting to read zero bytes from a NULL file results in a core
279     dump, but on other platforms it just returns zero bytes read.
280     This makes it to something reasonable. - DJ */
281  if (nbytes == 0)
282    return 0;
283
284  f = bfd_cache_lookup (abfd, 0);
285  if (f == NULL)
286    return 0;
287
288#if defined (__VAX) && defined (VMS)
289  /* Apparently fread on Vax VMS does not keep the record length
290     information.  */
291  nread = read (fileno (f), buf, nbytes);
292  /* Set bfd_error if we did not read as much data as we expected.  If
293     the read failed due to an error set the bfd_error_system_call,
294     else set bfd_error_file_truncated.  */
295  if (nread == (file_ptr)-1)
296    {
297      bfd_set_error (bfd_error_system_call);
298      return -1;
299    }
300#else
301  nread = fread (buf, 1, nbytes, f);
302  /* Set bfd_error if we did not read as much data as we expected.  If
303     the read failed due to an error set the bfd_error_system_call,
304     else set bfd_error_file_truncated.  */
305  if (nread < nbytes && ferror (f))
306    {
307      bfd_set_error (bfd_error_system_call);
308      return -1;
309    }
310#endif
311  return nread;
312}
313
314static file_ptr
315cache_bwrite (struct bfd *abfd, const void *where, file_ptr nbytes)
316{
317  file_ptr nwrite;
318  FILE *f = bfd_cache_lookup (abfd, 0);
319  if (f == NULL)
320    return 0;
321  nwrite = fwrite (where, 1, nbytes, f);
322  if (nwrite < nbytes && ferror (f))
323    {
324      bfd_set_error (bfd_error_system_call);
325      return -1;
326    }
327  return nwrite;
328}
329
330static int
331cache_bclose (struct bfd *abfd)
332{
333  return bfd_cache_close (abfd);
334}
335
336static int
337cache_bflush (struct bfd *abfd)
338{
339  int sts;
340  FILE *f = bfd_cache_lookup (abfd, CACHE_NO_OPEN);
341  if (f == NULL)
342    return 0;
343  sts = fflush (f);
344  if (sts < 0)
345    bfd_set_error (bfd_error_system_call);
346  return sts;
347}
348
349static int
350cache_bstat (struct bfd *abfd, struct stat *sb)
351{
352  int sts;
353  FILE *f = bfd_cache_lookup (abfd, CACHE_NO_SEEK_ERROR);
354  if (f == NULL)
355    return -1;
356  sts = fstat (fileno (f), sb);
357  if (sts < 0)
358    bfd_set_error (bfd_error_system_call);
359  return sts;
360}
361
362static const struct bfd_iovec cache_iovec = {
363  &cache_bread, &cache_bwrite, &cache_btell, &cache_bseek,
364  &cache_bclose, &cache_bflush, &cache_bstat
365};
366
367/*
368INTERNAL_FUNCTION
369	bfd_cache_init
370
371SYNOPSIS
372	bfd_boolean bfd_cache_init (bfd *abfd);
373
374DESCRIPTION
375	Add a newly opened BFD to the cache.
376*/
377
378bfd_boolean
379bfd_cache_init (bfd *abfd)
380{
381  BFD_ASSERT (abfd->iostream != NULL);
382  if (open_files >= BFD_CACHE_MAX_OPEN)
383    {
384      if (! close_one ())
385	return FALSE;
386    }
387  abfd->iovec = &cache_iovec;
388  insert (abfd);
389  ++open_files;
390  return TRUE;
391}
392
393/*
394INTERNAL_FUNCTION
395	bfd_cache_close
396
397SYNOPSIS
398	bfd_boolean bfd_cache_close (bfd *abfd);
399
400DESCRIPTION
401	Remove the BFD @var{abfd} from the cache. If the attached file is open,
402	then close it too.
403
404RETURNS
405	<<FALSE>> is returned if closing the file fails, <<TRUE>> is
406	returned if all is well.
407*/
408
409bfd_boolean
410bfd_cache_close (bfd *abfd)
411{
412  if (abfd->iovec != &cache_iovec)
413    return TRUE;
414
415  if (abfd->iostream == NULL)
416    /* Previously closed.  */
417    return TRUE;
418
419  return bfd_cache_delete (abfd);
420}
421
422/*
423FUNCTION
424	bfd_cache_close_all
425
426SYNOPSIS
427	bfd_boolean bfd_cache_close_all (void);
428
429DESCRIPTION
430	Remove all BFDs from the cache. If the attached file is open,
431	then close it too.
432
433RETURNS
434	<<FALSE>> is returned if closing one of the file fails, <<TRUE>> is
435	returned if all is well.
436*/
437
438bfd_boolean
439bfd_cache_close_all ()
440{
441  bfd_boolean ret = TRUE;
442
443  while (bfd_last_cache != NULL)
444    ret &= bfd_cache_close (bfd_last_cache);
445
446  return ret;
447}
448
449/*
450INTERNAL_FUNCTION
451	bfd_open_file
452
453SYNOPSIS
454	FILE* bfd_open_file (bfd *abfd);
455
456DESCRIPTION
457	Call the OS to open a file for @var{abfd}.  Return the <<FILE *>>
458	(possibly <<NULL>>) that results from this operation.  Set up the
459	BFD so that future accesses know the file is open. If the <<FILE *>>
460	returned is <<NULL>>, then it won't have been put in the
461	cache, so it won't have to be removed from it.
462*/
463
464FILE *
465bfd_open_file (bfd *abfd)
466{
467  abfd->cacheable = TRUE;	/* Allow it to be closed later.  */
468
469  if (open_files >= BFD_CACHE_MAX_OPEN)
470    {
471      if (! close_one ())
472	return NULL;
473    }
474
475  switch (abfd->direction)
476    {
477    case read_direction:
478    case no_direction:
479      abfd->iostream = (PTR) real_fopen (abfd->filename, FOPEN_RB);
480      break;
481    case both_direction:
482    case write_direction:
483      if (abfd->opened_once)
484	{
485	  abfd->iostream = (PTR) real_fopen (abfd->filename, FOPEN_RUB);
486	  if (abfd->iostream == NULL)
487	    abfd->iostream = (PTR) real_fopen (abfd->filename, FOPEN_WUB);
488	}
489      else
490	{
491	  /* Create the file.
492
493	     Some operating systems won't let us overwrite a running
494	     binary.  For them, we want to unlink the file first.
495
496	     However, gcc 2.95 will create temporary files using
497	     O_EXCL and tight permissions to prevent other users from
498	     substituting other .o files during the compilation.  gcc
499	     will then tell the assembler to use the newly created
500	     file as an output file.  If we unlink the file here, we
501	     open a brief window when another user could still
502	     substitute a file.
503
504	     So we unlink the output file if and only if it has
505	     non-zero size.  */
506#ifndef __MSDOS__
507	  /* Don't do this for MSDOS: it doesn't care about overwriting
508	     a running binary, but if this file is already open by
509	     another BFD, we will be in deep trouble if we delete an
510	     open file.  In fact, objdump does just that if invoked with
511	     the --info option.  */
512	  struct stat s;
513
514	  if (stat (abfd->filename, &s) == 0 && s.st_size != 0)
515	    unlink_if_ordinary (abfd->filename);
516#endif
517	  abfd->iostream = (PTR) real_fopen (abfd->filename, FOPEN_WUB);
518	  abfd->opened_once = TRUE;
519	}
520      break;
521    }
522
523  if (abfd->iostream == NULL)
524    bfd_set_error (bfd_error_system_call);
525  else
526    {
527      if (! bfd_cache_init (abfd))
528	return NULL;
529    }
530
531  return (FILE *) abfd->iostream;
532}
533