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