1 /* BFD library -- caching of file descriptors. 2 3 Copyright 1990, 1991, 1992, 1993, 1994, 1996, 2000, 2001, 2002, 4 2003, 2004, 2005 Free Software Foundation, Inc. 5 6 Hacked by Steve Chamberlain of Cygnus Support (steve@cygnus.com). 7 8 This file is part of BFD, the Binary File Descriptor library. 9 10 This program is free software; you can redistribute it and/or modify 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 2 of the License, or 13 (at your option) any later version. 14 15 This program is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU General Public License for more details. 19 20 You should have received a copy of the GNU General Public License 21 along with this program; if not, write to the Free Software 22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 23 24 /* 25 SECTION 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 39 SUBSECTION 40 Caching functions 41 */ 42 43 #include "bfd.h" 44 #include "sysdep.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. */ 56 enum 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 70 static 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 76 static bfd *bfd_last_cache = NULL; 77 78 /* Insert a BFD into the cache. */ 79 80 static void 81 insert (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 100 static void 101 snip (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 115 static bfd_boolean 116 bfd_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 139 static bfd_boolean 140 close_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 204 static FILE * 205 bfd_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 242 static file_ptr 243 cache_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 251 static int 252 cache_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 267 static file_ptr 268 cache_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 314 static file_ptr 315 cache_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 330 static int 331 cache_bclose (struct bfd *abfd) 332 { 333 return bfd_cache_close (abfd); 334 } 335 336 static int 337 cache_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 349 static int 350 cache_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 362 static 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 /* 368 INTERNAL_FUNCTION 369 bfd_cache_init 370 371 SYNOPSIS 372 bfd_boolean bfd_cache_init (bfd *abfd); 373 374 DESCRIPTION 375 Add a newly opened BFD to the cache. 376 */ 377 378 bfd_boolean 379 bfd_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 /* 394 INTERNAL_FUNCTION 395 bfd_cache_close 396 397 SYNOPSIS 398 bfd_boolean bfd_cache_close (bfd *abfd); 399 400 DESCRIPTION 401 Remove the BFD @var{abfd} from the cache. If the attached file is open, 402 then close it too. 403 404 RETURNS 405 <<FALSE>> is returned if closing the file fails, <<TRUE>> is 406 returned if all is well. 407 */ 408 409 bfd_boolean 410 bfd_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 /* 423 FUNCTION 424 bfd_cache_close_all 425 426 SYNOPSIS 427 bfd_boolean bfd_cache_close_all (void); 428 429 DESCRIPTION 430 Remove all BFDs from the cache. If the attached file is open, 431 then close it too. 432 433 RETURNS 434 <<FALSE>> is returned if closing one of the file fails, <<TRUE>> is 435 returned if all is well. 436 */ 437 438 bfd_boolean 439 bfd_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 /* 450 INTERNAL_FUNCTION 451 bfd_open_file 452 453 SYNOPSIS 454 FILE* bfd_open_file (bfd *abfd); 455 456 DESCRIPTION 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 464 FILE * 465 bfd_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