Changeset 609 for branches/GNU/src/binutils/bfd/opncls.c
- Timestamp:
- Aug 16, 2003, 6:59:22 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GNU/src/binutils/bfd/opncls.c
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r608 r609 1 1 /* opncls.c -- open and close a BFD. 2 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 3 2001 3 2001, 2002, 2003 4 4 Free Software Foundation, Inc. 5 5 6 6 Written by Cygnus Support. 7 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 modify11 it under the terms of the GNU General Public License as published by12 the Free Software Foundation; either version 2 of the License, or13 (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 of17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the18 GNU General Public License for more details.19 20 You should have received a copy of the GNU General Public License21 along with this program; if not, write to the Free Software22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 23 23 24 24 #include "bfd.h" … … 26 26 #include "objalloc.h" 27 27 #include "libbfd.h" 28 #include "libiberty.h" 28 29 29 30 #ifndef S_IXUSR … … 37 38 #endif 38 39 40 /* Counter used to initialize the bfd identifier. */ 41 42 static unsigned int _bfd_id_counter = 0; 43 39 44 /* fdopen is a loser -- we should use stdio exclusively. Unfortunately 40 45 if we do that we can't use fcntl. */ 41 46 42 /* FIXME: This is no longer used. */43 long _bfd_chunksize = -1;44 45 47 /* Return a new BFD. All BFD's are allocated through this routine. */ 46 48 … … 50 52 bfd *nbfd; 51 53 52 nbfd = (bfd *) bfd_zmalloc ( sizeof (bfd));54 nbfd = (bfd *) bfd_zmalloc ((bfd_size_type) sizeof (bfd)); 53 55 if (nbfd == NULL) 54 56 return NULL; 55 57 58 nbfd->id = _bfd_id_counter++; 59 56 60 nbfd->memory = (PTR) objalloc_create (); 57 61 if (nbfd->memory == NULL) 58 62 { 59 63 bfd_set_error (bfd_error_no_memory); 64 free (nbfd); 60 65 return NULL; 61 66 } … … 66 71 nbfd->iostream = NULL; 67 72 nbfd->where = 0; 73 if (!bfd_hash_table_init_n (&nbfd->section_htab, 74 bfd_section_hash_newfunc, 75 251)) 76 { 77 free (nbfd); 78 return NULL; 79 } 68 80 nbfd->sections = (asection *) NULL; 81 nbfd->section_tail = &nbfd->sections; 69 82 nbfd->format = bfd_unknown; 70 83 nbfd->my_archive = (bfd *) NULL; 71 nbfd->origin = 0; 72 nbfd->opened_once = false;73 nbfd->output_has_begun = false;84 nbfd->origin = 0; 85 nbfd->opened_once = FALSE; 86 nbfd->output_has_begun = FALSE; 74 87 nbfd->section_count = 0; 75 88 nbfd->usrdata = (PTR) NULL; 76 nbfd->cacheable = false;89 nbfd->cacheable = FALSE; 77 90 nbfd->flags = BFD_NO_FLAGS; 78 nbfd->mtime_set = false;91 nbfd->mtime_set = FALSE; 79 92 80 93 return nbfd; … … 90 103 91 104 nbfd = _bfd_new_bfd (); 105 if (nbfd == NULL) 106 return NULL; 92 107 nbfd->xvec = obfd->xvec; 93 108 nbfd->my_archive = obfd; … … 97 112 } 98 113 114 /* Delete a BFD. */ 115 116 void 117 _bfd_delete_bfd (abfd) 118 bfd *abfd; 119 { 120 bfd_hash_table_free (&abfd->section_htab); 121 objalloc_free ((struct objalloc *) abfd->memory); 122 free (abfd); 123 } 124 99 125 /* 100 126 SECTION … … 108 134 109 135 SYNOPSIS 110 bfd *bfd_openr(CONST char *filename, CONSTchar *target);136 bfd *bfd_openr(const char *filename, const char *target); 111 137 112 138 DESCRIPTION … … 118 144 119 145 If <<NULL>> is returned then an error has occured. Possible errors 120 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or <<system_call>> error. 146 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or 147 <<system_call>> error. 121 148 */ 122 149 123 150 bfd * 124 151 bfd_openr (filename, target) 125 CONSTchar *filename;126 CONSTchar *target;152 const char *filename; 153 const char *target; 127 154 { 128 155 bfd *nbfd; … … 136 163 if (target_vec == NULL) 137 164 { 138 objalloc_free ((struct objalloc *) nbfd->memory); 139 free (nbfd); 140 bfd_set_error (bfd_error_invalid_target); 165 _bfd_delete_bfd (nbfd); 141 166 return NULL; 142 167 } … … 147 172 if (bfd_open_file (nbfd) == NULL) 148 173 { 149 /* File didn't exist, or some such */174 /* File didn't exist, or some such. */ 150 175 bfd_set_error (bfd_error_system_call); 151 objalloc_free ((struct objalloc *) nbfd->memory); 152 free (nbfd); 176 _bfd_delete_bfd (nbfd); 153 177 return NULL; 154 178 } … … 163 187 o - We open the file stream last, since we don't want to have to 164 188 close it if anything goes wrong. Closing the stream means closing 165 the file descriptor too, even though we didn't open it. 166 */ 189 the file descriptor too, even though we didn't open it. */ 167 190 /* 168 191 FUNCTION 169 170 171 SYNOPSIS 172 bfd *bfd_fdopenr(CONST char *filename, CONSTchar *target, int fd);173 174 DESCRIPTION 175 <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to <<fopen>>. 176 It opens a BFD on a file already described by the @var{fd}177 supplied.178 179 When the file is later <<bfd_close>>d, the file descriptor will be closed.180 181 If the caller desires that this file descriptor be cached by BFD182 (opened as needed, closed as needed to free descriptors for183 other opens), with the supplied @var{fd} used as an initial184 file descriptor (but subject to closure at any time), call185 bfd_set_cacheable(bfd, 1) on the returned BFD. The default is to186 assume no cacheing; the file descriptor will remain open until187 <<bfd_close>>, and will not be affected by BFD operations on other188 files. 189 190 Possible errors are <<bfd_error_no_memory>>,<<bfd_error_invalid_target>> and <<bfd_error_system_call>>.192 bfd_fdopenr 193 194 SYNOPSIS 195 bfd *bfd_fdopenr(const char *filename, const char *target, int fd); 196 197 DESCRIPTION 198 <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to 199 <<fopen>>. It opens a BFD on a file already described by the 200 @var{fd} supplied. 201 202 When the file is later <<bfd_close>>d, the file descriptor will 203 be closed. If the caller desires that this file descriptor be 204 cached by BFD (opened as needed, closed as needed to free 205 descriptors for other opens), with the supplied @var{fd} used as 206 an initial file descriptor (but subject to closure at any time), 207 call bfd_set_cacheable(bfd, 1) on the returned BFD. The default 208 is to assume no cacheing; the file descriptor will remain open 209 until <<bfd_close>>, and will not be affected by BFD operations 210 on other files. 211 212 Possible errors are <<bfd_error_no_memory>>, 213 <<bfd_error_invalid_target>> and <<bfd_error_system_call>>. 191 214 */ 192 215 193 216 bfd * 194 217 bfd_fdopenr (filename, target, fd) 195 CONSTchar *filename;196 CONSTchar *target;218 const char *filename; 219 const char *target; 197 220 int fd; 198 221 { … … 203 226 bfd_set_error (bfd_error_system_call); 204 227 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL) 205 fdflags = O_RDWR; /* Assume full access */228 fdflags = O_RDWR; /* Assume full access. */ 206 229 #else 207 230 fdflags = fcntl (fd, F_GETFL, NULL); 208 231 #endif 209 if (fdflags == -1) return NULL; 232 if (fdflags == -1) 233 return NULL; 210 234 211 235 nbfd = _bfd_new_bfd (); … … 216 240 if (target_vec == NULL) 217 241 { 218 bfd_set_error (bfd_error_invalid_target); 219 objalloc_free ((struct objalloc *) nbfd->memory); 220 free (nbfd); 242 _bfd_delete_bfd (nbfd); 221 243 return NULL; 222 244 } … … 225 247 nbfd->iostream = (PTR) fopen (filename, FOPEN_RB); 226 248 #else 227 /* (O_ACCMODE) parens are to avoid Ultrix header file bug */249 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */ 228 250 switch (fdflags & (O_ACCMODE)) 229 251 { … … 237 259 if (nbfd->iostream == NULL) 238 260 { 239 objalloc_free ((struct objalloc *) nbfd->memory); 240 free (nbfd); 241 return NULL; 242 } 243 244 /* OK, put everything where it belongs */ 245 261 _bfd_delete_bfd (nbfd); 262 return NULL; 263 } 264 265 /* OK, put everything where it belongs. */ 246 266 nbfd->filename = filename; 247 267 … … 249 269 be written through, although doing so requires that we end 250 270 the previous clause with a preposition. */ 251 /* (O_ACCMODE) parens are to avoid Ultrix header file bug */271 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */ 252 272 switch (fdflags & (O_ACCMODE)) 253 273 { … … 260 280 if (! bfd_cache_init (nbfd)) 261 281 { 262 objalloc_free ((struct objalloc *) nbfd->memory); 263 free (nbfd); 264 return NULL; 265 } 266 nbfd->opened_once = true; 282 _bfd_delete_bfd (nbfd); 283 return NULL; 284 } 285 nbfd->opened_once = TRUE; 267 286 268 287 return nbfd; … … 299 318 if (target_vec == NULL) 300 319 { 301 bfd_set_error (bfd_error_invalid_target); 302 objalloc_free ((struct objalloc *) nbfd->memory); 303 free (nbfd); 320 _bfd_delete_bfd (nbfd); 304 321 return NULL; 305 322 } … … 308 325 nbfd->filename = filename; 309 326 nbfd->direction = read_direction; 310 327 311 328 if (! bfd_cache_init (nbfd)) 312 329 { 313 objalloc_free ((struct objalloc *) nbfd->memory); 314 free (nbfd); 330 _bfd_delete_bfd (nbfd); 315 331 return NULL; 316 332 } … … 320 336 321 337 322 /* *bfd_openw -- open for writing.323 Returns a pointer to a freshly-allocated BFD on success, or NULL.324 325 See comment by bfd_fdopenr before you try to modify this function.*/338 /* bfd_openw -- open for writing. 339 Returns a pointer to a freshly-allocated BFD on success, or NULL. 340 341 See comment by bfd_fdopenr before you try to modify this function. */ 326 342 327 343 /* … … 330 346 331 347 SYNOPSIS 332 bfd *bfd_openw( CONST char *filename, CONSTchar *target);348 bfd *bfd_openw(const char *filename, const char *target); 333 349 334 350 DESCRIPTION … … 342 358 bfd * 343 359 bfd_openw (filename, target) 344 CONSTchar *filename;345 CONSTchar *target;360 const char *filename; 361 const char *target; 346 362 { 347 363 bfd *nbfd; 348 364 const bfd_target *target_vec; 349 365 350 bfd_set_error (bfd_error_system_call);351 352 366 /* nbfd has to point to head of malloc'ed block so that bfd_close may 353 reclaim it correctly. */ 354 367 reclaim it correctly. */ 355 368 nbfd = _bfd_new_bfd (); 356 369 if (nbfd == NULL) … … 360 373 if (target_vec == NULL) 361 374 { 362 objalloc_free ((struct objalloc *) nbfd->memory); 363 free (nbfd); 375 _bfd_delete_bfd (nbfd); 364 376 return NULL; 365 377 } … … 370 382 if (bfd_open_file (nbfd) == NULL) 371 383 { 372 bfd_set_error (bfd_error_system_call); /* File not writeable, etc*/373 objalloc_free ((struct objalloc *) nbfd->memory);374 free(nbfd);384 /* File not writeable, etc. */ 385 bfd_set_error (bfd_error_system_call); 386 _bfd_delete_bfd (nbfd); 375 387 return NULL; 376 388 } … … 385 397 386 398 SYNOPSIS 387 b oolean bfd_close(bfd *abfd);388 389 DESCRIPTION 390 391 Close a BFD. If the BFD was open for writing, 392 then pending operations are completed and the file written out393 and closed. If the created file is executable, then394 <<chmod>> is calledto mark it as such.399 bfd_boolean bfd_close (bfd *abfd); 400 401 DESCRIPTION 402 403 Close a BFD. If the BFD was open for writing, then pending 404 operations are completed and the file written out and closed. 405 If the created file is executable, then <<chmod>> is called 406 to mark it as such. 395 407 396 408 All memory attached to the BFD is released. … … 400 412 401 413 RETURNS 402 << true>> is returned if all is ok, otherwise <<false>>.403 */ 404 405 406 b oolean414 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>. 415 */ 416 417 418 bfd_boolean 407 419 bfd_close (abfd) 408 420 bfd *abfd; 409 421 { 410 b oolean ret;411 412 if ( !bfd_read_p (abfd))422 bfd_boolean ret; 423 424 if (bfd_write_p (abfd)) 413 425 { 414 426 if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd))) 415 return false;427 return FALSE; 416 428 } 417 429 418 430 if (! BFD_SEND (abfd, _close_and_cleanup, (abfd))) 419 return false;431 return FALSE; 420 432 421 433 ret = bfd_cache_close (abfd); 422 434 423 435 /* If the file was open for writing and is now executable, 424 make it so */436 make it so. */ 425 437 if (ret 426 438 && abfd->direction == write_direction … … 431 443 if (stat (abfd->filename, &buf) == 0) 432 444 { 433 int mask = umask (0); 445 unsigned int mask = umask (0); 446 434 447 umask (mask); 435 448 chmod (abfd->filename, … … 439 452 } 440 453 441 objalloc_free ((struct objalloc *) abfd->memory); 442 free (abfd); 454 _bfd_delete_bfd (abfd); 443 455 444 456 return ret; … … 450 462 451 463 SYNOPSIS 452 b oolean bfd_close_all_done(bfd *);453 454 DESCRIPTION 455 Close a BFD. Differs from <<bfd_close>> 456 since it does not complete any pending operations. This457 routine would be used if the application had just used BFD for458 swapping and didn'twant to use any of the writing code.464 bfd_boolean bfd_close_all_done (bfd *); 465 466 DESCRIPTION 467 Close a BFD. Differs from <<bfd_close>> since it does not 468 complete any pending operations. This routine would be used 469 if the application had just used BFD for swapping and didn't 470 want to use any of the writing code. 459 471 460 472 If the created file is executable, then <<chmod>> is called … … 464 476 465 477 RETURNS 466 <<true>> is returned if all is ok, otherwise <<false>>. 467 468 */ 469 470 boolean 478 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>. 479 */ 480 481 bfd_boolean 471 482 bfd_close_all_done (abfd) 472 483 bfd *abfd; 473 484 { 474 b oolean ret;485 bfd_boolean ret; 475 486 476 487 ret = bfd_cache_close (abfd); 477 488 478 489 /* If the file was open for writing and is now executable, 479 make it so */490 make it so. */ 480 491 if (ret 481 492 && abfd->direction == write_direction … … 486 497 if (stat (abfd->filename, &buf) == 0) 487 498 { 488 int mask = umask (0); 499 unsigned int mask = umask (0); 500 489 501 umask (mask); 490 502 chmod (abfd->filename, … … 494 506 } 495 507 496 objalloc_free ((struct objalloc *) abfd->memory); 497 free (abfd); 508 _bfd_delete_bfd (abfd); 498 509 499 510 return ret; … … 505 516 506 517 SYNOPSIS 507 bfd *bfd_create(CONST char *filename, bfd *templ); 508 509 DESCRIPTION 510 Create a new BFD in the manner of 511 <<bfd_openw>>, but without opening a file. The new BFD 512 takes the target from the target used by @var{template}. The 513 format is always set to <<bfd_object>>. 514 518 bfd *bfd_create(const char *filename, bfd *templ); 519 520 DESCRIPTION 521 Create a new BFD in the manner of <<bfd_openw>>, but without 522 opening a file. The new BFD takes the target from the target 523 used by @var{template}. The format is always set to <<bfd_object>>. 515 524 */ 516 525 517 526 bfd * 518 527 bfd_create (filename, templ) 519 CONSTchar *filename;528 const char *filename; 520 529 bfd *templ; 521 530 { … … 530 539 nbfd->direction = no_direction; 531 540 bfd_set_format (nbfd, bfd_object); 541 532 542 return nbfd; 533 543 } … … 538 548 539 549 SYNOPSIS 540 b oolean bfd_make_writable(bfd *abfd);550 bfd_boolean bfd_make_writable (bfd *abfd); 541 551 542 552 DESCRIPTION … … 547 557 548 558 RETURNS 549 << true>> is returned if all is ok, otherwise <<false>>.550 */ 551 552 b oolean559 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>. 560 */ 561 562 bfd_boolean 553 563 bfd_make_writable(abfd) 554 564 bfd *abfd; … … 559 569 { 560 570 bfd_set_error (bfd_error_invalid_operation); 561 return false; 562 } 563 564 bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory)); 571 return FALSE; 572 } 573 574 bim = ((struct bfd_in_memory *) 575 bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory))); 565 576 abfd->iostream = (PTR) bim; 566 /* bfd_ write will grow these as needed*/577 /* bfd_bwrite will grow these as needed. */ 567 578 bim->size = 0; 568 579 bim->buffer = 0; … … 572 583 abfd->where = 0; 573 584 574 return true;585 return TRUE; 575 586 } 576 587 … … 580 591 581 592 SYNOPSIS 582 b oolean bfd_make_readable(bfd *abfd);593 bfd_boolean bfd_make_readable (bfd *abfd); 583 594 584 595 DESCRIPTION … … 590 601 591 602 RETURNS 592 << true>> is returned if all is ok, otherwise <<false>>. */593 594 b oolean603 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>. */ 604 605 bfd_boolean 595 606 bfd_make_readable(abfd) 596 607 bfd *abfd; … … 599 610 { 600 611 bfd_set_error (bfd_error_invalid_operation); 601 return false;612 return FALSE; 602 613 } 603 614 604 615 if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd))) 605 return false;616 return FALSE; 606 617 607 618 if (! BFD_SEND (abfd, _close_and_cleanup, (abfd))) 608 return false;619 return FALSE; 609 620 610 621 … … 612 623 613 624 abfd->where = 0; 614 abfd->sections = (asection *) NULL;615 625 abfd->format = bfd_unknown; 616 626 abfd->my_archive = (bfd *) NULL; 617 abfd->origin = 0; 618 abfd->opened_once = false;619 abfd->output_has_begun = false;627 abfd->origin = 0; 628 abfd->opened_once = FALSE; 629 abfd->output_has_begun = FALSE; 620 630 abfd->section_count = 0; 621 631 abfd->usrdata = (PTR) NULL; 622 abfd->cacheable = false;632 abfd->cacheable = FALSE; 623 633 abfd->flags = BFD_IN_MEMORY; 624 abfd->mtime_set = false;625 626 abfd->target_defaulted = true;634 abfd->mtime_set = FALSE; 635 636 abfd->target_defaulted = TRUE; 627 637 abfd->direction = read_direction; 628 638 abfd->sections = 0; … … 631 641 abfd->tdata.any = 0; 632 642 633 bfd_check_format(abfd, bfd_object); 634 635 return true; 643 bfd_section_list_clear (abfd); 644 bfd_check_format (abfd, bfd_object); 645 646 return TRUE; 636 647 } 637 648 … … 652 663 bfd_alloc (abfd, size) 653 664 bfd *abfd; 654 size_tsize;665 bfd_size_type size; 655 666 { 656 667 PTR ret; 668 669 if (size != (unsigned long) size) 670 { 671 bfd_set_error (bfd_error_no_memory); 672 return NULL; 673 } 657 674 658 675 ret = objalloc_alloc (abfd->memory, (unsigned long) size); … … 665 682 bfd_zalloc (abfd, size) 666 683 bfd *abfd; 667 size_tsize;684 bfd_size_type size; 668 685 { 669 686 PTR res; … … 671 688 res = bfd_alloc (abfd, size); 672 689 if (res) 673 memset (res, 0, size);690 memset (res, 0, (size_t) size); 674 691 return res; 675 692 } 676 693 677 /* Free a block allocated for a BFD. */ 694 /* Free a block allocated for a BFD. 695 Note: Also frees all more recently allocated blocks! */ 678 696 679 697 void … … 684 702 objalloc_free_block ((struct objalloc *) abfd->memory, block); 685 703 } 704 705 706 /* 707 GNU Extension: separate debug-info files 708 709 The idea here is that a special section called .gnu_debuglink might be 710 embedded in a binary file, which indicates that some *other* file 711 contains the real debugging information. This special section contains a 712 filename and CRC32 checksum, which we read and resolve to another file, 713 if it exists. 714 715 This facilitates "optional" provision of debugging information, without 716 having to provide two complete copies of every binary object (with and 717 without debug symbols). 718 */ 719 720 static unsigned long calc_crc32 PARAMS ((unsigned long, const unsigned char *, size_t)); 721 static char * get_debug_link_info PARAMS ((bfd *, unsigned long *)); 722 static bfd_boolean separate_debug_file_exists PARAMS ((const char *, const unsigned long)); 723 static char * find_separate_debug_file PARAMS ((bfd *, const char *)); 724 725 /* 726 INTERNAL_FUNCTION 727 calc_crc32 728 729 SYNOPSIS 730 unsigned long calc_crc32 (unsigned long crc, const unsigned char *buf, size_t len); 731 732 DESCRIPTION 733 Advance the CRC32 given by @var{crc} through @var{len} 734 bytes of @var{buf}. Return the updated CRC32 value. 735 */ 736 737 static unsigned long 738 calc_crc32 (crc, buf, len) 739 unsigned long crc; 740 const unsigned char *buf; 741 size_t len; 742 { 743 static const unsigned long crc32_table[256] = 744 { 745 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 746 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 747 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 748 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 749 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 750 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 751 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 752 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 753 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 754 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 755 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 756 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 757 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 758 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 759 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 760 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 761 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 762 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 763 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 764 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 765 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 766 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 767 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 768 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 769 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 770 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 771 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 772 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 773 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 774 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 775 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 776 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 777 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 778 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 779 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 780 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 781 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 782 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 783 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 784 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 785 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 786 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 787 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 788 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 789 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 790 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 791 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 792 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 793 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 794 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 795 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 796 0x2d02ef8d 797 }; 798 const unsigned char *end; 799 800 crc = ~crc & 0xffffffff; 801 for (end = buf + len; buf < end; ++ buf) 802 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8); 803 return ~crc & 0xffffffff;; 804 } 805 806 807 /* 808 INTERNAL_FUNCTION 809 get_debug_link_info 810 811 SYNOPSIS 812 char *get_debug_link_info (bfd *abfd, unsigned long *crc32_out) 813 814 DESCRIPTION 815 fetch the filename and CRC32 value for any separate debuginfo 816 associated with @var{abfd}. Return NULL if no such info found, 817 otherwise return filename and update @var{crc32_out}. 818 */ 819 820 static char * 821 get_debug_link_info (abfd, crc32_out) 822 bfd *abfd; 823 unsigned long *crc32_out; 824 { 825 asection * sect; 826 bfd_size_type debuglink_size; 827 unsigned long crc32; 828 char * contents; 829 int crc_offset; 830 bfd_boolean ret; 831 832 BFD_ASSERT (abfd); 833 BFD_ASSERT (crc32_out); 834 835 sect = bfd_get_section_by_name (abfd, ".gnu_debuglink"); 836 837 if (sect == NULL) 838 return NULL; 839 840 debuglink_size = bfd_section_size (abfd, sect); 841 842 contents = xmalloc (debuglink_size); 843 ret = bfd_get_section_contents (abfd, sect, contents, 844 (file_ptr)0, debuglink_size); 845 if (! ret) 846 { 847 free (contents); 848 return NULL; 849 } 850 851 /* Crc value is stored after the filename, aligned up to 4 bytes. */ 852 crc_offset = strlen (contents) + 1; 853 crc_offset = (crc_offset + 3) & ~3; 854 855 crc32 = bfd_get_32 (abfd, (bfd_byte *) (contents + crc_offset)); 856 857 *crc32_out = crc32; 858 return contents; 859 } 860 861 /* 862 INTERNAL_FUNCTION 863 separate_debug_file_exists 864 865 SYNOPSIS 866 bfd_boolean separate_debug_file_exists (char * name, unsigned long crc32) 867 868 DESCRIPTION 869 Checks to see if @var{name} is a file and if its contents 870 match @var{crc32}. 871 */ 872 873 static bfd_boolean 874 separate_debug_file_exists (name, crc) 875 const char *name; 876 const unsigned long crc; 877 { 878 static char buffer [8 * 1024]; 879 unsigned long file_crc = 0; 880 int fd; 881 int count; 882 883 BFD_ASSERT (name); 884 885 fd = open (name, O_RDONLY); 886 if (fd < 0) 887 return FALSE; 888 889 while ((count = read (fd, buffer, sizeof (buffer))) > 0) 890 file_crc = calc_crc32 (file_crc, buffer, count); 891 892 close (fd); 893 894 return crc == file_crc; 895 } 896 897 898 /* 899 INTERNAL_FUNCTION 900 find_separate_debug_file 901 902 SYNOPSIS 903 char * find_separate_debug_file (bfd *abfd) 904 905 DESCRIPTION 906 Searches @var{abfd} for a reference to separate debugging 907 information, scans various locations in the filesystem, including 908 the file tree rooted at @var{debug_file_directory}, and returns a 909 filename of such debugging information if the file is found and has 910 matching CRC32. Returns NULL if no reference to debugging file 911 exists, or file cannot be found. 912 */ 913 914 static char * 915 find_separate_debug_file (abfd, debug_file_directory) 916 bfd *abfd; 917 const char *debug_file_directory; 918 { 919 char *basename; 920 char *dir; 921 char *debugfile; 922 unsigned long crc32; 923 int i; 924 925 BFD_ASSERT (abfd); 926 if (debug_file_directory == NULL) 927 debug_file_directory = "."; 928 929 /* BFD may have been opened from a stream. */ 930 if (! abfd->filename) 931 return NULL; 932 933 basename = get_debug_link_info (abfd, & crc32); 934 935 if (basename == NULL) 936 return NULL; 937 if (strlen (basename) < 1) 938 { 939 free (basename); 940 return NULL; 941 } 942 943 dir = xstrdup (abfd->filename); 944 BFD_ASSERT (strlen (dir) != 0); 945 946 /* Strip off filename part. */ 947 for (i = strlen (dir) - 1; i >= 0; i--) 948 if (IS_DIR_SEPARATOR (dir[i])) 949 break; 950 951 dir[i + 1] = '\0'; 952 BFD_ASSERT (dir[i] == '/' || dir[0] == '\0') 953 954 debugfile = xmalloc (strlen (debug_file_directory) + 1 955 + strlen (dir) 956 + strlen (".debug/") 957 + strlen (basename) 958 + 1); 959 960 /* First try in the same directory as the original file: */ 961 strcpy (debugfile, dir); 962 strcat (debugfile, basename); 963 964 if (separate_debug_file_exists (debugfile, crc32)) 965 { 966 free (basename); 967 free (dir); 968 return debugfile; 969 } 970 971 /* Then try in a subdirectory called .debug. */ 972 strcpy (debugfile, dir); 973 strcat (debugfile, ".debug/"); 974 strcat (debugfile, basename); 975 976 if (separate_debug_file_exists (debugfile, crc32)) 977 { 978 free (basename); 979 free (dir); 980 return debugfile; 981 } 982 983 /* Then try in the global debugfile directory. */ 984 strcpy (debugfile, debug_file_directory); 985 i = strlen (debug_file_directory) - 1; 986 if (i > 0 987 && debug_file_directory[i] != '/' 988 && dir[0] != '/') 989 strcat (debugfile, "/"); 990 strcat (debugfile, dir); 991 strcat (debugfile, basename); 992 993 if (separate_debug_file_exists (debugfile, crc32)) 994 { 995 free (basename); 996 free (dir); 997 return debugfile; 998 } 999 1000 free (debugfile); 1001 free (basename); 1002 free (dir); 1003 return NULL; 1004 } 1005 1006 1007 /* 1008 FUNCTION 1009 bfd_follow_gnu_debuglink 1010 1011 SYNOPSIS 1012 char * bfd_follow_gnu_debuglink(bfd *abfd, const char *dir); 1013 1014 DESCRIPTION 1015 1016 Takes a BFD and searches it for a .gnu_debuglink section. If this 1017 section is found, examines the section for the name and checksum of 1018 a '.debug' file containing auxiliary debugging 1019 information. Searches filesystem for .debug file in some standard 1020 locations, including the directory tree rooted at @var{dir}, and if 1021 found returns the full filename. If @var{dir} is NULL, will search 1022 default path configured into libbfd at build time. 1023 1024 RETURNS 1025 <<NULL>> on any errors or failure to locate the .debug file, 1026 otherwise a pointer to a heap-allocated string containing the 1027 filename. The caller is responsible for freeing this string. 1028 */ 1029 1030 char * 1031 bfd_follow_gnu_debuglink (abfd, dir) 1032 bfd *abfd; 1033 const char * dir; 1034 { 1035 #if 0 /* Disabled until DEBUGDIR can be defined by configure.in */ 1036 if (dir == NULL) 1037 dir = DEBUGDIR; 1038 #endif 1039 return find_separate_debug_file (abfd, dir); 1040 } -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.