1 /* BFD back-end for archive files (libraries). 2 Copyright (C) 1990-2014 Free Software Foundation, Inc. 3 Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault. 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 20 21 /* 22 @setfilename archive-info 23 SECTION 24 Archives 25 26 DESCRIPTION 27 An archive (or library) is just another BFD. It has a symbol 28 table, although there's not much a user program will do with it. 29 30 The big difference between an archive BFD and an ordinary BFD 31 is that the archive doesn't have sections. Instead it has a 32 chain of BFDs that are considered its contents. These BFDs can 33 be manipulated like any other. The BFDs contained in an 34 archive opened for reading will all be opened for reading. You 35 may put either input or output BFDs into an archive opened for 36 output; they will be handled correctly when the archive is closed. 37 38 Use <<bfd_openr_next_archived_file>> to step through 39 the contents of an archive opened for input. You don't 40 have to read the entire archive if you don't want 41 to! Read it until you find what you want. 42 43 A BFD returned by <<bfd_openr_next_archived_file>> can be 44 closed manually with <<bfd_close>>. If you do not close it, 45 then a second iteration through the members of an archive may 46 return the same BFD. If you close the archive BFD, then all 47 the member BFDs will automatically be closed as well. 48 49 Archive contents of output BFDs are chained through the 50 <<archive_next>> pointer in a BFD. The first one is findable 51 through the <<archive_head>> slot of the archive. Set it with 52 <<bfd_set_archive_head>> (q.v.). A given BFD may be in only 53 one open output archive at a time. 54 55 As expected, the BFD archive code is more general than the 56 archive code of any given environment. BFD archives may 57 contain files of different formats (e.g., a.out and coff) and 58 even different architectures. You may even place archives 59 recursively into archives! 60 61 This can cause unexpected confusion, since some archive 62 formats are more expressive than others. For instance, Intel 63 COFF archives can preserve long filenames; SunOS a.out archives 64 cannot. If you move a file from the first to the second 65 format and back again, the filename may be truncated. 66 Likewise, different a.out environments have different 67 conventions as to how they truncate filenames, whether they 68 preserve directory names in filenames, etc. When 69 interoperating with native tools, be sure your files are 70 homogeneous. 71 72 Beware: most of these formats do not react well to the 73 presence of spaces in filenames. We do the best we can, but 74 can't always handle this case due to restrictions in the format of 75 archives. Many Unix utilities are braindead in regards to 76 spaces and such in filenames anyway, so this shouldn't be much 77 of a restriction. 78 79 Archives are supported in BFD in <<archive.c>>. 80 81 SUBSECTION 82 Archive functions 83 */ 84 85 /* Assumes: 86 o - all archive elements start on an even boundary, newline padded; 87 o - all arch headers are char *; 88 o - all arch headers are the same size (across architectures). 89 */ 90 91 /* Some formats provide a way to cram a long filename into the short 92 (16 chars) space provided by a BSD archive. The trick is: make a 93 special "file" in the front of the archive, sort of like the SYMDEF 94 entry. If the filename is too long to fit, put it in the extended 95 name table, and use its index as the filename. To prevent 96 confusion prepend the index with a space. This means you can't 97 have filenames that start with a space, but then again, many Unix 98 utilities can't handle that anyway. 99 100 This scheme unfortunately requires that you stand on your head in 101 order to write an archive since you need to put a magic file at the 102 front, and need to touch every entry to do so. C'est la vie. 103 104 We support two variants of this idea: 105 The SVR4 format (extended name table is named "//"), 106 and an extended pseudo-BSD variant (extended name table is named 107 "ARFILENAMES/"). The origin of the latter format is uncertain. 108 109 BSD 4.4 uses a third scheme: It writes a long filename 110 directly after the header. This allows 'ar q' to work. 111 */ 112 113 /* Summary of archive member names: 114 115 Symbol table (must be first): 116 "__.SYMDEF " - Symbol table, Berkeley style, produced by ranlib. 117 "/ " - Symbol table, system 5 style. 118 119 Long name table (must be before regular file members): 120 "// " - Long name table, System 5 R4 style. 121 "ARFILENAMES/ " - Long name table, non-standard extended BSD (not BSD 4.4). 122 123 Regular file members with short names: 124 "filename.o/ " - Regular file, System 5 style (embedded spaces ok). 125 "filename.o " - Regular file, Berkeley style (no embedded spaces). 126 127 Regular files with long names (or embedded spaces, for BSD variants): 128 "/18 " - SVR4 style, name at offset 18 in name table. 129 "#1/23 " - Long name (or embedded spaces) 23 characters long, 130 BSD 4.4 style, full name follows header. 131 " 18 " - Long name 18 characters long, extended pseudo-BSD. 132 */ 133 134 #include "sysdep.h" 135 #include "bfd.h" 136 #include "libiberty.h" 137 #include "libbfd.h" 138 #include "aout/ar.h" 139 #include "aout/ranlib.h" 140 #include "safe-ctype.h" 141 #include "hashtab.h" 142 #include "filenames.h" 143 #include "bfdlink.h" 144 145 #ifndef errno 146 extern int errno; 147 #endif 148 149 /* We keep a cache of archive filepointers to archive elements to 150 speed up searching the archive by filepos. We only add an entry to 151 the cache when we actually read one. We also don't sort the cache; 152 it's generally short enough to search linearly. 153 Note that the pointers here point to the front of the ar_hdr, not 154 to the front of the contents! */ 155 struct ar_cache 156 { 157 file_ptr ptr; 158 bfd *arbfd; 159 }; 160 161 #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char) 162 #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen) 163 164 #define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data)) 165 #define arch_hdr(bfd) ((struct ar_hdr *) arch_eltdata (bfd)->arch_header) 166 167 /* True iff NAME designated a BSD 4.4 extended name. */ 168 169 #define is_bsd44_extended_name(NAME) \ 170 (NAME[0] == '#' && NAME[1] == '1' && NAME[2] == '/' && ISDIGIT (NAME[3])) 171 172 void 174 _bfd_ar_spacepad (char *p, size_t n, const char *fmt, long val) 175 { 176 static char buf[20]; 177 size_t len; 178 179 snprintf (buf, sizeof (buf), fmt, val); 180 len = strlen (buf); 181 if (len < n) 182 { 183 memcpy (p, buf, len); 184 memset (p + len, ' ', n - len); 185 } 186 else 187 memcpy (p, buf, n); 188 } 189 190 bfd_boolean 191 _bfd_ar_sizepad (char *p, size_t n, bfd_size_type size) 192 { 193 static char buf[21]; 194 size_t len; 195 196 snprintf (buf, sizeof (buf), "%-10" BFD_VMA_FMT "u", size); 197 len = strlen (buf); 198 if (len > n) 199 { 200 bfd_set_error (bfd_error_file_too_big); 201 return FALSE; 202 } 203 if (len < n) 204 { 205 memcpy (p, buf, len); 206 memset (p + len, ' ', n - len); 207 } 208 else 209 memcpy (p, buf, n); 210 return TRUE; 211 } 212 213 bfd_boolean 215 _bfd_generic_mkarchive (bfd *abfd) 216 { 217 bfd_size_type amt = sizeof (struct artdata); 218 219 abfd->tdata.aout_ar_data = (struct artdata *) bfd_zalloc (abfd, amt); 220 if (bfd_ardata (abfd) == NULL) 221 return FALSE; 222 223 /* Already cleared by bfd_zalloc above. 224 bfd_ardata (abfd)->cache = NULL; 225 bfd_ardata (abfd)->archive_head = NULL; 226 bfd_ardata (abfd)->symdefs = NULL; 227 bfd_ardata (abfd)->extended_names = NULL; 228 bfd_ardata (abfd)->extended_names_size = 0; 229 bfd_ardata (abfd)->tdata = NULL; */ 230 231 return TRUE; 232 } 233 234 /* 235 FUNCTION 236 bfd_get_next_mapent 237 238 SYNOPSIS 239 symindex bfd_get_next_mapent 240 (bfd *abfd, symindex previous, carsym **sym); 241 242 DESCRIPTION 243 Step through archive @var{abfd}'s symbol table (if it 244 has one). Successively update @var{sym} with the next symbol's 245 information, returning that symbol's (internal) index into the 246 symbol table. 247 248 Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get 249 the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already 250 got the last one. 251 252 A <<carsym>> is a canonical archive symbol. The only 253 user-visible element is its name, a null-terminated string. 254 */ 255 256 symindex 257 bfd_get_next_mapent (bfd *abfd, symindex prev, carsym **entry) 258 { 259 if (!bfd_has_map (abfd)) 260 { 261 bfd_set_error (bfd_error_invalid_operation); 262 return BFD_NO_MORE_SYMBOLS; 263 } 264 265 if (prev == BFD_NO_MORE_SYMBOLS) 266 prev = 0; 267 else 268 ++prev; 269 if (prev >= bfd_ardata (abfd)->symdef_count) 270 return BFD_NO_MORE_SYMBOLS; 271 272 *entry = (bfd_ardata (abfd)->symdefs + prev); 273 return prev; 274 } 275 276 /* To be called by backends only. */ 277 278 bfd * 279 _bfd_create_empty_archive_element_shell (bfd *obfd) 280 { 281 return _bfd_new_bfd_contained_in (obfd); 282 } 283 284 /* 285 FUNCTION 286 bfd_set_archive_head 287 288 SYNOPSIS 289 bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head); 290 291 DESCRIPTION 292 Set the head of the chain of 293 BFDs contained in the archive @var{output} to @var{new_head}. 294 */ 295 296 bfd_boolean 297 bfd_set_archive_head (bfd *output_archive, bfd *new_head) 298 { 299 output_archive->archive_head = new_head; 300 return TRUE; 301 } 302 303 bfd * 304 _bfd_look_for_bfd_in_cache (bfd *arch_bfd, file_ptr filepos) 305 { 306 htab_t hash_table = bfd_ardata (arch_bfd)->cache; 307 struct ar_cache m; 308 309 m.ptr = filepos; 310 311 if (hash_table) 312 { 313 struct ar_cache *entry = (struct ar_cache *) htab_find (hash_table, &m); 314 if (!entry) 315 return NULL; 316 else 317 return entry->arbfd; 318 } 319 else 320 return NULL; 321 } 322 323 static hashval_t 324 hash_file_ptr (const void * p) 325 { 326 return (hashval_t) (((struct ar_cache *) p)->ptr); 327 } 328 329 /* Returns non-zero if P1 and P2 are equal. */ 330 331 static int 332 eq_file_ptr (const void * p1, const void * p2) 333 { 334 struct ar_cache *arc1 = (struct ar_cache *) p1; 335 struct ar_cache *arc2 = (struct ar_cache *) p2; 336 return arc1->ptr == arc2->ptr; 337 } 338 339 /* The calloc function doesn't always take size_t (e.g. on VMS) 340 so wrap it to avoid a compile time warning. */ 341 342 static void * 343 _bfd_calloc_wrapper (size_t a, size_t b) 344 { 345 return calloc (a, b); 346 } 347 348 /* Kind of stupid to call cons for each one, but we don't do too many. */ 349 350 bfd_boolean 351 _bfd_add_bfd_to_archive_cache (bfd *arch_bfd, file_ptr filepos, bfd *new_elt) 352 { 353 struct ar_cache *cache; 354 htab_t hash_table = bfd_ardata (arch_bfd)->cache; 355 356 /* If the hash table hasn't been created, create it. */ 357 if (hash_table == NULL) 358 { 359 hash_table = htab_create_alloc (16, hash_file_ptr, eq_file_ptr, 360 NULL, _bfd_calloc_wrapper, free); 361 if (hash_table == NULL) 362 return FALSE; 363 bfd_ardata (arch_bfd)->cache = hash_table; 364 } 365 366 /* Insert new_elt into the hash table by filepos. */ 367 cache = (struct ar_cache *) bfd_zalloc (arch_bfd, sizeof (struct ar_cache)); 368 cache->ptr = filepos; 369 cache->arbfd = new_elt; 370 *htab_find_slot (hash_table, (const void *) cache, INSERT) = cache; 371 372 /* Provide a means of accessing this from child. */ 373 arch_eltdata (new_elt)->parent_cache = hash_table; 374 arch_eltdata (new_elt)->key = filepos; 375 376 return TRUE; 377 } 378 379 static bfd * 381 _bfd_find_nested_archive (bfd *arch_bfd, const char *filename) 382 { 383 bfd *abfd; 384 const char *target; 385 386 /* PR 15140: Don't allow a nested archive pointing to itself. */ 387 if (filename_cmp (filename, arch_bfd->filename) == 0) 388 { 389 bfd_set_error (bfd_error_malformed_archive); 390 return NULL; 391 } 392 393 for (abfd = arch_bfd->nested_archives; 394 abfd != NULL; 395 abfd = abfd->archive_next) 396 { 397 if (filename_cmp (filename, abfd->filename) == 0) 398 return abfd; 399 } 400 target = NULL; 401 if (!arch_bfd->target_defaulted) 402 target = arch_bfd->xvec->name; 403 abfd = bfd_openr (filename, target); 404 if (abfd) 405 { 406 abfd->archive_next = arch_bfd->nested_archives; 407 arch_bfd->nested_archives = abfd; 408 } 409 return abfd; 410 } 411 412 /* The name begins with space. Hence the rest of the name is an index into 413 the string table. */ 414 415 static char * 416 get_extended_arelt_filename (bfd *arch, const char *name, file_ptr *originp) 417 { 418 unsigned long table_index = 0; 419 const char *endp; 420 421 /* Should extract string so that I can guarantee not to overflow into 422 the next region, but I'm too lazy. */ 423 errno = 0; 424 /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */ 425 table_index = strtol (name + 1, (char **) &endp, 10); 426 if (errno != 0 || table_index >= bfd_ardata (arch)->extended_names_size) 427 { 428 bfd_set_error (bfd_error_malformed_archive); 429 return NULL; 430 } 431 /* In a thin archive, a member of an archive-within-an-archive 432 will have the offset in the inner archive encoded here. */ 433 if (bfd_is_thin_archive (arch) && endp != NULL && *endp == ':') 434 { 435 file_ptr origin = strtol (endp + 1, NULL, 10); 436 437 if (errno != 0) 438 { 439 bfd_set_error (bfd_error_malformed_archive); 440 return NULL; 441 } 442 *originp = origin; 443 } 444 else 445 *originp = 0; 446 447 return bfd_ardata (arch)->extended_names + table_index; 448 } 449 450 /* This functions reads an arch header and returns an areltdata pointer, or 451 NULL on error. 452 453 Presumes the file pointer is already in the right place (ie pointing 454 to the ar_hdr in the file). Moves the file pointer; on success it 455 should be pointing to the front of the file contents; on failure it 456 could have been moved arbitrarily. */ 457 458 void * 459 _bfd_generic_read_ar_hdr (bfd *abfd) 460 { 461 return _bfd_generic_read_ar_hdr_mag (abfd, NULL); 462 } 463 464 /* Alpha ECOFF uses an optional different ARFMAG value, so we have a 465 variant of _bfd_generic_read_ar_hdr which accepts a magic string. */ 466 467 void * 468 _bfd_generic_read_ar_hdr_mag (bfd *abfd, const char *mag) 469 { 470 struct ar_hdr hdr; 471 char *hdrp = (char *) &hdr; 472 bfd_size_type parsed_size; 473 struct areltdata *ared; 474 char *filename = NULL; 475 bfd_size_type namelen = 0; 476 bfd_size_type allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr); 477 char *allocptr = 0; 478 file_ptr origin = 0; 479 unsigned int extra_size = 0; 480 char fmag_save; 481 int scan; 482 483 if (bfd_bread (hdrp, sizeof (struct ar_hdr), abfd) != sizeof (struct ar_hdr)) 484 { 485 if (bfd_get_error () != bfd_error_system_call) 486 bfd_set_error (bfd_error_no_more_archived_files); 487 return NULL; 488 } 489 if (strncmp (hdr.ar_fmag, ARFMAG, 2) != 0 490 && (mag == NULL 491 || strncmp (hdr.ar_fmag, mag, 2) != 0)) 492 { 493 bfd_set_error (bfd_error_malformed_archive); 494 return NULL; 495 } 496 497 errno = 0; 498 fmag_save = hdr.ar_fmag[0]; 499 hdr.ar_fmag[0] = 0; 500 scan = sscanf (hdr.ar_size, "%" BFD_VMA_FMT "u", &parsed_size); 501 hdr.ar_fmag[0] = fmag_save; 502 if (scan != 1) 503 { 504 bfd_set_error (bfd_error_malformed_archive); 505 return NULL; 506 } 507 508 /* Extract the filename from the archive - there are two ways to 509 specify an extended name table, either the first char of the 510 name is a space, or it's a slash. */ 511 if ((hdr.ar_name[0] == '/' 512 || (hdr.ar_name[0] == ' ' 513 && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL)) 514 && bfd_ardata (abfd)->extended_names != NULL) 515 { 516 filename = get_extended_arelt_filename (abfd, hdr.ar_name, &origin); 517 if (filename == NULL) 518 return NULL; 519 } 520 /* BSD4.4-style long filename. */ 521 else if (is_bsd44_extended_name (hdr.ar_name)) 522 { 523 /* BSD-4.4 extended name */ 524 namelen = atoi (&hdr.ar_name[3]); 525 allocsize += namelen + 1; 526 parsed_size -= namelen; 527 extra_size = namelen; 528 529 allocptr = (char *) bfd_zmalloc (allocsize); 530 if (allocptr == NULL) 531 return NULL; 532 filename = (allocptr 533 + sizeof (struct areltdata) 534 + sizeof (struct ar_hdr)); 535 if (bfd_bread (filename, namelen, abfd) != namelen) 536 { 537 free (allocptr); 538 if (bfd_get_error () != bfd_error_system_call) 539 bfd_set_error (bfd_error_no_more_archived_files); 540 return NULL; 541 } 542 filename[namelen] = '\0'; 543 } 544 else 545 { 546 /* We judge the end of the name by looking for '/' or ' '. 547 Note: The SYSV format (terminated by '/') allows embedded 548 spaces, so only look for ' ' if we don't find '/'. */ 549 550 char *e; 551 e = (char *) memchr (hdr.ar_name, '\0', ar_maxnamelen (abfd)); 552 if (e == NULL) 553 { 554 e = (char *) memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)); 555 if (e == NULL) 556 e = (char *) memchr (hdr.ar_name, ' ', ar_maxnamelen (abfd)); 557 } 558 559 if (e != NULL) 560 namelen = e - hdr.ar_name; 561 else 562 { 563 /* If we didn't find a termination character, then the name 564 must be the entire field. */ 565 namelen = ar_maxnamelen (abfd); 566 } 567 568 allocsize += namelen + 1; 569 } 570 571 if (!allocptr) 572 { 573 allocptr = (char *) bfd_zmalloc (allocsize); 574 if (allocptr == NULL) 575 return NULL; 576 } 577 578 ared = (struct areltdata *) allocptr; 579 580 ared->arch_header = allocptr + sizeof (struct areltdata); 581 memcpy (ared->arch_header, &hdr, sizeof (struct ar_hdr)); 582 ared->parsed_size = parsed_size; 583 ared->extra_size = extra_size; 584 ared->origin = origin; 585 586 if (filename != NULL) 587 ared->filename = filename; 588 else 589 { 590 ared->filename = allocptr + (sizeof (struct areltdata) + 591 sizeof (struct ar_hdr)); 592 if (namelen) 593 memcpy (ared->filename, hdr.ar_name, namelen); 594 ared->filename[namelen] = '\0'; 595 } 596 597 return ared; 598 } 599 600 /* Append the relative pathname for a member of the thin archive 602 to the pathname of the directory containing the archive. */ 603 604 char * 605 _bfd_append_relative_path (bfd *arch, char *elt_name) 606 { 607 const char *arch_name = arch->filename; 608 const char *base_name = lbasename (arch_name); 609 size_t prefix_len; 610 char *filename; 611 612 if (base_name == arch_name) 613 return elt_name; 614 615 prefix_len = base_name - arch_name; 616 filename = (char *) bfd_alloc (arch, prefix_len + strlen (elt_name) + 1); 617 if (filename == NULL) 618 return NULL; 619 620 strncpy (filename, arch_name, prefix_len); 621 strcpy (filename + prefix_len, elt_name); 622 return filename; 623 } 624 625 /* This is an internal function; it's mainly used when indexing 626 through the archive symbol table, but also used to get the next 627 element, since it handles the bookkeeping so nicely for us. */ 628 629 bfd * 630 _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos) 631 { 632 struct areltdata *new_areldata; 633 bfd *n_nfd; 634 char *filename; 635 636 n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos); 637 if (n_nfd) 638 return n_nfd; 639 640 if (0 > bfd_seek (archive, filepos, SEEK_SET)) 641 return NULL; 642 643 if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL) 644 return NULL; 645 646 filename = new_areldata->filename; 647 648 if (bfd_is_thin_archive (archive)) 649 { 650 const char *target; 651 652 /* This is a proxy entry for an external file. */ 653 if (! IS_ABSOLUTE_PATH (filename)) 654 { 655 filename = _bfd_append_relative_path (archive, filename); 656 if (filename == NULL) 657 { 658 free (new_areldata); 659 return NULL; 660 } 661 } 662 663 if (new_areldata->origin > 0) 664 { 665 /* This proxy entry refers to an element of a nested archive. 666 Locate the member of that archive and return a bfd for it. */ 667 bfd *ext_arch = _bfd_find_nested_archive (archive, filename); 668 669 if (ext_arch == NULL 670 || ! bfd_check_format (ext_arch, bfd_archive)) 671 { 672 free (new_areldata); 673 return NULL; 674 } 675 n_nfd = _bfd_get_elt_at_filepos (ext_arch, new_areldata->origin); 676 if (n_nfd == NULL) 677 { 678 free (new_areldata); 679 return NULL; 680 } 681 n_nfd->proxy_origin = bfd_tell (archive); 682 return n_nfd; 683 } 684 /* It's not an element of a nested archive; 685 open the external file as a bfd. */ 686 target = NULL; 687 if (!archive->target_defaulted) 688 target = archive->xvec->name; 689 n_nfd = bfd_openr (filename, target); 690 if (n_nfd == NULL) 691 bfd_set_error (bfd_error_malformed_archive); 692 } 693 else 694 { 695 n_nfd = _bfd_create_empty_archive_element_shell (archive); 696 } 697 698 if (n_nfd == NULL) 699 { 700 free (new_areldata); 701 return NULL; 702 } 703 704 n_nfd->proxy_origin = bfd_tell (archive); 705 706 if (bfd_is_thin_archive (archive)) 707 { 708 n_nfd->origin = 0; 709 } 710 else 711 { 712 n_nfd->origin = n_nfd->proxy_origin; 713 n_nfd->filename = xstrdup (filename); 714 } 715 716 n_nfd->arelt_data = new_areldata; 717 718 /* Copy BFD_COMPRESS and BFD_DECOMPRESS flags. */ 719 n_nfd->flags |= archive->flags & (BFD_COMPRESS | BFD_DECOMPRESS); 720 721 if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd)) 722 return n_nfd; 723 724 free (new_areldata); 725 n_nfd->arelt_data = NULL; 726 return NULL; 727 } 728 729 /* Return the BFD which is referenced by the symbol in ABFD indexed by 730 SYM_INDEX. SYM_INDEX should have been returned by bfd_get_next_mapent. */ 731 732 bfd * 733 _bfd_generic_get_elt_at_index (bfd *abfd, symindex sym_index) 734 { 735 carsym *entry; 736 737 entry = bfd_ardata (abfd)->symdefs + sym_index; 738 return _bfd_get_elt_at_filepos (abfd, entry->file_offset); 739 } 740 741 /* 742 FUNCTION 743 bfd_openr_next_archived_file 744 745 SYNOPSIS 746 bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous); 747 748 DESCRIPTION 749 Provided a BFD, @var{archive}, containing an archive and NULL, open 750 an input BFD on the first contained element and returns that. 751 Subsequent calls should pass 752 the archive and the previous return value to return a created 753 BFD to the next contained element. NULL is returned when there 754 are no more. 755 */ 756 757 bfd * 758 bfd_openr_next_archived_file (bfd *archive, bfd *last_file) 759 { 760 if ((bfd_get_format (archive) != bfd_archive) 761 || (archive->direction == write_direction)) 762 { 763 bfd_set_error (bfd_error_invalid_operation); 764 return NULL; 765 } 766 767 return BFD_SEND (archive, 768 openr_next_archived_file, (archive, last_file)); 769 } 770 771 bfd * 772 bfd_generic_openr_next_archived_file (bfd *archive, bfd *last_file) 773 { 774 file_ptr filestart; 775 776 if (!last_file) 777 filestart = bfd_ardata (archive)->first_file_filepos; 778 else 779 { 780 bfd_size_type size = arelt_size (last_file); 781 782 filestart = last_file->proxy_origin; 783 if (! bfd_is_thin_archive (archive)) 784 filestart += size; 785 /* Pad to an even boundary... 786 Note that last_file->origin can be odd in the case of 787 BSD-4.4-style element with a long odd size. */ 788 filestart += filestart % 2; 789 } 790 791 return _bfd_get_elt_at_filepos (archive, filestart); 792 } 793 794 const bfd_target * 795 bfd_generic_archive_p (bfd *abfd) 796 { 797 struct artdata *tdata_hold; 798 char armag[SARMAG + 1]; 799 bfd_size_type amt; 800 801 if (bfd_bread (armag, SARMAG, abfd) != SARMAG) 802 { 803 if (bfd_get_error () != bfd_error_system_call) 804 bfd_set_error (bfd_error_wrong_format); 805 return NULL; 806 } 807 808 bfd_is_thin_archive (abfd) = (strncmp (armag, ARMAGT, SARMAG) == 0); 809 810 if (strncmp (armag, ARMAG, SARMAG) != 0 811 && strncmp (armag, ARMAGB, SARMAG) != 0 812 && ! bfd_is_thin_archive (abfd)) 813 return NULL; 814 815 tdata_hold = bfd_ardata (abfd); 816 817 amt = sizeof (struct artdata); 818 bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt); 819 if (bfd_ardata (abfd) == NULL) 820 { 821 bfd_ardata (abfd) = tdata_hold; 822 return NULL; 823 } 824 825 bfd_ardata (abfd)->first_file_filepos = SARMAG; 826 /* Cleared by bfd_zalloc above. 827 bfd_ardata (abfd)->cache = NULL; 828 bfd_ardata (abfd)->archive_head = NULL; 829 bfd_ardata (abfd)->symdefs = NULL; 830 bfd_ardata (abfd)->extended_names = NULL; 831 bfd_ardata (abfd)->extended_names_size = 0; 832 bfd_ardata (abfd)->tdata = NULL; */ 833 834 if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd)) 835 || !BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd))) 836 { 837 if (bfd_get_error () != bfd_error_system_call) 838 bfd_set_error (bfd_error_wrong_format); 839 bfd_release (abfd, bfd_ardata (abfd)); 840 bfd_ardata (abfd) = tdata_hold; 841 return NULL; 842 } 843 844 if (abfd->target_defaulted && bfd_has_map (abfd)) 845 { 846 bfd *first; 847 848 /* This archive has a map, so we may presume that the contents 849 are object files. Make sure that if the first file in the 850 archive can be recognized as an object file, it is for this 851 target. If not, assume that this is the wrong format. If 852 the first file is not an object file, somebody is doing 853 something weird, and we permit it so that ar -t will work. 854 855 This is done because any normal format will recognize any 856 normal archive, regardless of the format of the object files. 857 We do accept an empty archive. */ 858 859 first = bfd_openr_next_archived_file (abfd, NULL); 860 if (first != NULL) 861 { 862 first->target_defaulted = FALSE; 863 if (bfd_check_format (first, bfd_object) 864 && first->xvec != abfd->xvec) 865 bfd_set_error (bfd_error_wrong_object_format); 866 /* And we ought to close `first' here too. */ 867 } 868 } 869 870 return abfd->xvec; 871 } 872 873 /* Some constants for a 32 bit BSD archive structure. We do not 874 support 64 bit archives presently; so far as I know, none actually 875 exist. Supporting them would require changing these constants, and 876 changing some H_GET_32 to H_GET_64. */ 877 878 /* The size of an external symdef structure. */ 879 #define BSD_SYMDEF_SIZE 8 880 881 /* The offset from the start of a symdef structure to the file offset. */ 882 #define BSD_SYMDEF_OFFSET_SIZE 4 883 884 /* The size of the symdef count. */ 885 #define BSD_SYMDEF_COUNT_SIZE 4 886 887 /* The size of the string count. */ 888 #define BSD_STRING_COUNT_SIZE 4 889 890 /* Read a BSD-style archive symbol table. Returns FALSE on error, 891 TRUE otherwise. */ 892 893 static bfd_boolean 894 do_slurp_bsd_armap (bfd *abfd) 895 { 896 struct areltdata *mapdata; 897 unsigned int counter; 898 bfd_byte *raw_armap, *rbase; 899 struct artdata *ardata = bfd_ardata (abfd); 900 char *stringbase; 901 bfd_size_type parsed_size, amt; 902 carsym *set; 903 904 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); 905 if (mapdata == NULL) 906 return FALSE; 907 parsed_size = mapdata->parsed_size; 908 free (mapdata); 909 910 raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size); 911 if (raw_armap == NULL) 912 return FALSE; 913 914 if (bfd_bread (raw_armap, parsed_size, abfd) != parsed_size) 915 { 916 if (bfd_get_error () != bfd_error_system_call) 917 bfd_set_error (bfd_error_malformed_archive); 918 byebye: 919 bfd_release (abfd, raw_armap); 920 return FALSE; 921 } 922 923 ardata->symdef_count = H_GET_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE; 924 925 if (ardata->symdef_count * BSD_SYMDEF_SIZE > 926 parsed_size - BSD_SYMDEF_COUNT_SIZE) 927 { 928 /* Probably we're using the wrong byte ordering. */ 929 bfd_set_error (bfd_error_wrong_format); 930 goto byebye; 931 } 932 933 ardata->cache = 0; 934 rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE; 935 stringbase = ((char *) rbase 936 + ardata->symdef_count * BSD_SYMDEF_SIZE 937 + BSD_STRING_COUNT_SIZE); 938 amt = ardata->symdef_count * sizeof (carsym); 939 ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt); 940 if (!ardata->symdefs) 941 return FALSE; 942 943 for (counter = 0, set = ardata->symdefs; 944 counter < ardata->symdef_count; 945 counter++, set++, rbase += BSD_SYMDEF_SIZE) 946 { 947 set->name = H_GET_32 (abfd, rbase) + stringbase; 948 set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE); 949 } 950 951 ardata->first_file_filepos = bfd_tell (abfd); 952 /* Pad to an even boundary if you have to. */ 953 ardata->first_file_filepos += (ardata->first_file_filepos) % 2; 954 /* FIXME, we should provide some way to free raw_ardata when 955 we are done using the strings from it. For now, it seems 956 to be allocated on an objalloc anyway... */ 957 bfd_has_map (abfd) = TRUE; 958 return TRUE; 959 } 960 961 /* Read a COFF archive symbol table. Returns FALSE on error, TRUE 962 otherwise. */ 963 964 static bfd_boolean 965 do_slurp_coff_armap (bfd *abfd) 966 { 967 struct areltdata *mapdata; 968 int *raw_armap, *rawptr; 969 struct artdata *ardata = bfd_ardata (abfd); 970 char *stringbase; 971 bfd_size_type stringsize; 972 bfd_size_type parsed_size; 973 carsym *carsyms; 974 bfd_size_type nsymz; /* Number of symbols in armap. */ 975 bfd_vma (*swap) (const void *); 976 char int_buf[sizeof (long)]; 977 bfd_size_type carsym_size, ptrsize; 978 unsigned int i; 979 980 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); 981 if (mapdata == NULL) 982 return FALSE; 983 parsed_size = mapdata->parsed_size; 984 free (mapdata); 985 986 if (bfd_bread (int_buf, 4, abfd) != 4) 987 { 988 if (bfd_get_error () != bfd_error_system_call) 989 bfd_set_error (bfd_error_malformed_archive); 990 return FALSE; 991 } 992 /* It seems that all numeric information in a coff archive is always 993 in big endian format, nomatter the host or target. */ 994 swap = bfd_getb32; 995 nsymz = bfd_getb32 (int_buf); 996 stringsize = parsed_size - (4 * nsymz) - 4; 997 998 /* ... except that some archive formats are broken, and it may be our 999 fault - the i960 little endian coff sometimes has big and sometimes 1000 little, because our tools changed. Here's a horrible hack to clean 1001 up the crap. */ 1002 1003 if (stringsize > 0xfffff 1004 && bfd_get_arch (abfd) == bfd_arch_i960 1005 && bfd_get_flavour (abfd) == bfd_target_coff_flavour) 1006 { 1007 /* This looks dangerous, let's do it the other way around. */ 1008 nsymz = bfd_getl32 (int_buf); 1009 stringsize = parsed_size - (4 * nsymz) - 4; 1010 swap = bfd_getl32; 1011 } 1012 1013 /* The coff armap must be read sequentially. So we construct a 1014 bsd-style one in core all at once, for simplicity. */ 1015 1016 if (nsymz > ~ (bfd_size_type) 0 / sizeof (carsym)) 1017 return FALSE; 1018 1019 carsym_size = (nsymz * sizeof (carsym)); 1020 ptrsize = (4 * nsymz); 1021 1022 if (carsym_size + stringsize + 1 <= carsym_size) 1023 return FALSE; 1024 1025 ardata->symdefs = (struct carsym *) bfd_zalloc (abfd, 1026 carsym_size + stringsize + 1); 1027 if (ardata->symdefs == NULL) 1028 return FALSE; 1029 carsyms = ardata->symdefs; 1030 stringbase = ((char *) ardata->symdefs) + carsym_size; 1031 1032 /* Allocate and read in the raw offsets. */ 1033 raw_armap = (int *) bfd_alloc (abfd, ptrsize); 1034 if (raw_armap == NULL) 1035 goto release_symdefs; 1036 if (bfd_bread (raw_armap, ptrsize, abfd) != ptrsize 1037 || (bfd_bread (stringbase, stringsize, abfd) != stringsize)) 1038 { 1039 if (bfd_get_error () != bfd_error_system_call) 1040 bfd_set_error (bfd_error_malformed_archive); 1041 goto release_raw_armap; 1042 } 1043 1044 /* OK, build the carsyms. */ 1045 for (i = 0; i < nsymz; i++) 1046 { 1047 rawptr = raw_armap + i; 1048 carsyms->file_offset = swap ((bfd_byte *) rawptr); 1049 carsyms->name = stringbase; 1050 stringbase += strlen (stringbase) + 1; 1051 carsyms++; 1052 } 1053 *stringbase = 0; 1054 1055 ardata->symdef_count = nsymz; 1056 ardata->first_file_filepos = bfd_tell (abfd); 1057 /* Pad to an even boundary if you have to. */ 1058 ardata->first_file_filepos += (ardata->first_file_filepos) % 2; 1059 1060 bfd_has_map (abfd) = TRUE; 1061 bfd_release (abfd, raw_armap); 1062 1063 /* Check for a second archive header (as used by PE). */ 1064 { 1065 struct areltdata *tmp; 1066 1067 bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET); 1068 tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd); 1069 if (tmp != NULL) 1070 { 1071 if (tmp->arch_header[0] == '/' 1072 && tmp->arch_header[1] == ' ') 1073 { 1074 ardata->first_file_filepos += 1075 (tmp->parsed_size + sizeof (struct ar_hdr) + 1) & ~(unsigned) 1; 1076 } 1077 free (tmp); 1078 } 1079 } 1080 1081 return TRUE; 1082 1083 release_raw_armap: 1084 bfd_release (abfd, raw_armap); 1085 release_symdefs: 1086 bfd_release (abfd, (ardata)->symdefs); 1087 return FALSE; 1088 } 1089 1090 /* This routine can handle either coff-style or bsd-style armaps 1091 (archive symbol table). Returns FALSE on error, TRUE otherwise */ 1092 1093 bfd_boolean 1094 bfd_slurp_armap (bfd *abfd) 1095 { 1096 char nextname[17]; 1097 int i = bfd_bread (nextname, 16, abfd); 1098 1099 if (i == 0) 1100 return TRUE; 1101 if (i != 16) 1102 return FALSE; 1103 1104 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0) 1105 return FALSE; 1106 1107 if (CONST_STRNEQ (nextname, "__.SYMDEF ") 1108 || CONST_STRNEQ (nextname, "__.SYMDEF/ ")) /* Old Linux archives. */ 1109 return do_slurp_bsd_armap (abfd); 1110 else if (CONST_STRNEQ (nextname, "/ ")) 1111 return do_slurp_coff_armap (abfd); 1112 else if (CONST_STRNEQ (nextname, "/SYM64/ ")) 1113 { 1114 /* 64bit ELF (Irix 6) archive. */ 1115 #ifdef BFD64 1116 extern bfd_boolean bfd_elf64_archive_slurp_armap (bfd *); 1117 return bfd_elf64_archive_slurp_armap (abfd); 1118 #else 1119 bfd_set_error (bfd_error_wrong_format); 1120 return FALSE; 1121 #endif 1122 } 1123 else if (CONST_STRNEQ (nextname, "#1/20 ")) 1124 { 1125 /* Mach-O has a special name for armap when the map is sorted by name. 1126 However because this name has a space it is slightly more difficult 1127 to check it. */ 1128 struct ar_hdr hdr; 1129 char extname[21]; 1130 1131 if (bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr)) 1132 return FALSE; 1133 /* Read the extended name. We know its length. */ 1134 if (bfd_bread (extname, 20, abfd) != 20) 1135 return FALSE; 1136 if (bfd_seek (abfd, -(file_ptr) (sizeof (hdr) + 20), SEEK_CUR) != 0) 1137 return FALSE; 1138 if (CONST_STRNEQ (extname, "__.SYMDEF SORTED") 1139 || CONST_STRNEQ (extname, "__.SYMDEF")) 1140 return do_slurp_bsd_armap (abfd); 1141 } 1142 1143 bfd_has_map (abfd) = FALSE; 1144 return TRUE; 1145 } 1146 1147 /* Returns FALSE on error, TRUE otherwise. */ 1149 /* Flavor 2 of a bsd armap, similar to bfd_slurp_bsd_armap except the 1150 header is in a slightly different order and the map name is '/'. 1151 This flavour is used by hp300hpux. */ 1152 1153 #define HPUX_SYMDEF_COUNT_SIZE 2 1154 1155 bfd_boolean 1156 bfd_slurp_bsd_armap_f2 (bfd *abfd) 1157 { 1158 struct areltdata *mapdata; 1159 char nextname[17]; 1160 unsigned int counter; 1161 bfd_byte *raw_armap, *rbase; 1162 struct artdata *ardata = bfd_ardata (abfd); 1163 char *stringbase; 1164 unsigned int stringsize; 1165 unsigned int left; 1166 bfd_size_type amt; 1167 carsym *set; 1168 int i = bfd_bread (nextname, 16, abfd); 1169 1170 if (i == 0) 1171 return TRUE; 1172 if (i != 16) 1173 return FALSE; 1174 1175 /* The archive has at least 16 bytes in it. */ 1176 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0) 1177 return FALSE; 1178 1179 if (CONST_STRNEQ (nextname, "__.SYMDEF ") 1180 || CONST_STRNEQ (nextname, "__.SYMDEF/ ")) /* Old Linux archives. */ 1181 return do_slurp_bsd_armap (abfd); 1182 1183 if (! CONST_STRNEQ (nextname, "/ ")) 1184 { 1185 bfd_has_map (abfd) = FALSE; 1186 return TRUE; 1187 } 1188 1189 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); 1190 if (mapdata == NULL) 1191 return FALSE; 1192 1193 if (mapdata->parsed_size < HPUX_SYMDEF_COUNT_SIZE + BSD_STRING_COUNT_SIZE) 1194 { 1195 free (mapdata); 1196 wrong_format: 1197 bfd_set_error (bfd_error_wrong_format); 1198 byebye: 1199 return FALSE; 1200 } 1201 left = mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE - BSD_STRING_COUNT_SIZE; 1202 1203 amt = mapdata->parsed_size; 1204 free (mapdata); 1205 1206 raw_armap = (bfd_byte *) bfd_zalloc (abfd, amt); 1207 if (raw_armap == NULL) 1208 goto byebye; 1209 1210 if (bfd_bread (raw_armap, amt, abfd) != amt) 1211 { 1212 if (bfd_get_error () != bfd_error_system_call) 1213 bfd_set_error (bfd_error_malformed_archive); 1214 goto byebye; 1215 } 1216 1217 ardata->symdef_count = H_GET_16 (abfd, raw_armap); 1218 1219 ardata->cache = 0; 1220 1221 stringsize = H_GET_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE); 1222 if (stringsize > left) 1223 goto wrong_format; 1224 left -= stringsize; 1225 1226 /* Skip sym count and string sz. */ 1227 stringbase = ((char *) raw_armap 1228 + HPUX_SYMDEF_COUNT_SIZE 1229 + BSD_STRING_COUNT_SIZE); 1230 rbase = (bfd_byte *) stringbase + stringsize; 1231 amt = ardata->symdef_count * BSD_SYMDEF_SIZE; 1232 if (amt > left) 1233 goto wrong_format; 1234 1235 ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt); 1236 if (!ardata->symdefs) 1237 return FALSE; 1238 1239 for (counter = 0, set = ardata->symdefs; 1240 counter < ardata->symdef_count; 1241 counter++, set++, rbase += BSD_SYMDEF_SIZE) 1242 { 1243 set->name = H_GET_32 (abfd, rbase) + stringbase; 1244 set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE); 1245 } 1246 1247 ardata->first_file_filepos = bfd_tell (abfd); 1248 /* Pad to an even boundary if you have to. */ 1249 ardata->first_file_filepos += (ardata->first_file_filepos) % 2; 1250 /* FIXME, we should provide some way to free raw_ardata when 1251 we are done using the strings from it. For now, it seems 1252 to be allocated on an objalloc anyway... */ 1253 bfd_has_map (abfd) = TRUE; 1254 return TRUE; 1255 } 1256 1257 /** Extended name table. 1259 1260 Normally archives support only 14-character filenames. 1261 1262 Intel has extended the format: longer names are stored in a special 1263 element (the first in the archive, or second if there is an armap); 1264 the name in the ar_hdr is replaced by <space><index into filename 1265 element>. Index is the P.R. of an int (decimal). Data General have 1266 extended the format by using the prefix // for the special element. */ 1267 1268 /* Returns FALSE on error, TRUE otherwise. */ 1269 1270 bfd_boolean 1271 _bfd_slurp_extended_name_table (bfd *abfd) 1272 { 1273 char nextname[17]; 1274 struct areltdata *namedata; 1275 bfd_size_type amt; 1276 1277 /* FIXME: Formatting sucks here, and in case of failure of BFD_READ, 1278 we probably don't want to return TRUE. */ 1279 if (bfd_seek (abfd, bfd_ardata (abfd)->first_file_filepos, SEEK_SET) != 0) 1280 return FALSE; 1281 1282 if (bfd_bread (nextname, 16, abfd) == 16) 1283 { 1284 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0) 1285 return FALSE; 1286 1287 if (! CONST_STRNEQ (nextname, "ARFILENAMES/ ") 1288 && ! CONST_STRNEQ (nextname, "// ")) 1289 { 1290 bfd_ardata (abfd)->extended_names = NULL; 1291 bfd_ardata (abfd)->extended_names_size = 0; 1292 return TRUE; 1293 } 1294 1295 namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd); 1296 if (namedata == NULL) 1297 return FALSE; 1298 1299 amt = namedata->parsed_size; 1300 if (amt + 1 == 0) 1301 goto byebye; 1302 1303 bfd_ardata (abfd)->extended_names_size = amt; 1304 bfd_ardata (abfd)->extended_names = (char *) bfd_zalloc (abfd, amt + 1); 1305 if (bfd_ardata (abfd)->extended_names == NULL) 1306 { 1307 byebye: 1308 free (namedata); 1309 bfd_ardata (abfd)->extended_names = NULL; 1310 bfd_ardata (abfd)->extended_names_size = 0; 1311 return FALSE; 1312 } 1313 1314 if (bfd_bread (bfd_ardata (abfd)->extended_names, amt, abfd) != amt) 1315 { 1316 if (bfd_get_error () != bfd_error_system_call) 1317 bfd_set_error (bfd_error_malformed_archive); 1318 bfd_release (abfd, (bfd_ardata (abfd)->extended_names)); 1319 bfd_ardata (abfd)->extended_names = NULL; 1320 goto byebye; 1321 } 1322 1323 /* Since the archive is supposed to be printable if it contains 1324 text, the entries in the list are newline-padded, not null 1325 padded. In SVR4-style archives, the names also have a 1326 trailing '/'. DOS/NT created archive often have \ in them 1327 We'll fix all problems here. */ 1328 { 1329 char *ext_names = bfd_ardata (abfd)->extended_names; 1330 char *temp = ext_names; 1331 char *limit = temp + namedata->parsed_size; 1332 1333 for (; temp < limit; ++temp) 1334 { 1335 if (*temp == ARFMAG[1]) 1336 temp[temp > ext_names && temp[-1] == '/' ? -1 : 0] = '\0'; 1337 if (*temp == '\\') 1338 *temp = '/'; 1339 } 1340 *limit = '\0'; 1341 } 1342 1343 /* Pad to an even boundary if you have to. */ 1344 bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd); 1345 bfd_ardata (abfd)->first_file_filepos += 1346 (bfd_ardata (abfd)->first_file_filepos) % 2; 1347 1348 free (namedata); 1349 } 1350 return TRUE; 1351 } 1352 1353 #ifdef VMS 1354 1355 /* Return a copy of the stuff in the filename between any :]> and a 1356 semicolon. */ 1357 1358 static const char * 1359 normalize (bfd *abfd, const char *file) 1360 { 1361 const char *first; 1362 const char *last; 1363 char *copy; 1364 1365 first = file + strlen (file) - 1; 1366 last = first + 1; 1367 1368 while (first != file) 1369 { 1370 if (*first == ';') 1371 last = first; 1372 if (*first == ':' || *first == ']' || *first == '>') 1373 { 1374 first++; 1375 break; 1376 } 1377 first--; 1378 } 1379 1380 copy = bfd_alloc (abfd, last - first + 1); 1381 if (copy == NULL) 1382 return NULL; 1383 1384 memcpy (copy, first, last - first); 1385 copy[last - first] = 0; 1386 1387 return copy; 1388 } 1389 1390 #else 1391 static const char * 1392 normalize (bfd *abfd ATTRIBUTE_UNUSED, const char *file) 1393 { 1394 return lbasename (file); 1395 } 1396 #endif 1397 1398 /* Adjust a relative path name based on the reference path. 1399 For example: 1400 1401 Relative path Reference path Result 1402 ------------- -------------- ------ 1403 bar.o lib.a bar.o 1404 foo/bar.o lib.a foo/bar.o 1405 bar.o foo/lib.a ../bar.o 1406 foo/bar.o baz/lib.a ../foo/bar.o 1407 bar.o ../lib.a <parent of current dir>/bar.o 1408 ; ../bar.o ../lib.a bar.o 1409 ; ../bar.o lib.a ../bar.o 1410 foo/bar.o ../lib.a <parent of current dir>/foo/bar.o 1411 bar.o ../../lib.a <grandparent>/<parent>/bar.o 1412 bar.o foo/baz/lib.a ../../bar.o 1413 1414 Note - the semicolons above are there to prevent the BFD chew 1415 utility from interpreting those lines as prototypes to put into 1416 the autogenerated bfd.h header... 1417 1418 Note - the string is returned in a static buffer. */ 1419 1420 static const char * 1421 adjust_relative_path (const char * path, const char * ref_path) 1422 { 1423 static char *pathbuf = NULL; 1424 static unsigned int pathbuf_len = 0; 1425 const char *pathp; 1426 const char *refp; 1427 char * lpath; 1428 char * rpath; 1429 unsigned int len; 1430 unsigned int dir_up = 0; 1431 unsigned int dir_down = 0; 1432 char *newp; 1433 char * pwd = getpwd (); 1434 const char * down; 1435 1436 /* Remove symlinks, '.' and '..' from the paths, if possible. */ 1437 lpath = lrealpath (path); 1438 pathp = lpath == NULL ? path : lpath; 1439 1440 rpath = lrealpath (ref_path); 1441 refp = rpath == NULL ? ref_path : rpath; 1442 1443 /* Remove common leading path elements. */ 1444 for (;;) 1445 { 1446 const char *e1 = pathp; 1447 const char *e2 = refp; 1448 1449 while (*e1 && ! IS_DIR_SEPARATOR (*e1)) 1450 ++e1; 1451 while (*e2 && ! IS_DIR_SEPARATOR (*e2)) 1452 ++e2; 1453 if (*e1 == '\0' || *e2 == '\0' || e1 - pathp != e2 - refp 1454 || filename_ncmp (pathp, refp, e1 - pathp) != 0) 1455 break; 1456 pathp = e1 + 1; 1457 refp = e2 + 1; 1458 } 1459 1460 len = strlen (pathp) + 1; 1461 /* For each leading path element in the reference path, 1462 insert "../" into the path. */ 1463 for (; *refp; ++refp) 1464 if (IS_DIR_SEPARATOR (*refp)) 1465 { 1466 /* PR 12710: If the path element is "../" then instead of 1467 inserting "../" we need to insert the name of the directory 1468 at the current level. */ 1469 if (refp > ref_path + 1 1470 && refp[-1] == '.' 1471 && refp[-2] == '.') 1472 dir_down ++; 1473 else 1474 dir_up ++; 1475 } 1476 1477 /* If the lrealpath calls above succeeded then we should never 1478 see dir_up and dir_down both being non-zero. */ 1479 1480 len += 3 * dir_up; 1481 1482 if (dir_down) 1483 { 1484 down = pwd + strlen (pwd) - 1; 1485 1486 while (dir_down && down > pwd) 1487 { 1488 if (IS_DIR_SEPARATOR (*down)) 1489 --dir_down; 1490 } 1491 BFD_ASSERT (dir_down == 0); 1492 len += strlen (down) + 1; 1493 } 1494 else 1495 down = NULL; 1496 1497 if (len > pathbuf_len) 1498 { 1499 if (pathbuf != NULL) 1500 free (pathbuf); 1501 pathbuf_len = 0; 1502 pathbuf = (char *) bfd_malloc (len); 1503 if (pathbuf == NULL) 1504 goto out; 1505 pathbuf_len = len; 1506 } 1507 1508 newp = pathbuf; 1509 while (dir_up-- > 0) 1510 { 1511 /* FIXME: Support Windows style path separators as well. */ 1512 strcpy (newp, "../"); 1513 newp += 3; 1514 } 1515 1516 if (down) 1517 sprintf (newp, "%s/%s", down, pathp); 1518 else 1519 strcpy (newp, pathp); 1520 1521 out: 1522 free (lpath); 1523 free (rpath); 1524 return pathbuf; 1525 } 1526 1527 /* Build a BFD style extended name table. */ 1528 1529 bfd_boolean 1530 _bfd_archive_bsd_construct_extended_name_table (bfd *abfd, 1531 char **tabloc, 1532 bfd_size_type *tablen, 1533 const char **name) 1534 { 1535 *name = "ARFILENAMES/"; 1536 return _bfd_construct_extended_name_table (abfd, FALSE, tabloc, tablen); 1537 } 1538 1539 /* Build an SVR4 style extended name table. */ 1540 1541 bfd_boolean 1542 _bfd_archive_coff_construct_extended_name_table (bfd *abfd, 1543 char **tabloc, 1544 bfd_size_type *tablen, 1545 const char **name) 1546 { 1547 *name = "//"; 1548 return _bfd_construct_extended_name_table (abfd, TRUE, tabloc, tablen); 1549 } 1550 1551 /* Follows archive_head and produces an extended name table if 1552 necessary. Returns (in tabloc) a pointer to an extended name 1553 table, and in tablen the length of the table. If it makes an entry 1554 it clobbers the filename so that the element may be written without 1555 further massage. Returns TRUE if it ran successfully, FALSE if 1556 something went wrong. A successful return may still involve a 1557 zero-length tablen! */ 1558 1559 bfd_boolean 1560 _bfd_construct_extended_name_table (bfd *abfd, 1561 bfd_boolean trailing_slash, 1562 char **tabloc, 1563 bfd_size_type *tablen) 1564 { 1565 unsigned int maxname = ar_maxnamelen (abfd); 1566 bfd_size_type total_namelen = 0; 1567 bfd *current; 1568 char *strptr; 1569 const char *last_filename; 1570 long last_stroff; 1571 1572 *tablen = 0; 1573 last_filename = NULL; 1574 1575 /* Figure out how long the table should be. */ 1576 for (current = abfd->archive_head; 1577 current != NULL; 1578 current = current->archive_next) 1579 { 1580 const char *normal; 1581 unsigned int thislen; 1582 1583 if (bfd_is_thin_archive (abfd)) 1584 { 1585 const char *filename = current->filename; 1586 1587 /* If the element being added is a member of another archive 1588 (i.e., we are flattening), use the containing archive's name. */ 1589 if (current->my_archive 1590 && ! bfd_is_thin_archive (current->my_archive)) 1591 filename = current->my_archive->filename; 1592 1593 /* If the path is the same as the previous path seen, 1594 reuse it. This can happen when flattening a thin 1595 archive that contains other archives. */ 1596 if (last_filename && filename_cmp (last_filename, filename) == 0) 1597 continue; 1598 1599 last_filename = filename; 1600 1601 /* If the path is relative, adjust it relative to 1602 the containing archive. */ 1603 if (! IS_ABSOLUTE_PATH (filename) 1604 && ! IS_ABSOLUTE_PATH (abfd->filename)) 1605 normal = adjust_relative_path (filename, abfd->filename); 1606 else 1607 normal = filename; 1608 1609 /* In a thin archive, always store the full pathname 1610 in the extended name table. */ 1611 total_namelen += strlen (normal) + 1; 1612 if (trailing_slash) 1613 /* Leave room for trailing slash. */ 1614 ++total_namelen; 1615 1616 continue; 1617 } 1618 1619 normal = normalize (current, current->filename); 1620 if (normal == NULL) 1621 return FALSE; 1622 1623 thislen = strlen (normal); 1624 1625 if (thislen > maxname 1626 && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0) 1627 thislen = maxname; 1628 1629 if (thislen > maxname) 1630 { 1631 /* Add one to leave room for \n. */ 1632 total_namelen += thislen + 1; 1633 if (trailing_slash) 1634 { 1635 /* Leave room for trailing slash. */ 1636 ++total_namelen; 1637 } 1638 } 1639 else 1640 { 1641 struct ar_hdr *hdr = arch_hdr (current); 1642 if (filename_ncmp (normal, hdr->ar_name, thislen) != 0 1643 || (thislen < sizeof hdr->ar_name 1644 && hdr->ar_name[thislen] != ar_padchar (current))) 1645 { 1646 /* Must have been using extended format even though it 1647 didn't need to. Fix it to use normal format. */ 1648 memcpy (hdr->ar_name, normal, thislen); 1649 if (thislen < maxname 1650 || (thislen == maxname && thislen < sizeof hdr->ar_name)) 1651 hdr->ar_name[thislen] = ar_padchar (current); 1652 } 1653 } 1654 } 1655 1656 if (total_namelen == 0) 1657 return TRUE; 1658 1659 *tabloc = (char *) bfd_zalloc (abfd, total_namelen); 1660 if (*tabloc == NULL) 1661 return FALSE; 1662 1663 *tablen = total_namelen; 1664 strptr = *tabloc; 1665 1666 last_filename = NULL; 1667 last_stroff = 0; 1668 1669 for (current = abfd->archive_head; 1670 current != NULL; 1671 current = current->archive_next) 1672 { 1673 const char *normal; 1674 unsigned int thislen; 1675 long stroff; 1676 const char *filename = current->filename; 1677 1678 if (bfd_is_thin_archive (abfd)) 1679 { 1680 /* If the element being added is a member of another archive 1681 (i.e., we are flattening), use the containing archive's name. */ 1682 if (current->my_archive 1683 && ! bfd_is_thin_archive (current->my_archive)) 1684 filename = current->my_archive->filename; 1685 /* If the path is the same as the previous path seen, 1686 reuse it. This can happen when flattening a thin 1687 archive that contains other archives. 1688 If the path is relative, adjust it relative to 1689 the containing archive. */ 1690 if (last_filename && filename_cmp (last_filename, filename) == 0) 1691 normal = last_filename; 1692 else if (! IS_ABSOLUTE_PATH (filename) 1693 && ! IS_ABSOLUTE_PATH (abfd->filename)) 1694 normal = adjust_relative_path (filename, abfd->filename); 1695 else 1696 normal = filename; 1697 } 1698 else 1699 { 1700 normal = normalize (current, filename); 1701 if (normal == NULL) 1702 return FALSE; 1703 } 1704 1705 thislen = strlen (normal); 1706 if (thislen > maxname || bfd_is_thin_archive (abfd)) 1707 { 1708 /* Works for now; may need to be re-engineered if we 1709 encounter an oddball archive format and want to 1710 generalise this hack. */ 1711 struct ar_hdr *hdr = arch_hdr (current); 1712 if (normal == last_filename) 1713 stroff = last_stroff; 1714 else 1715 { 1716 strcpy (strptr, normal); 1717 if (! trailing_slash) 1718 strptr[thislen] = ARFMAG[1]; 1719 else 1720 { 1721 strptr[thislen] = '/'; 1722 strptr[thislen + 1] = ARFMAG[1]; 1723 } 1724 stroff = strptr - *tabloc; 1725 last_stroff = stroff; 1726 } 1727 hdr->ar_name[0] = ar_padchar (current); 1728 if (bfd_is_thin_archive (abfd) && current->origin > 0) 1729 { 1730 int len = snprintf (hdr->ar_name + 1, maxname - 1, "%-ld:", 1731 stroff); 1732 _bfd_ar_spacepad (hdr->ar_name + 1 + len, maxname - 1 - len, 1733 "%-ld", 1734 current->origin - sizeof (struct ar_hdr)); 1735 } 1736 else 1737 _bfd_ar_spacepad (hdr->ar_name + 1, maxname - 1, "%-ld", stroff); 1738 if (normal != last_filename) 1739 { 1740 strptr += thislen + 1; 1741 if (trailing_slash) 1742 ++strptr; 1743 last_filename = filename; 1744 } 1745 } 1746 } 1747 1748 return TRUE; 1749 } 1750 1751 /* Do not construct an extended name table but transforms name field into 1752 its extended form. */ 1753 1754 bfd_boolean 1755 _bfd_archive_bsd44_construct_extended_name_table (bfd *abfd, 1756 char **tabloc, 1757 bfd_size_type *tablen, 1758 const char **name) 1759 { 1760 unsigned int maxname = ar_maxnamelen (abfd); 1761 bfd *current; 1762 1763 *tablen = 0; 1764 *tabloc = NULL; 1765 *name = NULL; 1766 1767 for (current = abfd->archive_head; 1768 current != NULL; 1769 current = current->archive_next) 1770 { 1771 const char *normal = normalize (current, current->filename); 1772 int has_space = 0; 1773 unsigned int len; 1774 1775 if (normal == NULL) 1776 return FALSE; 1777 1778 for (len = 0; normal[len]; len++) 1779 if (normal[len] == ' ') 1780 has_space = 1; 1781 1782 if (len > maxname || has_space) 1783 { 1784 struct ar_hdr *hdr = arch_hdr (current); 1785 1786 len = (len + 3) & ~3; 1787 arch_eltdata (current)->extra_size = len; 1788 _bfd_ar_spacepad (hdr->ar_name, maxname, "#1/%lu", len); 1789 } 1790 } 1791 1792 return TRUE; 1793 } 1794 1795 /* Write an archive header. */ 1797 1798 bfd_boolean 1799 _bfd_generic_write_ar_hdr (bfd *archive, bfd *abfd) 1800 { 1801 struct ar_hdr *hdr = arch_hdr (abfd); 1802 1803 if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr)) 1804 return FALSE; 1805 return TRUE; 1806 } 1807 1808 /* Write an archive header using BSD4.4 convention. */ 1809 1810 bfd_boolean 1811 _bfd_bsd44_write_ar_hdr (bfd *archive, bfd *abfd) 1812 { 1813 struct ar_hdr *hdr = arch_hdr (abfd); 1814 1815 if (is_bsd44_extended_name (hdr->ar_name)) 1816 { 1817 /* This is a BSD 4.4 extended name. */ 1818 const char *fullname = normalize (abfd, abfd->filename); 1819 unsigned int len = strlen (fullname); 1820 unsigned int padded_len = (len + 3) & ~3; 1821 1822 BFD_ASSERT (padded_len == arch_eltdata (abfd)->extra_size); 1823 1824 if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size), 1825 arch_eltdata (abfd)->parsed_size + padded_len)) 1826 return FALSE; 1827 1828 if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr)) 1829 return FALSE; 1830 1831 if (bfd_bwrite (fullname, len, archive) != len) 1832 return FALSE; 1833 1834 if (len & 3) 1835 { 1836 static const char pad[3] = { 0, 0, 0 }; 1837 1838 len = 4 - (len & 3); 1839 if (bfd_bwrite (pad, len, archive) != len) 1840 return FALSE; 1841 } 1842 } 1843 else 1844 { 1845 if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr)) 1846 return FALSE; 1847 } 1848 return TRUE; 1849 } 1850 1851 /* A couple of functions for creating ar_hdrs. */ 1853 1854 #ifdef HPUX_LARGE_AR_IDS 1855 /* Function to encode large UID/GID values according to HP. */ 1856 1857 static void 1858 hpux_uid_gid_encode (char str[6], long int id) 1859 { 1860 int cnt; 1861 1862 str[5] = '@' + (id & 3); 1863 id >>= 2; 1864 1865 for (cnt = 4; cnt >= 0; --cnt, id >>= 6) 1866 str[cnt] = ' ' + (id & 0x3f); 1867 } 1868 #endif /* HPUX_LARGE_AR_IDS */ 1869 1870 #ifndef HAVE_GETUID 1871 #define getuid() 0 1872 #endif 1873 1874 #ifndef HAVE_GETGID 1875 #define getgid() 0 1876 #endif 1877 1878 /* Takes a filename, returns an arelt_data for it, or NULL if it can't 1879 make one. The filename must refer to a filename in the filesystem. 1880 The filename field of the ar_hdr will NOT be initialized. If member 1881 is set, and it's an in-memory bfd, we fake it. */ 1882 1883 static struct areltdata * 1884 bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member) 1885 { 1886 struct stat status; 1887 struct areltdata *ared; 1888 struct ar_hdr *hdr; 1889 bfd_size_type amt; 1890 1891 if (member && (member->flags & BFD_IN_MEMORY) != 0) 1892 { 1893 /* Assume we just "made" the member, and fake it. */ 1894 struct bfd_in_memory *bim = (struct bfd_in_memory *) member->iostream; 1895 time (&status.st_mtime); 1896 status.st_uid = getuid (); 1897 status.st_gid = getgid (); 1898 status.st_mode = 0644; 1899 status.st_size = bim->size; 1900 } 1901 else if (stat (filename, &status) != 0) 1902 { 1903 bfd_set_error (bfd_error_system_call); 1904 return NULL; 1905 } 1906 1907 /* If the caller requested that the BFD generate deterministic output, 1908 fake values for modification time, UID, GID, and file mode. */ 1909 if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0) 1910 { 1911 status.st_mtime = 0; 1912 status.st_uid = 0; 1913 status.st_gid = 0; 1914 status.st_mode = 0644; 1915 } 1916 1917 amt = sizeof (struct ar_hdr) + sizeof (struct areltdata); 1918 ared = (struct areltdata *) bfd_zmalloc (amt); 1919 if (ared == NULL) 1920 return NULL; 1921 hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata)); 1922 1923 /* ar headers are space padded, not null padded! */ 1924 memset (hdr, ' ', sizeof (struct ar_hdr)); 1925 1926 _bfd_ar_spacepad (hdr->ar_date, sizeof (hdr->ar_date), "%-12ld", 1927 status.st_mtime); 1928 #ifdef HPUX_LARGE_AR_IDS 1929 /* HP has a very "special" way to handle UID/GID's with numeric values 1930 > 99999. */ 1931 if (status.st_uid > 99999) 1932 hpux_uid_gid_encode (hdr->ar_uid, (long) status.st_uid); 1933 else 1934 #endif 1935 _bfd_ar_spacepad (hdr->ar_uid, sizeof (hdr->ar_uid), "%ld", 1936 status.st_uid); 1937 #ifdef HPUX_LARGE_AR_IDS 1938 /* HP has a very "special" way to handle UID/GID's with numeric values 1939 > 99999. */ 1940 if (status.st_gid > 99999) 1941 hpux_uid_gid_encode (hdr->ar_gid, (long) status.st_gid); 1942 else 1943 #endif 1944 _bfd_ar_spacepad (hdr->ar_gid, sizeof (hdr->ar_gid), "%ld", 1945 status.st_gid); 1946 _bfd_ar_spacepad (hdr->ar_mode, sizeof (hdr->ar_mode), "%-8lo", 1947 status.st_mode); 1948 if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size), status.st_size)) 1949 { 1950 free (ared); 1951 return NULL; 1952 } 1953 memcpy (hdr->ar_fmag, ARFMAG, 2); 1954 ared->parsed_size = status.st_size; 1955 ared->arch_header = (char *) hdr; 1956 1957 return ared; 1958 } 1959 1960 /* Analogous to stat call. */ 1961 1962 int 1963 bfd_generic_stat_arch_elt (bfd *abfd, struct stat *buf) 1964 { 1965 struct ar_hdr *hdr; 1966 char *aloser; 1967 1968 if (abfd->arelt_data == NULL) 1969 { 1970 bfd_set_error (bfd_error_invalid_operation); 1971 return -1; 1972 } 1973 1974 hdr = arch_hdr (abfd); 1975 1976 #define foo(arelt, stelt, size) \ 1977 buf->stelt = strtol (hdr->arelt, &aloser, size); \ 1978 if (aloser == hdr->arelt) \ 1979 return -1; 1980 1981 /* Some platforms support special notations for large IDs. */ 1982 #ifdef HPUX_LARGE_AR_IDS 1983 # define foo2(arelt, stelt, size) \ 1984 if (hdr->arelt[5] == ' ') \ 1985 { \ 1986 foo (arelt, stelt, size); \ 1987 } \ 1988 else \ 1989 { \ 1990 int cnt; \ 1991 for (buf->stelt = cnt = 0; cnt < 5; ++cnt) \ 1992 { \ 1993 if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f) \ 1994 return -1; \ 1995 buf->stelt <<= 6; \ 1996 buf->stelt += hdr->arelt[cnt] - ' '; \ 1997 } \ 1998 if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3) \ 1999 return -1; \ 2000 buf->stelt <<= 2; \ 2001 buf->stelt += hdr->arelt[5] - '@'; \ 2002 } 2003 #else 2004 # define foo2(arelt, stelt, size) foo (arelt, stelt, size) 2005 #endif 2006 2007 foo (ar_date, st_mtime, 10); 2008 foo2 (ar_uid, st_uid, 10); 2009 foo2 (ar_gid, st_gid, 10); 2010 foo (ar_mode, st_mode, 8); 2011 2012 buf->st_size = arch_eltdata (abfd)->parsed_size; 2013 2014 return 0; 2015 } 2016 2017 void 2018 bfd_dont_truncate_arname (bfd *abfd, const char *pathname, char *arhdr) 2019 { 2020 /* FIXME: This interacts unpleasantly with ar's quick-append option. 2021 Fortunately ic960 users will never use that option. Fixing this 2022 is very hard; fortunately I know how to do it and will do so once 2023 intel's release is out the door. */ 2024 2025 struct ar_hdr *hdr = (struct ar_hdr *) arhdr; 2026 size_t length; 2027 const char *filename; 2028 size_t maxlen = ar_maxnamelen (abfd); 2029 2030 if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0) 2031 { 2032 bfd_bsd_truncate_arname (abfd, pathname, arhdr); 2033 return; 2034 } 2035 2036 filename = normalize (abfd, pathname); 2037 if (filename == NULL) 2038 { 2039 /* FIXME */ 2040 abort (); 2041 } 2042 2043 length = strlen (filename); 2044 2045 if (length <= maxlen) 2046 memcpy (hdr->ar_name, filename, length); 2047 2048 /* Add the padding character if there is room for it. */ 2049 if (length < maxlen 2050 || (length == maxlen && length < sizeof hdr->ar_name)) 2051 (hdr->ar_name)[length] = ar_padchar (abfd); 2052 } 2053 2054 void 2055 bfd_bsd_truncate_arname (bfd *abfd, const char *pathname, char *arhdr) 2056 { 2057 struct ar_hdr *hdr = (struct ar_hdr *) arhdr; 2058 size_t length; 2059 const char *filename = lbasename (pathname); 2060 size_t maxlen = ar_maxnamelen (abfd); 2061 2062 length = strlen (filename); 2063 2064 if (length <= maxlen) 2065 memcpy (hdr->ar_name, filename, length); 2066 else 2067 { 2068 /* pathname: meet procrustes */ 2069 memcpy (hdr->ar_name, filename, maxlen); 2070 length = maxlen; 2071 } 2072 2073 if (length < maxlen) 2074 (hdr->ar_name)[length] = ar_padchar (abfd); 2075 } 2076 2077 /* Store name into ar header. Truncates the name to fit. 2078 1> strip pathname to be just the basename. 2079 2> if it's short enuf to fit, stuff it in. 2080 3> If it doesn't end with .o, truncate it to fit 2081 4> truncate it before the .o, append .o, stuff THAT in. */ 2082 2083 /* This is what gnu ar does. It's better but incompatible with the 2084 bsd ar. */ 2085 2086 void 2087 bfd_gnu_truncate_arname (bfd *abfd, const char *pathname, char *arhdr) 2088 { 2089 struct ar_hdr *hdr = (struct ar_hdr *) arhdr; 2090 size_t length; 2091 const char *filename = lbasename (pathname); 2092 size_t maxlen = ar_maxnamelen (abfd); 2093 2094 length = strlen (filename); 2095 2096 if (length <= maxlen) 2097 memcpy (hdr->ar_name, filename, length); 2098 else 2099 { 2100 /* pathname: meet procrustes. */ 2101 memcpy (hdr->ar_name, filename, maxlen); 2102 if ((filename[length - 2] == '.') && (filename[length - 1] == 'o')) 2103 { 2104 hdr->ar_name[maxlen - 2] = '.'; 2105 hdr->ar_name[maxlen - 1] = 'o'; 2106 } 2107 length = maxlen; 2108 } 2109 2110 if (length < 16) 2111 (hdr->ar_name)[length] = ar_padchar (abfd); 2112 } 2113 2114 /* The BFD is open for write and has its format set to bfd_archive. */ 2116 2117 bfd_boolean 2118 _bfd_write_archive_contents (bfd *arch) 2119 { 2120 bfd *current; 2121 char *etable = NULL; 2122 bfd_size_type elength = 0; 2123 const char *ename = NULL; 2124 bfd_boolean makemap = bfd_has_map (arch); 2125 /* If no .o's, don't bother to make a map. */ 2126 bfd_boolean hasobjects = FALSE; 2127 bfd_size_type wrote; 2128 int tries; 2129 char *armag; 2130 2131 /* Verify the viability of all entries; if any of them live in the 2132 filesystem (as opposed to living in an archive open for input) 2133 then construct a fresh ar_hdr for them. */ 2134 for (current = arch->archive_head; 2135 current != NULL; 2136 current = current->archive_next) 2137 { 2138 /* This check is checking the bfds for the objects we're reading 2139 from (which are usually either an object file or archive on 2140 disk), not the archive entries we're writing to. We don't 2141 actually create bfds for the archive members, we just copy 2142 them byte-wise when we write out the archive. */ 2143 if (bfd_write_p (current)) 2144 { 2145 bfd_set_error (bfd_error_invalid_operation); 2146 goto input_err; 2147 } 2148 if (!current->arelt_data) 2149 { 2150 current->arelt_data = 2151 bfd_ar_hdr_from_filesystem (arch, current->filename, current); 2152 if (!current->arelt_data) 2153 goto input_err; 2154 2155 /* Put in the file name. */ 2156 BFD_SEND (arch, _bfd_truncate_arname, 2157 (arch, current->filename, (char *) arch_hdr (current))); 2158 } 2159 2160 if (makemap && ! hasobjects) 2161 { /* Don't bother if we won't make a map! */ 2162 if ((bfd_check_format (current, bfd_object))) 2163 hasobjects = TRUE; 2164 } 2165 } 2166 2167 if (!BFD_SEND (arch, _bfd_construct_extended_name_table, 2168 (arch, &etable, &elength, &ename))) 2169 return FALSE; 2170 2171 if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0) 2172 return FALSE; 2173 armag = ARMAG; 2174 if (bfd_is_thin_archive (arch)) 2175 armag = ARMAGT; 2176 wrote = bfd_bwrite (armag, SARMAG, arch); 2177 if (wrote != SARMAG) 2178 return FALSE; 2179 2180 if (makemap && hasobjects) 2181 { 2182 if (! _bfd_compute_and_write_armap (arch, (unsigned int) elength)) 2183 return FALSE; 2184 } 2185 2186 if (elength != 0) 2187 { 2188 struct ar_hdr hdr; 2189 2190 memset (&hdr, ' ', sizeof (struct ar_hdr)); 2191 memcpy (hdr.ar_name, ename, strlen (ename)); 2192 /* Round size up to even number in archive header. */ 2193 if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), 2194 (elength + 1) & ~(bfd_size_type) 1)) 2195 return FALSE; 2196 memcpy (hdr.ar_fmag, ARFMAG, 2); 2197 if ((bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch) 2198 != sizeof (struct ar_hdr)) 2199 || bfd_bwrite (etable, elength, arch) != elength) 2200 return FALSE; 2201 if ((elength % 2) == 1) 2202 { 2203 if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1) 2204 return FALSE; 2205 } 2206 } 2207 2208 for (current = arch->archive_head; 2209 current != NULL; 2210 current = current->archive_next) 2211 { 2212 char buffer[DEFAULT_BUFFERSIZE]; 2213 bfd_size_type remaining = arelt_size (current); 2214 2215 /* Write ar header. */ 2216 if (!_bfd_write_ar_hdr (arch, current)) 2217 return FALSE; 2218 if (bfd_is_thin_archive (arch)) 2219 continue; 2220 if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0) 2221 goto input_err; 2222 2223 while (remaining) 2224 { 2225 unsigned int amt = DEFAULT_BUFFERSIZE; 2226 2227 if (amt > remaining) 2228 amt = remaining; 2229 errno = 0; 2230 if (bfd_bread (buffer, amt, current) != amt) 2231 { 2232 if (bfd_get_error () != bfd_error_system_call) 2233 bfd_set_error (bfd_error_file_truncated); 2234 goto input_err; 2235 } 2236 if (bfd_bwrite (buffer, amt, arch) != amt) 2237 return FALSE; 2238 remaining -= amt; 2239 } 2240 2241 if ((arelt_size (current) % 2) == 1) 2242 { 2243 if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1) 2244 return FALSE; 2245 } 2246 } 2247 2248 if (makemap && hasobjects) 2249 { 2250 /* Verify the timestamp in the archive file. If it would not be 2251 accepted by the linker, rewrite it until it would be. If 2252 anything odd happens, break out and just return. (The 2253 Berkeley linker checks the timestamp and refuses to read the 2254 table-of-contents if it is >60 seconds less than the file's 2255 modified-time. That painful hack requires this painful hack. */ 2256 tries = 1; 2257 do 2258 { 2259 if (bfd_update_armap_timestamp (arch)) 2260 break; 2261 (*_bfd_error_handler) 2262 (_("Warning: writing archive was slow: rewriting timestamp\n")); 2263 } 2264 while (++tries < 6); 2265 } 2266 2267 return TRUE; 2268 2269 input_err: 2270 bfd_set_error (bfd_error_on_input, current, bfd_get_error ()); 2271 return FALSE; 2272 } 2273 2274 /* Note that the namidx for the first symbol is 0. */ 2276 2277 bfd_boolean 2278 _bfd_compute_and_write_armap (bfd *arch, unsigned int elength) 2279 { 2280 char *first_name = NULL; 2281 bfd *current; 2282 file_ptr elt_no = 0; 2283 struct orl *map = NULL; 2284 unsigned int orl_max = 1024; /* Fine initial default. */ 2285 unsigned int orl_count = 0; 2286 int stridx = 0; 2287 asymbol **syms = NULL; 2288 long syms_max = 0; 2289 bfd_boolean ret; 2290 bfd_size_type amt; 2291 2292 /* Dunno if this is the best place for this info... */ 2293 if (elength != 0) 2294 elength += sizeof (struct ar_hdr); 2295 elength += elength % 2; 2296 2297 amt = orl_max * sizeof (struct orl); 2298 map = (struct orl *) bfd_malloc (amt); 2299 if (map == NULL) 2300 goto error_return; 2301 2302 /* We put the symbol names on the arch objalloc, and then discard 2303 them when done. */ 2304 first_name = (char *) bfd_alloc (arch, 1); 2305 if (first_name == NULL) 2306 goto error_return; 2307 2308 /* Drop all the files called __.SYMDEF, we're going to make our own. */ 2309 while (arch->archive_head 2310 && strcmp (arch->archive_head->filename, "__.SYMDEF") == 0) 2311 arch->archive_head = arch->archive_head->archive_next; 2312 2313 /* Map over each element. */ 2314 for (current = arch->archive_head; 2315 current != NULL; 2316 current = current->archive_next, elt_no++) 2317 { 2318 if (bfd_check_format (current, bfd_object) 2319 && (bfd_get_file_flags (current) & HAS_SYMS) != 0) 2320 { 2321 long storage; 2322 long symcount; 2323 long src_count; 2324 2325 storage = bfd_get_symtab_upper_bound (current); 2326 if (storage < 0) 2327 goto error_return; 2328 2329 if (storage != 0) 2330 { 2331 if (storage > syms_max) 2332 { 2333 if (syms_max > 0) 2334 free (syms); 2335 syms_max = storage; 2336 syms = (asymbol **) bfd_malloc (syms_max); 2337 if (syms == NULL) 2338 goto error_return; 2339 } 2340 symcount = bfd_canonicalize_symtab (current, syms); 2341 if (symcount < 0) 2342 goto error_return; 2343 2344 /* Now map over all the symbols, picking out the ones we 2345 want. */ 2346 for (src_count = 0; src_count < symcount; src_count++) 2347 { 2348 flagword flags = (syms[src_count])->flags; 2349 asection *sec = syms[src_count]->section; 2350 2351 if (((flags & (BSF_GLOBAL 2352 | BSF_WEAK 2353 | BSF_INDIRECT 2354 | BSF_GNU_UNIQUE)) != 0 2355 || bfd_is_com_section (sec)) 2356 && ! bfd_is_und_section (sec)) 2357 { 2358 bfd_size_type namelen; 2359 struct orl *new_map; 2360 2361 /* This symbol will go into the archive header. */ 2362 if (orl_count == orl_max) 2363 { 2364 orl_max *= 2; 2365 amt = orl_max * sizeof (struct orl); 2366 new_map = (struct orl *) bfd_realloc (map, amt); 2367 if (new_map == NULL) 2368 goto error_return; 2369 2370 map = new_map; 2371 } 2372 2373 if (strcmp (syms[src_count]->name, "__gnu_lto_slim") == 0) 2374 (*_bfd_error_handler) 2375 (_("%s: plugin needed to handle lto object"), 2376 bfd_get_filename (current)); 2377 namelen = strlen (syms[src_count]->name); 2378 amt = sizeof (char *); 2379 map[orl_count].name = (char **) bfd_alloc (arch, amt); 2380 if (map[orl_count].name == NULL) 2381 goto error_return; 2382 *(map[orl_count].name) = (char *) bfd_alloc (arch, 2383 namelen + 1); 2384 if (*(map[orl_count].name) == NULL) 2385 goto error_return; 2386 strcpy (*(map[orl_count].name), syms[src_count]->name); 2387 map[orl_count].u.abfd = current; 2388 map[orl_count].namidx = stridx; 2389 2390 stridx += namelen + 1; 2391 ++orl_count; 2392 } 2393 } 2394 } 2395 2396 /* Now ask the BFD to free up any cached information, so we 2397 don't fill all of memory with symbol tables. */ 2398 if (! bfd_free_cached_info (current)) 2399 goto error_return; 2400 } 2401 } 2402 2403 /* OK, now we have collected all the data, let's write them out. */ 2404 ret = BFD_SEND (arch, write_armap, 2405 (arch, elength, map, orl_count, stridx)); 2406 2407 if (syms_max > 0) 2408 free (syms); 2409 if (map != NULL) 2410 free (map); 2411 if (first_name != NULL) 2412 bfd_release (arch, first_name); 2413 2414 return ret; 2415 2416 error_return: 2417 if (syms_max > 0) 2418 free (syms); 2419 if (map != NULL) 2420 free (map); 2421 if (first_name != NULL) 2422 bfd_release (arch, first_name); 2423 2424 return FALSE; 2425 } 2426 2427 bfd_boolean 2428 bsd_write_armap (bfd *arch, 2429 unsigned int elength, 2430 struct orl *map, 2431 unsigned int orl_count, 2432 int stridx) 2433 { 2434 int padit = stridx & 1; 2435 unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE; 2436 unsigned int stringsize = stridx + padit; 2437 /* Include 8 bytes to store ranlibsize and stringsize in output. */ 2438 unsigned int mapsize = ranlibsize + stringsize + 8; 2439 file_ptr firstreal; 2440 bfd *current = arch->archive_head; 2441 bfd *last_elt = current; /* Last element arch seen. */ 2442 bfd_byte temp[4]; 2443 unsigned int count; 2444 struct ar_hdr hdr; 2445 long uid, gid; 2446 2447 firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG; 2448 2449 /* If deterministic, we use 0 as the timestamp in the map. 2450 Some linkers may require that the archive filesystem modification 2451 time is less than (or near to) the archive map timestamp. Those 2452 linkers should not be used with deterministic mode. (GNU ld and 2453 Gold do not have this restriction.) */ 2454 bfd_ardata (arch)->armap_timestamp = 0; 2455 uid = 0; 2456 gid = 0; 2457 if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0) 2458 { 2459 struct stat statbuf; 2460 2461 if (stat (arch->filename, &statbuf) == 0) 2462 bfd_ardata (arch)->armap_timestamp = (statbuf.st_mtime 2463 + ARMAP_TIME_OFFSET); 2464 uid = getuid(); 2465 gid = getgid(); 2466 } 2467 2468 memset (&hdr, ' ', sizeof (struct ar_hdr)); 2469 memcpy (hdr.ar_name, RANLIBMAG, strlen (RANLIBMAG)); 2470 bfd_ardata (arch)->armap_datepos = (SARMAG 2471 + offsetof (struct ar_hdr, ar_date[0])); 2472 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld", 2473 bfd_ardata (arch)->armap_timestamp); 2474 _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", uid); 2475 _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", gid); 2476 if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize)) 2477 return FALSE; 2478 memcpy (hdr.ar_fmag, ARFMAG, 2); 2479 if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch) 2480 != sizeof (struct ar_hdr)) 2481 return FALSE; 2482 H_PUT_32 (arch, ranlibsize, temp); 2483 if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp)) 2484 return FALSE; 2485 2486 for (count = 0; count < orl_count; count++) 2487 { 2488 unsigned int offset; 2489 bfd_byte buf[BSD_SYMDEF_SIZE]; 2490 2491 if (map[count].u.abfd != last_elt) 2492 { 2493 do 2494 { 2495 struct areltdata *ared = arch_eltdata (current); 2496 2497 firstreal += (ared->parsed_size + ared->extra_size 2498 + sizeof (struct ar_hdr)); 2499 firstreal += firstreal % 2; 2500 current = current->archive_next; 2501 } 2502 while (current != map[count].u.abfd); 2503 } 2504 2505 /* The archive file format only has 4 bytes to store the offset 2506 of the member. Check to make sure that firstreal has not grown 2507 too big. */ 2508 offset = (unsigned int) firstreal; 2509 if (firstreal != (file_ptr) offset) 2510 { 2511 bfd_set_error (bfd_error_file_truncated); 2512 return FALSE; 2513 } 2514 2515 last_elt = current; 2516 H_PUT_32 (arch, map[count].namidx, buf); 2517 H_PUT_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE); 2518 if (bfd_bwrite (buf, BSD_SYMDEF_SIZE, arch) 2519 != BSD_SYMDEF_SIZE) 2520 return FALSE; 2521 } 2522 2523 /* Now write the strings themselves. */ 2524 H_PUT_32 (arch, stringsize, temp); 2525 if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp)) 2526 return FALSE; 2527 for (count = 0; count < orl_count; count++) 2528 { 2529 size_t len = strlen (*map[count].name) + 1; 2530 2531 if (bfd_bwrite (*map[count].name, len, arch) != len) 2532 return FALSE; 2533 } 2534 2535 /* The spec sez this should be a newline. But in order to be 2536 bug-compatible for sun's ar we use a null. */ 2537 if (padit) 2538 { 2539 if (bfd_bwrite ("", 1, arch) != 1) 2540 return FALSE; 2541 } 2542 2543 return TRUE; 2544 } 2545 2546 /* At the end of archive file handling, update the timestamp in the 2547 file, so the linker will accept it. 2548 2549 Return TRUE if the timestamp was OK, or an unusual problem happened. 2550 Return FALSE if we updated the timestamp. */ 2551 2552 bfd_boolean 2553 _bfd_archive_bsd_update_armap_timestamp (bfd *arch) 2554 { 2555 struct stat archstat; 2556 struct ar_hdr hdr; 2557 2558 /* If creating deterministic archives, just leave the timestamp as-is. */ 2559 if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) != 0) 2560 return TRUE; 2561 2562 /* Flush writes, get last-write timestamp from file, and compare it 2563 to the timestamp IN the file. */ 2564 bfd_flush (arch); 2565 if (bfd_stat (arch, &archstat) == -1) 2566 { 2567 bfd_perror (_("Reading archive file mod timestamp")); 2568 2569 /* Can't read mod time for some reason. */ 2570 return TRUE; 2571 } 2572 if (((long) archstat.st_mtime) <= bfd_ardata (arch)->armap_timestamp) 2573 /* OK by the linker's rules. */ 2574 return TRUE; 2575 2576 /* Update the timestamp. */ 2577 bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET; 2578 2579 /* Prepare an ASCII version suitable for writing. */ 2580 memset (hdr.ar_date, ' ', sizeof (hdr.ar_date)); 2581 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld", 2582 bfd_ardata (arch)->armap_timestamp); 2583 2584 /* Write it into the file. */ 2585 bfd_ardata (arch)->armap_datepos = (SARMAG 2586 + offsetof (struct ar_hdr, ar_date[0])); 2587 if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0 2588 || (bfd_bwrite (hdr.ar_date, sizeof (hdr.ar_date), arch) 2589 != sizeof (hdr.ar_date))) 2590 { 2591 bfd_perror (_("Writing updated armap timestamp")); 2592 2593 /* Some error while writing. */ 2594 return TRUE; 2595 } 2596 2597 /* We updated the timestamp successfully. */ 2598 return FALSE; 2599 } 2600 2601 /* A coff armap looks like : 2603 lARMAG 2604 struct ar_hdr with name = '/' 2605 number of symbols 2606 offset of file for symbol 0 2607 offset of file for symbol 1 2608 2609 offset of file for symbol n-1 2610 symbol name 0 2611 symbol name 1 2612 2613 symbol name n-1 */ 2614 2615 bfd_boolean 2616 coff_write_armap (bfd *arch, 2617 unsigned int elength, 2618 struct orl *map, 2619 unsigned int symbol_count, 2620 int stridx) 2621 { 2622 /* The size of the ranlib is the number of exported symbols in the 2623 archive * the number of bytes in an int, + an int for the count. */ 2624 unsigned int ranlibsize = (symbol_count * 4) + 4; 2625 unsigned int stringsize = stridx; 2626 unsigned int mapsize = stringsize + ranlibsize; 2627 file_ptr archive_member_file_ptr; 2628 bfd *current = arch->archive_head; 2629 unsigned int count; 2630 struct ar_hdr hdr; 2631 int padit = mapsize & 1; 2632 2633 if (padit) 2634 mapsize++; 2635 2636 /* Work out where the first object file will go in the archive. */ 2637 archive_member_file_ptr = (mapsize 2638 + elength 2639 + sizeof (struct ar_hdr) 2640 + SARMAG); 2641 2642 memset (&hdr, ' ', sizeof (struct ar_hdr)); 2643 hdr.ar_name[0] = '/'; 2644 if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize)) 2645 return FALSE; 2646 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld", 2647 ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0 2648 ? time (NULL) : 0)); 2649 /* This, at least, is what Intel coff sets the values to. */ 2650 _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", 0); 2651 _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", 0); 2652 _bfd_ar_spacepad (hdr.ar_mode, sizeof (hdr.ar_mode), "%-7lo", 0); 2653 memcpy (hdr.ar_fmag, ARFMAG, 2); 2654 2655 /* Write the ar header for this item and the number of symbols. */ 2656 if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch) 2657 != sizeof (struct ar_hdr)) 2658 return FALSE; 2659 2660 if (!bfd_write_bigendian_4byte_int (arch, symbol_count)) 2661 return FALSE; 2662 2663 /* Two passes, first write the file offsets for each symbol - 2664 remembering that each offset is on a two byte boundary. */ 2665 2666 /* Write out the file offset for the file associated with each 2667 symbol, and remember to keep the offsets padded out. */ 2668 2669 current = arch->archive_head; 2670 count = 0; 2671 while (current != NULL && count < symbol_count) 2672 { 2673 /* For each symbol which is used defined in this object, write 2674 out the object file's address in the archive. */ 2675 2676 while (count < symbol_count && map[count].u.abfd == current) 2677 { 2678 unsigned int offset = (unsigned int) archive_member_file_ptr; 2679 2680 /* Catch an attempt to grow an archive past its 4Gb limit. */ 2681 if (archive_member_file_ptr != (file_ptr) offset) 2682 { 2683 bfd_set_error (bfd_error_file_truncated); 2684 return FALSE; 2685 } 2686 if (!bfd_write_bigendian_4byte_int (arch, offset)) 2687 return FALSE; 2688 count++; 2689 } 2690 archive_member_file_ptr += sizeof (struct ar_hdr); 2691 if (! bfd_is_thin_archive (arch)) 2692 { 2693 /* Add size of this archive entry. */ 2694 archive_member_file_ptr += arelt_size (current); 2695 /* Remember about the even alignment. */ 2696 archive_member_file_ptr += archive_member_file_ptr % 2; 2697 } 2698 current = current->archive_next; 2699 } 2700 2701 /* Now write the strings themselves. */ 2702 for (count = 0; count < symbol_count; count++) 2703 { 2704 size_t len = strlen (*map[count].name) + 1; 2705 2706 if (bfd_bwrite (*map[count].name, len, arch) != len) 2707 return FALSE; 2708 } 2709 2710 /* The spec sez this should be a newline. But in order to be 2711 bug-compatible for arc960 we use a null. */ 2712 if (padit) 2713 { 2714 if (bfd_bwrite ("", 1, arch) != 1) 2715 return FALSE; 2716 } 2717 2718 return TRUE; 2719 } 2720 2721 static int 2722 archive_close_worker (void **slot, void *inf ATTRIBUTE_UNUSED) 2723 { 2724 struct ar_cache *ent = (struct ar_cache *) *slot; 2725 2726 bfd_close_all_done (ent->arbfd); 2727 return 1; 2728 } 2729 2730 bfd_boolean 2731 _bfd_archive_close_and_cleanup (bfd *abfd) 2732 { 2733 if (bfd_read_p (abfd) && abfd->format == bfd_archive) 2734 { 2735 bfd *nbfd; 2736 bfd *next; 2737 htab_t htab; 2738 2739 /* Close nested archives (if this bfd is a thin archive). */ 2740 for (nbfd = abfd->nested_archives; nbfd; nbfd = next) 2741 { 2742 next = nbfd->archive_next; 2743 bfd_close (nbfd); 2744 } 2745 2746 htab = bfd_ardata (abfd)->cache; 2747 if (htab) 2748 { 2749 htab_traverse_noresize (htab, archive_close_worker, NULL); 2750 htab_delete (htab); 2751 bfd_ardata (abfd)->cache = NULL; 2752 } 2753 } 2754 if (arch_eltdata (abfd) != NULL) 2755 { 2756 struct areltdata *ared = arch_eltdata (abfd); 2757 htab_t htab = (htab_t) ared->parent_cache; 2758 2759 if (htab) 2760 { 2761 struct ar_cache ent; 2762 void **slot; 2763 2764 ent.ptr = ared->key; 2765 slot = htab_find_slot (htab, &ent, NO_INSERT); 2766 if (slot != NULL) 2767 { 2768 BFD_ASSERT (((struct ar_cache *) *slot)->arbfd == abfd); 2769 htab_clear_slot (htab, slot); 2770 } 2771 } 2772 } 2773 if (abfd->is_linker_output) 2774 (*abfd->link.hash->hash_table_free) (abfd); 2775 2776 return TRUE; 2777 } 2778