1 /* BFD back-end for archive files (libraries). 2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 3 Free Software Foundation, Inc. 4 Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault. 5 6 This file is part of BFD, the Binary File Descriptor library. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 21 22 /* 23 @setfilename archive-info 24 SECTION 25 Archives 26 27 DESCRIPTION 28 An archive (or library) is just another BFD. It has a symbol 29 table, although there's not much a user program will do with it. 30 31 The big difference between an archive BFD and an ordinary BFD 32 is that the archive doesn't have sections. Instead it has a 33 chain of BFDs that are considered its contents. These BFDs can 34 be manipulated like any other. The BFDs contained in an 35 archive opened for reading will all be opened for reading. You 36 may put either input or output BFDs into an archive opened for 37 output; they will be handled correctly when the archive is closed. 38 39 Use <<bfd_openr_next_archived_file>> to step through 40 the contents of an archive opened for input. You don't 41 have to read the entire archive if you don't want 42 to! Read it until you find what you want. 43 44 Archive contents of output BFDs are chained through the 45 <<next>> pointer in a BFD. The first one is findable through 46 the <<archive_head>> slot of the archive. Set it with 47 <<bfd_set_archive_head>> (q.v.). A given BFD may be in only one 48 open output archive at a time. 49 50 As expected, the BFD archive code is more general than the 51 archive code of any given environment. BFD archives may 52 contain files of different formats (e.g., a.out and coff) and 53 even different architectures. You may even place archives 54 recursively into archives! 55 56 This can cause unexpected confusion, since some archive 57 formats are more expressive than others. For instance, Intel 58 COFF archives can preserve long filenames; SunOS a.out archives 59 cannot. If you move a file from the first to the second 60 format and back again, the filename may be truncated. 61 Likewise, different a.out environments have different 62 conventions as to how they truncate filenames, whether they 63 preserve directory names in filenames, etc. When 64 interoperating with native tools, be sure your files are 65 homogeneous. 66 67 Beware: most of these formats do not react well to the 68 presence of spaces in filenames. We do the best we can, but 69 can't always handle this case due to restrictions in the format of 70 archives. Many Unix utilities are braindead in regards to 71 spaces and such in filenames anyway, so this shouldn't be much 72 of a restriction. 73 74 Archives are supported in BFD in <<archive.c>>. 75 76 */ 77 78 /* Assumes: 79 o - all archive elements start on an even boundary, newline padded; 80 o - all arch headers are char *; 81 o - all arch headers are the same size (across architectures). 82 */ 83 84 /* Some formats provide a way to cram a long filename into the short 85 (16 chars) space provided by a BSD archive. The trick is: make a 86 special "file" in the front of the archive, sort of like the SYMDEF 87 entry. If the filename is too long to fit, put it in the extended 88 name table, and use its index as the filename. To prevent 89 confusion prepend the index with a space. This means you can't 90 have filenames that start with a space, but then again, many Unix 91 utilities can't handle that anyway. 92 93 This scheme unfortunately requires that you stand on your head in 94 order to write an archive since you need to put a magic file at the 95 front, and need to touch every entry to do so. C'est la vie. 96 97 We support two variants of this idea: 98 The SVR4 format (extended name table is named "//"), 99 and an extended pseudo-BSD variant (extended name table is named 100 "ARFILENAMES/"). The origin of the latter format is uncertain. 101 102 BSD 4.4 uses a third scheme: It writes a long filename 103 directly after the header. This allows 'ar q' to work. 104 We currently can read BSD 4.4 archives, but not write them. 105 */ 106 107 /* Summary of archive member names: 108 109 Symbol table (must be first): 110 "__.SYMDEF " - Symbol table, Berkeley style, produced by ranlib. 111 "/ " - Symbol table, system 5 style. 112 113 Long name table (must be before regular file members): 114 "// " - Long name table, System 5 R4 style. 115 "ARFILENAMES/ " - Long name table, non-standard extended BSD (not BSD 4.4). 116 117 Regular file members with short names: 118 "filename.o/ " - Regular file, System 5 style (embedded spaces ok). 119 "filename.o " - Regular file, Berkeley style (no embedded spaces). 120 121 Regular files with long names (or embedded spaces, for BSD variants): 122 "/18 " - SVR4 style, name at offset 18 in name table. 123 "#1/23 " - Long name (or embedded paces) 23 characters long, 124 BSD 4.4 style, full name follows header. 125 Implemented for reading, not writing. 126 " 18 " - Long name 18 characters long, extended pseudo-BSD. 127 */ 128 129 #include "bfd.h" 130 #include "sysdep.h" 131 #include "libbfd.h" 132 #include "aout/ar.h" 133 #include "aout/ranlib.h" 134 #include <ctype.h> 135 136 #ifndef errno 137 extern int errno; 138 #endif 139 140 #ifdef GNU960 141 #define BFD_GNU960_ARMAG(abfd) (BFD_COFF_FILE_P((abfd)) ? ARMAG : ARMAGB) 142 #endif 143 144 /* Define offsetof for those systems which lack it */ 145 146 #ifndef offsetof 147 #define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) 148 #endif 149 150 /* We keep a cache of archive filepointers to archive elements to 151 speed up searching the archive by filepos. We only add an entry to 152 the cache when we actually read one. We also don't sort the cache; 153 it's generally short enough to search linearly. 154 Note that the pointers here point to the front of the ar_hdr, not 155 to the front of the contents! 156 */ 157 struct ar_cache 158 { 159 file_ptr ptr; 160 bfd *arelt; 161 struct ar_cache *next; 162 }; 163 164 #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char) 165 #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen) 166 167 #define arch_eltdata(bfd) ((struct areltdata *)((bfd)->arelt_data)) 168 #define arch_hdr(bfd) ((struct ar_hdr *)arch_eltdata(bfd)->arch_header) 169 170 static char *get_extended_arelt_filename PARAMS ((bfd *arch, 171 const char *name)); 172 static boolean do_slurp_bsd_armap PARAMS ((bfd *abfd)); 173 static boolean do_slurp_coff_armap PARAMS ((bfd *abfd)); 174 static const char *normalize PARAMS ((bfd *, const char *file)); 175 static struct areltdata *bfd_ar_hdr_from_filesystem PARAMS ((bfd *abfd, 176 const char *, 177 bfd *member)); 178 179 boolean 180 _bfd_generic_mkarchive (abfd) 181 bfd *abfd; 182 { 183 abfd->tdata.aout_ar_data = ((struct artdata *) 184 bfd_zalloc (abfd, sizeof (struct artdata))); 185 186 if (bfd_ardata (abfd) == NULL) 187 return false; 188 189 bfd_ardata (abfd)->cache = NULL; 190 bfd_ardata (abfd)->archive_head = NULL; 191 bfd_ardata (abfd)->symdefs = NULL; 192 bfd_ardata (abfd)->extended_names = NULL; 193 bfd_ardata (abfd)->tdata = NULL; 194 195 return true; 196 } 197 198 /* 199 FUNCTION 200 bfd_get_next_mapent 201 202 SYNOPSIS 203 symindex bfd_get_next_mapent(bfd *abfd, symindex previous, carsym **sym); 204 205 DESCRIPTION 206 Step through archive @var{abfd}'s symbol table (if it 207 has one). Successively update @var{sym} with the next symbol's 208 information, returning that symbol's (internal) index into the 209 symbol table. 210 211 Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get 212 the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already 213 got the last one. 214 215 A <<carsym>> is a canonical archive symbol. The only 216 user-visible element is its name, a null-terminated string. 217 */ 218 219 symindex 220 bfd_get_next_mapent (abfd, prev, entry) 221 bfd *abfd; 222 symindex prev; 223 carsym **entry; 224 { 225 if (!bfd_has_map (abfd)) 226 { 227 bfd_set_error (bfd_error_invalid_operation); 228 return BFD_NO_MORE_SYMBOLS; 229 } 230 231 if (prev == BFD_NO_MORE_SYMBOLS) 232 prev = 0; 233 else 234 ++prev; 235 if (prev >= bfd_ardata (abfd)->symdef_count) 236 return BFD_NO_MORE_SYMBOLS; 237 238 *entry = (bfd_ardata (abfd)->symdefs + prev); 239 return prev; 240 } 241 242 /* To be called by backends only */ 243 244 bfd * 245 _bfd_create_empty_archive_element_shell (obfd) 246 bfd *obfd; 247 { 248 return _bfd_new_bfd_contained_in (obfd); 249 } 250 251 /* 252 FUNCTION 253 bfd_set_archive_head 254 255 SYNOPSIS 256 boolean bfd_set_archive_head(bfd *output, bfd *new_head); 257 258 DESCRIPTION 259 Set the head of the chain of 260 BFDs contained in the archive @var{output} to @var{new_head}. 261 */ 262 263 boolean 264 bfd_set_archive_head (output_archive, new_head) 265 bfd *output_archive; 266 bfd *new_head; 267 { 268 269 output_archive->archive_head = new_head; 270 return true; 271 } 272 273 bfd * 274 _bfd_look_for_bfd_in_cache (arch_bfd, filepos) 275 bfd *arch_bfd; 276 file_ptr filepos; 277 { 278 struct ar_cache *current; 279 280 for (current = bfd_ardata (arch_bfd)->cache; current != NULL; 281 current = current->next) 282 if (current->ptr == filepos) 283 return current->arelt; 284 285 return NULL; 286 } 287 288 /* Kind of stupid to call cons for each one, but we don't do too many */ 289 boolean 290 _bfd_add_bfd_to_archive_cache (arch_bfd, filepos, new_elt) 291 bfd *arch_bfd, *new_elt; 292 file_ptr filepos; 293 { 294 struct ar_cache *new_cache = ((struct ar_cache *) 295 bfd_zalloc (arch_bfd, 296 sizeof (struct ar_cache))); 297 298 if (new_cache == NULL) 299 return false; 300 301 new_cache->ptr = filepos; 302 new_cache->arelt = new_elt; 303 new_cache->next = (struct ar_cache *) NULL; 304 if (bfd_ardata (arch_bfd)->cache == NULL) 305 bfd_ardata (arch_bfd)->cache = new_cache; 306 else 307 { 308 struct ar_cache *current = bfd_ardata (arch_bfd)->cache; 309 310 while (current->next != NULL) 311 current = current->next; 312 current->next = new_cache; 313 } 314 315 return true; 316 } 317 318 /* The name begins with space. Hence the rest of the name is an index into 319 the string table. */ 320 321 static char * 322 get_extended_arelt_filename (arch, name) 323 bfd *arch; 324 const char *name; 325 { 326 unsigned long index = 0; 327 328 /* Should extract string so that I can guarantee not to overflow into 329 the next region, but I'm too lazy. */ 330 errno = 0; 331 /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */ 332 index = strtol (name + 1, NULL, 10); 333 if (errno != 0) 334 { 335 bfd_set_error (bfd_error_malformed_archive); 336 return NULL; 337 } 338 339 return bfd_ardata (arch)->extended_names + index; 340 } 341 342 /* This functions reads an arch header and returns an areltdata pointer, or 343 NULL on error. 344 345 Presumes the file pointer is already in the right place (ie pointing 346 to the ar_hdr in the file). Moves the file pointer; on success it 347 should be pointing to the front of the file contents; on failure it 348 could have been moved arbitrarily. 349 */ 350 351 PTR 352 _bfd_generic_read_ar_hdr (abfd) 353 bfd *abfd; 354 { 355 return _bfd_generic_read_ar_hdr_mag (abfd, (const char *) NULL); 356 } 357 358 /* Alpha ECOFF uses an optional different ARFMAG value, so we have a 359 variant of _bfd_generic_read_ar_hdr which accepts a magic string. */ 360 361 PTR 362 _bfd_generic_read_ar_hdr_mag (abfd, mag) 363 bfd *abfd; 364 const char *mag; 365 { 366 struct ar_hdr hdr; 367 char *hdrp = (char *) &hdr; 368 unsigned int parsed_size; 369 struct areltdata *ared; 370 char *filename = NULL; 371 unsigned int namelen = 0; 372 unsigned int allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr); 373 char *allocptr = 0; 374 375 if (bfd_read ((PTR) hdrp, 1, sizeof (struct ar_hdr), abfd) 376 != sizeof (struct ar_hdr)) 377 { 378 if (bfd_get_error () != bfd_error_system_call) 379 bfd_set_error (bfd_error_no_more_archived_files); 380 return NULL; 381 } 382 if (strncmp (hdr.ar_fmag, ARFMAG, 2) != 0 383 && (mag == NULL 384 || strncmp (hdr.ar_fmag, mag, 2) != 0)) 385 { 386 bfd_set_error (bfd_error_malformed_archive); 387 return NULL; 388 } 389 390 errno = 0; 391 parsed_size = strtol (hdr.ar_size, NULL, 10); 392 if (errno != 0) 393 { 394 bfd_set_error (bfd_error_malformed_archive); 395 return NULL; 396 } 397 398 /* Extract the filename from the archive - there are two ways to 399 specify an extended name table, either the first char of the 400 name is a space, or it's a slash. */ 401 if ((hdr.ar_name[0] == '/' 402 || (hdr.ar_name[0] == ' ' 403 && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL)) 404 && bfd_ardata (abfd)->extended_names != NULL) 405 { 406 filename = get_extended_arelt_filename (abfd, hdr.ar_name); 407 if (filename == NULL) 408 { 409 bfd_set_error (bfd_error_malformed_archive); 410 return NULL; 411 } 412 } 413 /* BSD4.4-style long filename. 414 Only implemented for reading, so far! */ 415 else if (hdr.ar_name[0] == '#' 416 && hdr.ar_name[1] == '1' 417 && hdr.ar_name[2] == '/' 418 && isdigit ((unsigned char) hdr.ar_name[3])) 419 { 420 /* BSD-4.4 extended name */ 421 namelen = atoi (&hdr.ar_name[3]); 422 allocsize += namelen + 1; 423 parsed_size -= namelen; 424 425 allocptr = bfd_zalloc (abfd, allocsize); 426 if (allocptr == NULL) 427 return NULL; 428 filename = (allocptr 429 + sizeof (struct areltdata) 430 + sizeof (struct ar_hdr)); 431 if (bfd_read (filename, 1, namelen, abfd) != namelen) 432 { 433 if (bfd_get_error () != bfd_error_system_call) 434 bfd_set_error (bfd_error_no_more_archived_files); 435 return NULL; 436 } 437 filename[namelen] = '\0'; 438 } 439 else 440 { 441 /* We judge the end of the name by looking for '/' or ' '. 442 Note: The SYSV format (terminated by '/') allows embedded 443 spaces, so only look for ' ' if we don't find '/'. */ 444 445 char *e; 446 e = memchr (hdr.ar_name, '\0', ar_maxnamelen (abfd)); 447 if (e == NULL) 448 { 449 e = memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)); 450 if (e == NULL) 451 e = memchr (hdr.ar_name, ' ', ar_maxnamelen (abfd)); 452 } 453 454 if (e != NULL) 455 namelen = e - hdr.ar_name; 456 else 457 { 458 /* If we didn't find a termination character, then the name 459 must be the entire field. */ 460 namelen = ar_maxnamelen (abfd); 461 } 462 463 allocsize += namelen + 1; 464 } 465 466 if (!allocptr) 467 { 468 allocptr = bfd_zalloc (abfd, allocsize); 469 if (allocptr == NULL) 470 return NULL; 471 } 472 473 ared = (struct areltdata *) allocptr; 474 475 ared->arch_header = allocptr + sizeof (struct areltdata); 476 memcpy ((char *) ared->arch_header, (char *) &hdr, sizeof (struct ar_hdr)); 477 ared->parsed_size = parsed_size; 478 479 if (filename != NULL) 480 ared->filename = filename; 481 else 482 { 483 ared->filename = allocptr + (sizeof (struct areltdata) + 484 sizeof (struct ar_hdr)); 485 if (namelen) 486 memcpy (ared->filename, hdr.ar_name, namelen); 487 ared->filename[namelen] = '\0'; 488 } 489 490 return (PTR) ared; 491 } 492 493 /* This is an internal function; it's mainly used when indexing 494 through the archive symbol table, but also used to get the next 495 element, since it handles the bookkeeping so nicely for us. */ 496 497 bfd * 498 _bfd_get_elt_at_filepos (archive, filepos) 499 bfd *archive; 500 file_ptr filepos; 501 { 502 struct areltdata *new_areldata; 503 bfd *n_nfd; 504 505 n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos); 506 if (n_nfd) 507 return n_nfd; 508 509 if (0 > bfd_seek (archive, filepos, SEEK_SET)) 510 return NULL; 511 512 if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL) 513 return NULL; 514 515 n_nfd = _bfd_create_empty_archive_element_shell (archive); 516 if (n_nfd == NULL) 517 { 518 bfd_release (archive, (PTR) new_areldata); 519 return NULL; 520 } 521 522 n_nfd->origin = bfd_tell (archive); 523 n_nfd->arelt_data = (PTR) new_areldata; 524 n_nfd->filename = new_areldata->filename; 525 526 if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd)) 527 return n_nfd; 528 529 /* huh? */ 530 bfd_release (archive, (PTR) n_nfd); 531 bfd_release (archive, (PTR) new_areldata); 532 return NULL; 533 } 534 535 /* Return the BFD which is referenced by the symbol in ABFD indexed by 536 INDEX. INDEX should have been returned by bfd_get_next_mapent. */ 537 538 bfd * 539 _bfd_generic_get_elt_at_index (abfd, index) 540 bfd *abfd; 541 symindex index; 542 { 543 carsym *entry; 544 545 entry = bfd_ardata (abfd)->symdefs + index; 546 return _bfd_get_elt_at_filepos (abfd, entry->file_offset); 547 } 548 549 /* 550 FUNCTION 551 bfd_openr_next_archived_file 552 553 SYNOPSIS 554 bfd *bfd_openr_next_archived_file(bfd *archive, bfd *previous); 555 556 DESCRIPTION 557 Provided a BFD, @var{archive}, containing an archive and NULL, open 558 an input BFD on the first contained element and returns that. 559 Subsequent calls should pass 560 the archive and the previous return value to return a created 561 BFD to the next contained element. NULL is returned when there 562 are no more. 563 564 */ 565 566 bfd * 567 bfd_openr_next_archived_file (archive, last_file) 568 bfd *archive; 569 bfd *last_file; 570 { 571 if ((bfd_get_format (archive) != bfd_archive) || 572 (archive->direction == write_direction)) 573 { 574 bfd_set_error (bfd_error_invalid_operation); 575 return NULL; 576 } 577 578 return BFD_SEND (archive, 579 openr_next_archived_file, 580 (archive, 581 last_file)); 582 } 583 584 bfd * 585 bfd_generic_openr_next_archived_file (archive, last_file) 586 bfd *archive; 587 bfd *last_file; 588 { 589 file_ptr filestart; 590 591 if (!last_file) 592 filestart = bfd_ardata (archive)->first_file_filepos; 593 else 594 { 595 unsigned int size = arelt_size (last_file); 596 /* Pad to an even boundary... 597 Note that last_file->origin can be odd in the case of 598 BSD-4.4-style element with a long odd size. */ 599 filestart = last_file->origin + size; 600 filestart += filestart % 2; 601 } 602 603 return _bfd_get_elt_at_filepos (archive, filestart); 604 } 605 606 607 const bfd_target * 608 bfd_generic_archive_p (abfd) 609 bfd *abfd; 610 { 611 struct artdata *tdata_hold; 612 char armag[SARMAG + 1]; 613 614 tdata_hold = abfd->tdata.aout_ar_data; 615 616 if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG) 617 { 618 if (bfd_get_error () != bfd_error_system_call) 619 bfd_set_error (bfd_error_wrong_format); 620 return NULL; 621 } 622 623 #ifdef GNU960 624 if (strncmp (armag, BFD_GNU960_ARMAG (abfd), SARMAG) != 0) 625 return 0; 626 #else 627 if (strncmp (armag, ARMAG, SARMAG) != 0 && 628 strncmp (armag, ARMAGB, SARMAG) != 0) 629 return 0; 630 #endif 631 632 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata 633 involves a cast, we can't do it as the left operand of assignment. */ 634 abfd->tdata.aout_ar_data = ((struct artdata *) 635 bfd_zalloc (abfd, sizeof (struct artdata))); 636 637 if (bfd_ardata (abfd) == NULL) 638 return NULL; 639 640 bfd_ardata (abfd)->first_file_filepos = SARMAG; 641 bfd_ardata (abfd)->cache = NULL; 642 bfd_ardata (abfd)->archive_head = NULL; 643 bfd_ardata (abfd)->symdefs = NULL; 644 bfd_ardata (abfd)->extended_names = NULL; 645 bfd_ardata (abfd)->tdata = NULL; 646 647 if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))) 648 { 649 bfd_release (abfd, bfd_ardata (abfd)); 650 abfd->tdata.aout_ar_data = tdata_hold; 651 if (bfd_get_error () != bfd_error_system_call) 652 bfd_set_error (bfd_error_wrong_format); 653 return NULL; 654 } 655 656 if (!BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd))) 657 { 658 bfd_release (abfd, bfd_ardata (abfd)); 659 abfd->tdata.aout_ar_data = tdata_hold; 660 if (bfd_get_error () != bfd_error_system_call) 661 bfd_set_error (bfd_error_wrong_format); 662 return NULL; 663 } 664 665 if (bfd_has_map (abfd)) 666 { 667 bfd *first; 668 669 /* This archive has a map, so we may presume that the contents 670 are object files. Make sure that if the first file in the 671 archive can be recognized as an object file, it is for this 672 target. If not, assume that this is the wrong format. If 673 the first file is not an object file, somebody is doing 674 something weird, and we permit it so that ar -t will work. 675 676 This is done because any normal format will recognize any 677 normal archive, regardless of the format of the object files. 678 We do accept an empty archive. */ 679 680 first = bfd_openr_next_archived_file (abfd, (bfd *) NULL); 681 if (first != NULL) 682 { 683 boolean fail; 684 685 first->target_defaulted = false; 686 fail = false; 687 if (bfd_check_format (first, bfd_object) 688 && first->xvec != abfd->xvec) 689 { 690 (void) bfd_close (first); 691 bfd_release (abfd, bfd_ardata (abfd)); 692 abfd->tdata.aout_ar_data = tdata_hold; 693 bfd_set_error (bfd_error_wrong_format); 694 return NULL; 695 } 696 697 /* We ought to close first here, but we can't, because we 698 have no way to remove it from the archive cache. FIXME. */ 699 } 700 } 701 702 return abfd->xvec; 703 } 704 705 /* Some constants for a 32 bit BSD archive structure. We do not 706 support 64 bit archives presently; so far as I know, none actually 707 exist. Supporting them would require changing these constants, and 708 changing some bfd_h_get_32 to bfd_h_get_64. */ 709 710 /* The size of an external symdef structure. */ 711 #define BSD_SYMDEF_SIZE 8 712 713 /* The offset from the start of a symdef structure to the file offset. */ 714 #define BSD_SYMDEF_OFFSET_SIZE 4 715 716 /* The size of the symdef count. */ 717 #define BSD_SYMDEF_COUNT_SIZE 4 718 719 /* The size of the string count. */ 720 #define BSD_STRING_COUNT_SIZE 4 721 722 /* Returns false on error, true otherwise */ 723 724 static boolean 725 do_slurp_bsd_armap (abfd) 726 bfd *abfd; 727 { 728 struct areltdata *mapdata; 729 unsigned int counter; 730 bfd_byte *raw_armap, *rbase; 731 struct artdata *ardata = bfd_ardata (abfd); 732 char *stringbase; 733 unsigned int parsed_size; 734 carsym *set; 735 736 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); 737 if (mapdata == NULL) 738 return false; 739 parsed_size = mapdata->parsed_size; 740 bfd_release (abfd, (PTR) mapdata); /* Don't need it any more. */ 741 742 raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size); 743 if (raw_armap == (bfd_byte *) NULL) 744 return false; 745 746 if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size) 747 { 748 if (bfd_get_error () != bfd_error_system_call) 749 bfd_set_error (bfd_error_malformed_archive); 750 byebye: 751 bfd_release (abfd, (PTR) raw_armap); 752 return false; 753 } 754 755 ardata->symdef_count = bfd_h_get_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE; 756 757 if (ardata->symdef_count * BSD_SYMDEF_SIZE > 758 parsed_size - BSD_SYMDEF_COUNT_SIZE) 759 { 760 /* Probably we're using the wrong byte ordering. */ 761 bfd_set_error (bfd_error_wrong_format); 762 goto byebye; 763 } 764 765 ardata->cache = 0; 766 rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE; 767 stringbase = ((char *) rbase 768 + ardata->symdef_count * BSD_SYMDEF_SIZE 769 + BSD_STRING_COUNT_SIZE); 770 ardata->symdefs = (carsym *) bfd_alloc (abfd, 771 (ardata->symdef_count 772 * sizeof (carsym))); 773 if (!ardata->symdefs) 774 return false; 775 776 for (counter = 0, set = ardata->symdefs; 777 counter < ardata->symdef_count; 778 counter++, set++, rbase += BSD_SYMDEF_SIZE) 779 { 780 set->name = bfd_h_get_32 (abfd, rbase) + stringbase; 781 set->file_offset = bfd_h_get_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE); 782 } 783 784 ardata->first_file_filepos = bfd_tell (abfd); 785 /* Pad to an even boundary if you have to */ 786 ardata->first_file_filepos += (ardata->first_file_filepos) % 2; 787 /* FIXME, we should provide some way to free raw_ardata when 788 we are done using the strings from it. For now, it seems 789 to be allocated on an objalloc anyway... */ 790 bfd_has_map (abfd) = true; 791 return true; 792 } 793 794 /* Returns false on error, true otherwise */ 795 static boolean 796 do_slurp_coff_armap (abfd) 797 bfd *abfd; 798 { 799 struct areltdata *mapdata; 800 int *raw_armap, *rawptr; 801 struct artdata *ardata = bfd_ardata (abfd); 802 char *stringbase; 803 unsigned int stringsize; 804 unsigned int parsed_size; 805 carsym *carsyms; 806 unsigned int nsymz; /* Number of symbols in armap. */ 807 bfd_vma (*swap) PARAMS ((const bfd_byte *)); 808 char int_buf[sizeof (long)]; 809 unsigned int carsym_size, ptrsize, i; 810 811 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); 812 if (mapdata == NULL) 813 return false; 814 parsed_size = mapdata->parsed_size; 815 bfd_release (abfd, (PTR) mapdata); /* Don't need it any more. */ 816 817 if (bfd_read ((PTR) int_buf, 1, 4, abfd) != 4) 818 { 819 if (bfd_get_error () != bfd_error_system_call) 820 bfd_set_error (bfd_error_malformed_archive); 821 return false; 822 } 823 /* It seems that all numeric information in a coff archive is always 824 in big endian format, nomatter the host or target. */ 825 swap = bfd_getb32; 826 nsymz = bfd_getb32 ((PTR) int_buf); 827 stringsize = parsed_size - (4 * nsymz) - 4; 828 829 #if 1 830 /* ... except that some archive formats are broken, and it may be our 831 fault - the i960 little endian coff sometimes has big and sometimes 832 little, because our tools changed. Here's a horrible hack to clean 833 up the crap. */ 834 835 if (stringsize > 0xfffff 836 && bfd_get_arch (abfd) == bfd_arch_i960 837 && bfd_get_flavour (abfd) == bfd_target_coff_flavour) 838 { 839 /* This looks dangerous, let's do it the other way around */ 840 nsymz = bfd_getl32 ((PTR) int_buf); 841 stringsize = parsed_size - (4 * nsymz) - 4; 842 swap = bfd_getl32; 843 } 844 #endif 845 846 /* The coff armap must be read sequentially. So we construct a 847 bsd-style one in core all at once, for simplicity. */ 848 849 carsym_size = (nsymz * sizeof (carsym)); 850 ptrsize = (4 * nsymz); 851 852 ardata->symdefs = (carsym *) bfd_zalloc (abfd, carsym_size + stringsize + 1); 853 if (ardata->symdefs == NULL) 854 return false; 855 carsyms = ardata->symdefs; 856 stringbase = ((char *) ardata->symdefs) + carsym_size; 857 858 /* Allocate and read in the raw offsets. */ 859 raw_armap = (int *) bfd_alloc (abfd, ptrsize); 860 if (raw_armap == NULL) 861 goto release_symdefs; 862 if (bfd_read ((PTR) raw_armap, 1, ptrsize, abfd) != ptrsize 863 || bfd_read ((PTR) stringbase, 1, stringsize, abfd) != stringsize) 864 { 865 if (bfd_get_error () != bfd_error_system_call) 866 bfd_set_error (bfd_error_malformed_archive); 867 goto release_raw_armap; 868 } 869 870 /* OK, build the carsyms */ 871 for (i = 0; i < nsymz; i++) 872 { 873 rawptr = raw_armap + i; 874 carsyms->file_offset = swap ((PTR) rawptr); 875 carsyms->name = stringbase; 876 stringbase += strlen (stringbase) + 1; 877 carsyms++; 878 } 879 *stringbase = 0; 880 881 ardata->symdef_count = nsymz; 882 ardata->first_file_filepos = bfd_tell (abfd); 883 /* Pad to an even boundary if you have to */ 884 ardata->first_file_filepos += (ardata->first_file_filepos) % 2; 885 886 887 bfd_has_map (abfd) = true; 888 bfd_release (abfd, (PTR) raw_armap); 889 890 891 /* Check for a second archive header (as used by PE) */ 892 { 893 struct areltdata *tmp; 894 895 bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET); 896 tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd); 897 if (tmp != NULL) 898 { 899 if (tmp->arch_header[0] == '/' 900 && tmp->arch_header[1] == ' ') 901 { 902 ardata->first_file_filepos += 903 (tmp->parsed_size + sizeof(struct ar_hdr) + 1) & ~1; 904 } 905 bfd_release (abfd, tmp); 906 } 907 } 908 909 return true; 910 911 release_raw_armap: 912 bfd_release (abfd, (PTR) raw_armap); 913 release_symdefs: 914 bfd_release (abfd, (PTR) (ardata)->symdefs); 915 return false; 916 } 917 918 /* This routine can handle either coff-style or bsd-style armaps. 919 Returns false on error, true otherwise */ 920 921 boolean 922 bfd_slurp_armap (abfd) 923 bfd *abfd; 924 { 925 char nextname[17]; 926 int i = bfd_read ((PTR) nextname, 1, 16, abfd); 927 928 if (i == 0) 929 return true; 930 if (i != 16) 931 return false; 932 933 if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0) 934 return false; 935 936 if (!strncmp (nextname, "__.SYMDEF ", 16) 937 || !strncmp (nextname, "__.SYMDEF/ ", 16)) /* old Linux archives */ 938 return do_slurp_bsd_armap (abfd); 939 else if (!strncmp (nextname, "/ ", 16)) 940 return do_slurp_coff_armap (abfd); 941 else if (!strncmp (nextname, "/SYM64/ ", 16)) 942 { 943 /* Irix 6 archive--must be recognized by code in elf64-mips.c. */ 944 bfd_set_error (bfd_error_wrong_format); 945 return false; 946 } 947 948 bfd_has_map (abfd) = false; 949 return true; 950 } 951 952 /* Returns false on error, true otherwise */ 953 /* flavor 2 of a bsd armap, similar to bfd_slurp_bsd_armap except the 954 header is in a slightly different order and the map name is '/'. 955 This flavour is used by hp300hpux. */ 956 957 #define HPUX_SYMDEF_COUNT_SIZE 2 958 959 boolean 960 bfd_slurp_bsd_armap_f2 (abfd) 961 bfd *abfd; 962 { 963 struct areltdata *mapdata; 964 char nextname[17]; 965 unsigned int counter; 966 bfd_byte *raw_armap, *rbase; 967 struct artdata *ardata = bfd_ardata (abfd); 968 char *stringbase; 969 unsigned int stringsize; 970 carsym *set; 971 int i = bfd_read ((PTR) nextname, 1, 16, abfd); 972 973 if (i == 0) 974 return true; 975 if (i != 16) 976 return false; 977 978 /* The archive has at least 16 bytes in it */ 979 if (bfd_seek (abfd, -16L, SEEK_CUR) != 0) 980 return false; 981 982 if (!strncmp (nextname, "__.SYMDEF ", 16) 983 || !strncmp (nextname, "__.SYMDEF/ ", 16)) /* old Linux archives */ 984 return do_slurp_bsd_armap (abfd); 985 986 if (strncmp (nextname, "/ ", 16)) 987 { 988 bfd_has_map (abfd) = false; 989 return true; 990 } 991 992 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); 993 if (mapdata == NULL) 994 return false; 995 996 raw_armap = (bfd_byte *) bfd_zalloc (abfd, mapdata->parsed_size); 997 if (raw_armap == NULL) 998 { 999 byebye: 1000 bfd_release (abfd, (PTR) mapdata); 1001 return false; 1002 } 1003 1004 if (bfd_read ((PTR) raw_armap, 1, mapdata->parsed_size, abfd) != 1005 mapdata->parsed_size) 1006 { 1007 if (bfd_get_error () != bfd_error_system_call) 1008 bfd_set_error (bfd_error_malformed_archive); 1009 byebyebye: 1010 bfd_release (abfd, (PTR) raw_armap); 1011 goto byebye; 1012 } 1013 1014 ardata->symdef_count = bfd_h_get_16 (abfd, (PTR) raw_armap); 1015 1016 if (ardata->symdef_count * BSD_SYMDEF_SIZE 1017 > mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE) 1018 { 1019 /* Probably we're using the wrong byte ordering. */ 1020 bfd_set_error (bfd_error_wrong_format); 1021 goto byebyebye; 1022 } 1023 1024 ardata->cache = 0; 1025 1026 stringsize = bfd_h_get_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE); 1027 /* skip sym count and string sz */ 1028 stringbase = ((char *) raw_armap 1029 + HPUX_SYMDEF_COUNT_SIZE 1030 + BSD_STRING_COUNT_SIZE); 1031 rbase = (bfd_byte *) stringbase + stringsize; 1032 ardata->symdefs = (carsym *) bfd_alloc (abfd, 1033 (ardata->symdef_count 1034 * BSD_SYMDEF_SIZE)); 1035 if (!ardata->symdefs) 1036 return false; 1037 1038 for (counter = 0, set = ardata->symdefs; 1039 counter < ardata->symdef_count; 1040 counter++, set++, rbase += BSD_SYMDEF_SIZE) 1041 { 1042 set->name = bfd_h_get_32 (abfd, rbase) + stringbase; 1043 set->file_offset = bfd_h_get_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE); 1044 } 1045 1046 ardata->first_file_filepos = bfd_tell (abfd); 1047 /* Pad to an even boundary if you have to */ 1048 ardata->first_file_filepos += (ardata->first_file_filepos) % 2; 1049 /* FIXME, we should provide some way to free raw_ardata when 1050 we are done using the strings from it. For now, it seems 1051 to be allocated on an objalloc anyway... */ 1052 bfd_has_map (abfd) = true; 1053 return true; 1054 } 1055 1056 /** Extended name table. 1057 1058 Normally archives support only 14-character filenames. 1059 1060 Intel has extended the format: longer names are stored in a special 1061 element (the first in the archive, or second if there is an armap); 1062 the name in the ar_hdr is replaced by <space><index into filename 1063 element>. Index is the P.R. of an int (decimal). Data General have 1064 extended the format by using the prefix // for the special element */ 1065 1066 /* Returns false on error, true otherwise */ 1067 boolean 1068 _bfd_slurp_extended_name_table (abfd) 1069 bfd *abfd; 1070 { 1071 char nextname[17]; 1072 struct areltdata *namedata; 1073 1074 /* FIXME: Formatting sucks here, and in case of failure of BFD_READ, 1075 we probably don't want to return true. */ 1076 bfd_seek (abfd, bfd_ardata (abfd)->first_file_filepos, SEEK_SET); 1077 if (bfd_read ((PTR) nextname, 1, 16, abfd) == 16) 1078 { 1079 if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0) 1080 return false; 1081 1082 if (strncmp (nextname, "ARFILENAMES/ ", 16) != 0 && 1083 strncmp (nextname, "// ", 16) != 0) 1084 { 1085 bfd_ardata (abfd)->extended_names = NULL; 1086 return true; 1087 } 1088 1089 namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd); 1090 if (namedata == NULL) 1091 return false; 1092 1093 bfd_ardata (abfd)->extended_names = 1094 bfd_zalloc (abfd, namedata->parsed_size); 1095 if (bfd_ardata (abfd)->extended_names == NULL) 1096 { 1097 byebye: 1098 bfd_release (abfd, (PTR) namedata); 1099 return false; 1100 } 1101 1102 if (bfd_read ((PTR) bfd_ardata (abfd)->extended_names, 1, 1103 namedata->parsed_size, abfd) != namedata->parsed_size) 1104 { 1105 if (bfd_get_error () != bfd_error_system_call) 1106 bfd_set_error (bfd_error_malformed_archive); 1107 bfd_release (abfd, (PTR) (bfd_ardata (abfd)->extended_names)); 1108 bfd_ardata (abfd)->extended_names = NULL; 1109 goto byebye; 1110 } 1111 1112 /* Since the archive is supposed to be printable if it contains 1113 text, the entries in the list are newline-padded, not null 1114 padded. In SVR4-style archives, the names also have a 1115 trailing '/'. DOS/NT created archive often have \ in them 1116 We'll fix all problems here.. */ 1117 { 1118 char *temp = bfd_ardata (abfd)->extended_names; 1119 char *limit = temp + namedata->parsed_size; 1120 for (; temp < limit; ++temp) { 1121 if (*temp == '\012') 1122 temp[temp[-1] == '/' ? -1 : 0] = '\0'; 1123 if (*temp == '\\') 1124 *temp = '/'; 1125 } 1126 } 1127 1128 /* Pad to an even boundary if you have to */ 1129 bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd); 1130 bfd_ardata (abfd)->first_file_filepos += 1131 (bfd_ardata (abfd)->first_file_filepos) % 2; 1132 1133 /* FIXME, we can't release namedata here because it was allocated 1134 below extended_names on the objalloc... */ 1135 /* bfd_release (abfd, namedata); */ 1136 } 1137 return true; 1138 } 1139 1140 #ifdef VMS 1141 1142 /* Return a copy of the stuff in the filename between any :]> and a 1143 semicolon */ 1144 static const char * 1145 normalize (abfd, file) 1146 bfd *abfd; 1147 const char *file; 1148 { 1149 CONST char *first; 1150 CONST char *last; 1151 char *copy; 1152 1153 first = file + strlen (file) - 1; 1154 last = first + 1; 1155 1156 while (first != file) 1157 { 1158 if (*first == ';') 1159 last = first; 1160 if (*first == ':' || *first == ']' || *first == '>') 1161 { 1162 first++; 1163 break; 1164 } 1165 first--; 1166 } 1167 1168 copy = (char *) bfd_alloc (abfd, last - first + 1); 1169 if (copy == NULL) 1170 return NULL; 1171 1172 memcpy (copy, first, last - first); 1173 copy[last - first] = 0; 1174 1175 return copy; 1176 } 1177 1178 #else 1179 static const char * 1180 normalize (abfd, file) 1181 bfd *abfd ATTRIBUTE_UNUSED; 1182 const char *file; 1183 { 1184 const char *filename = strrchr (file, '/'); 1185 1186 1187 #ifdef HAVE_DOS_BASED_FILE_SYSTEM 1188 { 1189 /* We could have foo/bar\\baz, or foo\\bar, or d:bar. */ 1190 char *bslash = strrchr (file, '\\'); 1191 if (bslash > filename) 1192 filename = bslash; 1193 if (filename == NULL && file[0] != '\0' && file[1] == ':') 1194 filename = file + 1; 1195 } 1196 #endif 1197 if (filename != (char *) NULL) 1198 filename++; 1199 else 1200 filename = file; 1201 return filename; 1202 } 1203 #endif 1204 1205 /* Build a BFD style extended name table. */ 1206 1207 boolean 1208 _bfd_archive_bsd_construct_extended_name_table (abfd, tabloc, tablen, name) 1209 bfd *abfd; 1210 char **tabloc; 1211 bfd_size_type *tablen; 1212 const char **name; 1213 { 1214 *name = "ARFILENAMES/"; 1215 return _bfd_construct_extended_name_table (abfd, false, tabloc, tablen); 1216 } 1217 1218 /* Build an SVR4 style extended name table. */ 1219 1220 boolean 1221 _bfd_archive_coff_construct_extended_name_table (abfd, tabloc, tablen, name) 1222 bfd *abfd; 1223 char **tabloc; 1224 bfd_size_type *tablen; 1225 const char **name; 1226 { 1227 *name = "//"; 1228 return _bfd_construct_extended_name_table (abfd, true, tabloc, tablen); 1229 } 1230 1231 /* Follows archive_head and produces an extended name table if 1232 necessary. Returns (in tabloc) a pointer to an extended name 1233 table, and in tablen the length of the table. If it makes an entry 1234 it clobbers the filename so that the element may be written without 1235 further massage. Returns true if it ran successfully, false if 1236 something went wrong. A successful return may still involve a 1237 zero-length tablen! */ 1238 1239 boolean 1240 _bfd_construct_extended_name_table (abfd, trailing_slash, tabloc, tablen) 1241 bfd *abfd; 1242 boolean trailing_slash; 1243 char **tabloc; 1244 bfd_size_type *tablen; 1245 { 1246 unsigned int maxname = abfd->xvec->ar_max_namelen; 1247 unsigned int total_namelen = 0; 1248 bfd *current; 1249 char *strptr; 1250 1251 *tablen = 0; 1252 1253 /* Figure out how long the table should be */ 1254 for (current = abfd->archive_head; current != NULL; current = current->next) 1255 { 1256 const char *normal; 1257 unsigned int thislen; 1258 1259 normal = normalize (current, current->filename); 1260 if (normal == NULL) 1261 return false; 1262 1263 thislen = strlen (normal); 1264 1265 if (thislen > maxname 1266 && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0) 1267 thislen = maxname; 1268 1269 if (thislen > maxname) 1270 { 1271 /* Add one to leave room for \n. */ 1272 total_namelen += thislen + 1; 1273 if (trailing_slash) 1274 { 1275 /* Leave room for trailing slash. */ 1276 ++total_namelen; 1277 } 1278 } 1279 else 1280 { 1281 struct ar_hdr *hdr = arch_hdr (current); 1282 if (strncmp (normal, hdr->ar_name, thislen) != 0 1283 || (thislen < sizeof hdr->ar_name 1284 && hdr->ar_name[thislen] != ar_padchar (current))) 1285 { 1286 /* Must have been using extended format even though it 1287 didn't need to. Fix it to use normal format. */ 1288 memcpy (hdr->ar_name, normal, thislen); 1289 if (thislen < maxname 1290 || (thislen == maxname && thislen < sizeof hdr->ar_name)) 1291 hdr->ar_name[thislen] = ar_padchar (current); 1292 } 1293 } 1294 } 1295 1296 if (total_namelen == 0) 1297 return true; 1298 1299 *tabloc = bfd_zalloc (abfd, total_namelen); 1300 if (*tabloc == NULL) 1301 return false; 1302 1303 *tablen = total_namelen; 1304 strptr = *tabloc; 1305 1306 for (current = abfd->archive_head; current != NULL; current = 1307 current->next) 1308 { 1309 const char *normal; 1310 unsigned int thislen; 1311 1312 normal = normalize (current, current->filename); 1313 if (normal == NULL) 1314 return false; 1315 1316 thislen = strlen (normal); 1317 if (thislen > maxname) 1318 { 1319 /* Works for now; may need to be re-engineered if we 1320 encounter an oddball archive format and want to 1321 generalise this hack. */ 1322 struct ar_hdr *hdr = arch_hdr (current); 1323 strcpy (strptr, normal); 1324 if (! trailing_slash) 1325 strptr[thislen] = '\012'; 1326 else 1327 { 1328 strptr[thislen] = '/'; 1329 strptr[thislen + 1] = '\012'; 1330 } 1331 hdr->ar_name[0] = ar_padchar (current); 1332 /* We know there will always be enough room (one of the few 1333 cases where you may safely use sprintf). */ 1334 sprintf ((hdr->ar_name) + 1, "%-d", (unsigned) (strptr - *tabloc)); 1335 /* Kinda Kludgy. We should just use the returned value of 1336 sprintf but not all implementations get this right */ 1337 { 1338 char *temp = hdr->ar_name + 2; 1339 for (; temp < hdr->ar_name + maxname; temp++) 1340 if (*temp == '\0') 1341 *temp = ' '; 1342 } 1343 strptr += thislen + 1; 1344 if (trailing_slash) 1345 ++strptr; 1346 } 1347 } 1348 1349 return true; 1350 } 1351 1352 /** A couple of functions for creating ar_hdrs */ 1353 1354 #ifndef HAVE_GETUID 1355 #define getuid() 0 1356 #endif 1357 1358 #ifndef HAVE_GETGID 1359 #define getgid() 0 1360 #endif 1361 1362 /* Takes a filename, returns an arelt_data for it, or NULL if it can't 1363 make one. The filename must refer to a filename in the filesystem. 1364 The filename field of the ar_hdr will NOT be initialized. If member 1365 is set, and it's an in-memory bfd, we fake it. */ 1366 1367 static struct areltdata * 1368 bfd_ar_hdr_from_filesystem (abfd, filename, member) 1369 bfd *abfd; 1370 const char *filename; 1371 bfd *member; 1372 { 1373 struct stat status; 1374 struct areltdata *ared; 1375 struct ar_hdr *hdr; 1376 char *temp, *temp1; 1377 1378 if (member && (member->flags & BFD_IN_MEMORY) != 0) 1379 { 1380 /* Assume we just "made" the member, and fake it */ 1381 struct bfd_in_memory *bim = (struct bfd_in_memory *) member->iostream; 1382 time(&status.st_mtime); 1383 status.st_uid = getuid(); 1384 status.st_gid = getgid(); 1385 status.st_mode = 0644; 1386 status.st_size = bim->size; 1387 } 1388 else if (stat (filename, &status) != 0) 1389 { 1390 bfd_set_error (bfd_error_system_call); 1391 return NULL; 1392 } 1393 1394 ared = (struct areltdata *) bfd_zalloc (abfd, sizeof (struct ar_hdr) + 1395 sizeof (struct areltdata)); 1396 if (ared == NULL) 1397 return NULL; 1398 hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata)); 1399 1400 /* ar headers are space padded, not null padded! */ 1401 memset ((PTR) hdr, ' ', sizeof (struct ar_hdr)); 1402 1403 strncpy (hdr->ar_fmag, ARFMAG, 2); 1404 1405 /* Goddamned sprintf doesn't permit MAXIMUM field lengths */ 1406 sprintf ((hdr->ar_date), "%-12ld", (long) status.st_mtime); 1407 sprintf ((hdr->ar_uid), "%ld", (long) status.st_uid); 1408 sprintf ((hdr->ar_gid), "%ld", (long) status.st_gid); 1409 sprintf ((hdr->ar_mode), "%-8o", (unsigned int) status.st_mode); 1410 sprintf ((hdr->ar_size), "%-10ld", (long) status.st_size); 1411 /* Correct for a lossage in sprintf whereby it null-terminates. I cannot 1412 understand how these C losers could design such a ramshackle bunch of 1413 IO operations */ 1414 temp = (char *) hdr; 1415 temp1 = temp + sizeof (struct ar_hdr) - 2; 1416 for (; temp < temp1; temp++) 1417 { 1418 if (*temp == '\0') 1419 *temp = ' '; 1420 } 1421 strncpy (hdr->ar_fmag, ARFMAG, 2); 1422 ared->parsed_size = status.st_size; 1423 ared->arch_header = (char *) hdr; 1424 1425 return ared; 1426 } 1427 1428 /* This is magic required by the "ar" program. Since it's 1429 undocumented, it's undocumented. You may think that it would take 1430 a strong stomach to write this, and it does, but it takes even a 1431 stronger stomach to try to code around such a thing! */ 1432 1433 struct ar_hdr *bfd_special_undocumented_glue PARAMS ((bfd *, const char *)); 1434 1435 struct ar_hdr * 1436 bfd_special_undocumented_glue (abfd, filename) 1437 bfd *abfd; 1438 const char *filename; 1439 { 1440 struct areltdata *ar_elt = bfd_ar_hdr_from_filesystem (abfd, filename, 0); 1441 if (ar_elt == NULL) 1442 return NULL; 1443 return (struct ar_hdr *) ar_elt->arch_header; 1444 } 1445 1446 1447 /* Analogous to stat call */ 1448 int 1449 bfd_generic_stat_arch_elt (abfd, buf) 1450 bfd *abfd; 1451 struct stat *buf; 1452 { 1453 struct ar_hdr *hdr; 1454 char *aloser; 1455 1456 if (abfd->arelt_data == NULL) 1457 { 1458 bfd_set_error (bfd_error_invalid_operation); 1459 return -1; 1460 } 1461 1462 hdr = arch_hdr (abfd); 1463 1464 #define foo(arelt, stelt, size) \ 1465 buf->stelt = strtol (hdr->arelt, &aloser, size); \ 1466 if (aloser == hdr->arelt) return -1; 1467 1468 foo (ar_date, st_mtime, 10); 1469 foo (ar_uid, st_uid, 10); 1470 foo (ar_gid, st_gid, 10); 1471 foo (ar_mode, st_mode, 8); 1472 1473 buf->st_size = arch_eltdata (abfd)->parsed_size; 1474 1475 return 0; 1476 } 1477 1478 void 1479 bfd_dont_truncate_arname (abfd, pathname, arhdr) 1480 bfd *abfd; 1481 CONST char *pathname; 1482 char *arhdr; 1483 { 1484 /* FIXME: This interacts unpleasantly with ar's quick-append option. 1485 Fortunately ic960 users will never use that option. Fixing this 1486 is very hard; fortunately I know how to do it and will do so once 1487 intel's release is out the door. */ 1488 1489 struct ar_hdr *hdr = (struct ar_hdr *) arhdr; 1490 size_t length; 1491 const char *filename; 1492 size_t maxlen = ar_maxnamelen (abfd); 1493 1494 if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0) 1495 { 1496 bfd_bsd_truncate_arname (abfd, pathname, arhdr); 1497 return; 1498 } 1499 1500 filename = normalize (abfd, pathname); 1501 if (filename == NULL) 1502 { 1503 /* FIXME */ 1504 abort (); 1505 } 1506 1507 length = strlen (filename); 1508 1509 if (length <= maxlen) 1510 memcpy (hdr->ar_name, filename, length); 1511 1512 /* Add the padding character if there is room for it. */ 1513 if (length < maxlen 1514 || (length == maxlen && length < sizeof hdr->ar_name)) 1515 (hdr->ar_name)[length] = ar_padchar (abfd); 1516 } 1517 1518 void 1519 bfd_bsd_truncate_arname (abfd, pathname, arhdr) 1520 bfd *abfd; 1521 CONST char *pathname; 1522 char *arhdr; 1523 { 1524 struct ar_hdr *hdr = (struct ar_hdr *) arhdr; 1525 int length; 1526 CONST char *filename = strrchr (pathname, '/'); 1527 int maxlen = ar_maxnamelen (abfd); 1528 1529 #ifdef HAVE_DOS_BASED_FILE_SYSTEM 1530 { 1531 /* We could have foo/bar\\baz, or foo\\bar, or d:bar. */ 1532 char *bslash = strrchr (pathname, '\\'); 1533 if (bslash > filename) 1534 filename = bslash; 1535 if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':') 1536 filename = pathname + 1; 1537 } 1538 #endif 1539 1540 if (filename == NULL) 1541 filename = pathname; 1542 else 1543 ++filename; 1544 1545 length = strlen (filename); 1546 1547 if (length <= maxlen) 1548 memcpy (hdr->ar_name, filename, length); 1549 else 1550 { 1551 /* pathname: meet procrustes */ 1552 memcpy (hdr->ar_name, filename, maxlen); 1553 length = maxlen; 1554 } 1555 1556 if (length < maxlen) 1557 (hdr->ar_name)[length] = ar_padchar (abfd); 1558 } 1559 1560 /* Store name into ar header. Truncates the name to fit. 1561 1> strip pathname to be just the basename. 1562 2> if it's short enuf to fit, stuff it in. 1563 3> If it doesn't end with .o, truncate it to fit 1564 4> truncate it before the .o, append .o, stuff THAT in. */ 1565 1566 /* This is what gnu ar does. It's better but incompatible with the 1567 bsd ar. */ 1568 1569 void 1570 bfd_gnu_truncate_arname (abfd, pathname, arhdr) 1571 bfd *abfd; 1572 CONST char *pathname; 1573 char *arhdr; 1574 { 1575 struct ar_hdr *hdr = (struct ar_hdr *) arhdr; 1576 int length; 1577 CONST char *filename = strrchr (pathname, '/'); 1578 int maxlen = ar_maxnamelen (abfd); 1579 1580 #ifdef HAVE_DOS_BASED_FILE_SYSTEM 1581 { 1582 /* We could have foo/bar\\baz, or foo\\bar, or d:bar. */ 1583 char *bslash = strrchr (pathname, '\\'); 1584 if (bslash > filename) 1585 filename = bslash; 1586 if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':') 1587 filename = pathname + 1; 1588 } 1589 #endif 1590 1591 if (filename == NULL) 1592 filename = pathname; 1593 else 1594 ++filename; 1595 1596 length = strlen (filename); 1597 1598 if (length <= maxlen) 1599 memcpy (hdr->ar_name, filename, length); 1600 else 1601 { /* pathname: meet procrustes */ 1602 memcpy (hdr->ar_name, filename, maxlen); 1603 if ((filename[length - 2] == '.') && (filename[length - 1] == 'o')) 1604 { 1605 hdr->ar_name[maxlen - 2] = '.'; 1606 hdr->ar_name[maxlen - 1] = 'o'; 1607 } 1608 length = maxlen; 1609 } 1610 1611 if (length < 16) 1612 (hdr->ar_name)[length] = ar_padchar (abfd); 1613 } 1614 1615 /* The BFD is open for write and has its format set to bfd_archive */ 1616 1617 boolean 1618 _bfd_write_archive_contents (arch) 1619 bfd *arch; 1620 { 1621 bfd *current; 1622 char *etable = NULL; 1623 bfd_size_type elength = 0; 1624 const char *ename = NULL; 1625 boolean makemap = bfd_has_map (arch); 1626 boolean hasobjects = false; /* if no .o's, don't bother to make a map */ 1627 bfd_size_type wrote; 1628 unsigned int i; 1629 int tries; 1630 1631 /* Verify the viability of all entries; if any of them live in the 1632 filesystem (as opposed to living in an archive open for input) 1633 then construct a fresh ar_hdr for them. */ 1634 for (current = arch->archive_head; current; current = current->next) 1635 { 1636 if (bfd_write_p (current)) 1637 { 1638 bfd_set_error (bfd_error_invalid_operation); 1639 return false; 1640 } 1641 if (!current->arelt_data) 1642 { 1643 current->arelt_data = 1644 (PTR) bfd_ar_hdr_from_filesystem (arch, current->filename, current); 1645 if (!current->arelt_data) 1646 return false; 1647 1648 /* Put in the file name */ 1649 BFD_SEND (arch, _bfd_truncate_arname, (arch, 1650 current->filename, 1651 (char *) arch_hdr (current))); 1652 } 1653 1654 if (makemap && ! hasobjects) 1655 { /* don't bother if we won't make a map! */ 1656 if ((bfd_check_format (current, bfd_object)) 1657 #if 0 /* FIXME -- these are not set correctly */ 1658 && ((bfd_get_file_flags (current) & HAS_SYMS)) 1659 #endif 1660 ) 1661 hasobjects = true; 1662 } 1663 } 1664 1665 if (!BFD_SEND (arch, _bfd_construct_extended_name_table, 1666 (arch, &etable, &elength, &ename))) 1667 return false; 1668 1669 if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0) 1670 return false; 1671 #ifdef GNU960 1672 wrote = bfd_write (BFD_GNU960_ARMAG (arch), 1, SARMAG, arch); 1673 #else 1674 wrote = bfd_write (ARMAG, 1, SARMAG, arch); 1675 #endif 1676 if (wrote != SARMAG) 1677 return false; 1678 1679 if (makemap && hasobjects) 1680 { 1681 if (_bfd_compute_and_write_armap (arch, elength) != true) 1682 return false; 1683 } 1684 1685 if (elength != 0) 1686 { 1687 struct ar_hdr hdr; 1688 1689 memset ((char *) (&hdr), 0, sizeof (struct ar_hdr)); 1690 strcpy (hdr.ar_name, ename); 1691 /* Round size up to even number in archive header. */ 1692 sprintf (&(hdr.ar_size[0]), "%-10d", 1693 (int) ((elength + 1) & ~1)); 1694 strncpy (hdr.ar_fmag, ARFMAG, 2); 1695 for (i = 0; i < sizeof (struct ar_hdr); i++) 1696 if (((char *) (&hdr))[i] == '\0') 1697 (((char *) (&hdr))[i]) = ' '; 1698 if ((bfd_write ((char *) &hdr, 1, sizeof (struct ar_hdr), arch) 1699 != sizeof (struct ar_hdr)) 1700 || bfd_write (etable, 1, elength, arch) != elength) 1701 return false; 1702 if ((elength % 2) == 1) 1703 { 1704 if (bfd_write ("\012", 1, 1, arch) != 1) 1705 return false; 1706 } 1707 } 1708 1709 for (current = arch->archive_head; current; current = current->next) 1710 { 1711 char buffer[DEFAULT_BUFFERSIZE]; 1712 unsigned int remaining = arelt_size (current); 1713 struct ar_hdr *hdr = arch_hdr (current); 1714 1715 /* write ar header */ 1716 if (bfd_write ((char *) hdr, 1, sizeof (*hdr), arch) != sizeof (*hdr)) 1717 return false; 1718 if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0) 1719 return false; 1720 while (remaining) 1721 { 1722 unsigned int amt = DEFAULT_BUFFERSIZE; 1723 if (amt > remaining) 1724 amt = remaining; 1725 errno = 0; 1726 if (bfd_read (buffer, amt, 1, current) != amt) 1727 { 1728 if (bfd_get_error () != bfd_error_system_call) 1729 bfd_set_error (bfd_error_malformed_archive); 1730 return false; 1731 } 1732 if (bfd_write (buffer, amt, 1, arch) != amt) 1733 return false; 1734 remaining -= amt; 1735 } 1736 if ((arelt_size (current) % 2) == 1) 1737 { 1738 if (bfd_write ("\012", 1, 1, arch) != 1) 1739 return false; 1740 } 1741 } 1742 1743 if (makemap && hasobjects) 1744 { 1745 /* Verify the timestamp in the archive file. If it would not be 1746 accepted by the linker, rewrite it until it would be. If 1747 anything odd happens, break out and just return. (The 1748 Berkeley linker checks the timestamp and refuses to read the 1749 table-of-contents if it is >60 seconds less than the file's 1750 modified-time. That painful hack requires this painful hack. */ 1751 tries = 1; 1752 do 1753 { 1754 if (bfd_update_armap_timestamp (arch)) 1755 break; 1756 (*_bfd_error_handler) 1757 (_("Warning: writing archive was slow: rewriting timestamp\n")); 1758 } 1759 while (++tries < 6); 1760 } 1761 1762 return true; 1763 } 1764 1765 /* Note that the namidx for the first symbol is 0 */ 1766 1767 boolean 1768 _bfd_compute_and_write_armap (arch, elength) 1769 bfd *arch; 1770 unsigned int elength; 1771 { 1772 char *first_name = NULL; 1773 bfd *current; 1774 file_ptr elt_no = 0; 1775 struct orl *map = NULL; 1776 int orl_max = 1024; /* fine initial default */ 1777 int orl_count = 0; 1778 int stridx = 0; /* string index */ 1779 asymbol **syms = NULL; 1780 long syms_max = 0; 1781 boolean ret; 1782 1783 /* Dunno if this is the best place for this info... */ 1784 if (elength != 0) 1785 elength += sizeof (struct ar_hdr); 1786 elength += elength % 2; 1787 1788 map = (struct orl *) bfd_malloc (orl_max * sizeof (struct orl)); 1789 if (map == NULL) 1790 goto error_return; 1791 1792 /* We put the symbol names on the arch objalloc, and then discard 1793 them when done. */ 1794 first_name = bfd_alloc (arch, 1); 1795 if (first_name == NULL) 1796 goto error_return; 1797 1798 /* Drop all the files called __.SYMDEF, we're going to make our 1799 own */ 1800 while (arch->archive_head && 1801 strcmp (arch->archive_head->filename, "__.SYMDEF") == 0) 1802 arch->archive_head = arch->archive_head->next; 1803 1804 /* Map over each element */ 1805 for (current = arch->archive_head; 1806 current != (bfd *) NULL; 1807 current = current->next, elt_no++) 1808 { 1809 if ((bfd_check_format (current, bfd_object) == true) 1810 && ((bfd_get_file_flags (current) & HAS_SYMS))) 1811 { 1812 long storage; 1813 long symcount; 1814 long src_count; 1815 1816 storage = bfd_get_symtab_upper_bound (current); 1817 if (storage < 0) 1818 goto error_return; 1819 1820 if (storage != 0) 1821 { 1822 if (storage > syms_max) 1823 { 1824 if (syms_max > 0) 1825 free (syms); 1826 syms_max = storage; 1827 syms = (asymbol **) bfd_malloc ((size_t) syms_max); 1828 if (syms == NULL) 1829 goto error_return; 1830 } 1831 symcount = bfd_canonicalize_symtab (current, syms); 1832 if (symcount < 0) 1833 goto error_return; 1834 1835 /* Now map over all the symbols, picking out the ones we want */ 1836 for (src_count = 0; src_count < symcount; src_count++) 1837 { 1838 flagword flags = (syms[src_count])->flags; 1839 asection *sec = syms[src_count]->section; 1840 1841 if ((flags & BSF_GLOBAL || 1842 flags & BSF_WEAK || 1843 flags & BSF_INDIRECT || 1844 bfd_is_com_section (sec)) 1845 && ! bfd_is_und_section (sec)) 1846 { 1847 size_t namelen; 1848 struct orl *new_map; 1849 1850 /* This symbol will go into the archive header */ 1851 if (orl_count == orl_max) 1852 { 1853 orl_max *= 2; 1854 new_map = 1855 ((struct orl *) 1856 bfd_realloc (map, orl_max * sizeof (struct orl))); 1857 if (new_map == (struct orl *) NULL) 1858 goto error_return; 1859 1860 map = new_map; 1861 } 1862 1863 namelen = strlen (syms[src_count]->name); 1864 map[orl_count].name = ((char **) 1865 bfd_alloc (arch, 1866 sizeof (char *))); 1867 if (map[orl_count].name == NULL) 1868 goto error_return; 1869 *(map[orl_count].name) = bfd_alloc (arch, namelen + 1); 1870 if (*(map[orl_count].name) == NULL) 1871 goto error_return; 1872 strcpy (*(map[orl_count].name), syms[src_count]->name); 1873 (map[orl_count]).pos = (file_ptr) current; 1874 (map[orl_count]).namidx = stridx; 1875 1876 stridx += namelen + 1; 1877 ++orl_count; 1878 } 1879 } 1880 } 1881 1882 /* Now ask the BFD to free up any cached information, so we 1883 don't fill all of memory with symbol tables. */ 1884 if (! bfd_free_cached_info (current)) 1885 goto error_return; 1886 } 1887 } 1888 1889 /* OK, now we have collected all the data, let's write them out */ 1890 ret = BFD_SEND (arch, write_armap, 1891 (arch, elength, map, orl_count, stridx)); 1892 1893 if (syms_max > 0) 1894 free (syms); 1895 if (map != NULL) 1896 free (map); 1897 if (first_name != NULL) 1898 bfd_release (arch, first_name); 1899 1900 return ret; 1901 1902 error_return: 1903 if (syms_max > 0) 1904 free (syms); 1905 if (map != NULL) 1906 free (map); 1907 if (first_name != NULL) 1908 bfd_release (arch, first_name); 1909 1910 return false; 1911 } 1912 1913 boolean 1914 bsd_write_armap (arch, elength, map, orl_count, stridx) 1915 bfd *arch; 1916 unsigned int elength; 1917 struct orl *map; 1918 unsigned int orl_count; 1919 int stridx; 1920 { 1921 int padit = stridx & 1; 1922 unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE; 1923 unsigned int stringsize = stridx + padit; 1924 /* Include 8 bytes to store ranlibsize and stringsize in output. */ 1925 unsigned int mapsize = ranlibsize + stringsize + 8; 1926 file_ptr firstreal; 1927 bfd *current = arch->archive_head; 1928 bfd *last_elt = current; /* last element arch seen */ 1929 bfd_byte temp[4]; 1930 unsigned int count; 1931 struct ar_hdr hdr; 1932 struct stat statbuf; 1933 unsigned int i; 1934 1935 firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG; 1936 1937 stat (arch->filename, &statbuf); 1938 memset ((char *) (&hdr), 0, sizeof (struct ar_hdr)); 1939 sprintf (hdr.ar_name, RANLIBMAG); 1940 /* Remember the timestamp, to keep it holy. But fudge it a little. */ 1941 bfd_ardata (arch)->armap_timestamp = statbuf.st_mtime + ARMAP_TIME_OFFSET; 1942 bfd_ardata (arch)->armap_datepos = (SARMAG 1943 + offsetof (struct ar_hdr, ar_date[0])); 1944 sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp); 1945 sprintf (hdr.ar_uid, "%ld", (long) getuid ()); 1946 sprintf (hdr.ar_gid, "%ld", (long) getgid ()); 1947 sprintf (hdr.ar_size, "%-10d", (int) mapsize); 1948 strncpy (hdr.ar_fmag, ARFMAG, 2); 1949 for (i = 0; i < sizeof (struct ar_hdr); i++) 1950 if (((char *) (&hdr))[i] == '\0') 1951 (((char *) (&hdr))[i]) = ' '; 1952 if (bfd_write ((char *) &hdr, 1, sizeof (struct ar_hdr), arch) 1953 != sizeof (struct ar_hdr)) 1954 return false; 1955 bfd_h_put_32 (arch, (bfd_vma) ranlibsize, temp); 1956 if (bfd_write (temp, 1, sizeof (temp), arch) != sizeof (temp)) 1957 return false; 1958 1959 for (count = 0; count < orl_count; count++) 1960 { 1961 bfd_byte buf[BSD_SYMDEF_SIZE]; 1962 1963 if (((bfd *) (map[count]).pos) != last_elt) 1964 { 1965 do 1966 { 1967 firstreal += arelt_size (current) + sizeof (struct ar_hdr); 1968 firstreal += firstreal % 2; 1969 current = current->next; 1970 } 1971 while (current != (bfd *) (map[count]).pos); 1972 } /* if new archive element */ 1973 1974 last_elt = current; 1975 bfd_h_put_32 (arch, map[count].namidx, buf); 1976 bfd_h_put_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE); 1977 if (bfd_write (buf, BSD_SYMDEF_SIZE, 1, arch) != BSD_SYMDEF_SIZE) 1978 return false; 1979 } 1980 1981 /* now write the strings themselves */ 1982 bfd_h_put_32 (arch, stringsize, temp); 1983 if (bfd_write (temp, 1, sizeof (temp), arch) != sizeof (temp)) 1984 return false; 1985 for (count = 0; count < orl_count; count++) 1986 { 1987 size_t len = strlen (*map[count].name) + 1; 1988 1989 if (bfd_write (*map[count].name, 1, len, arch) != len) 1990 return false; 1991 } 1992 1993 /* The spec sez this should be a newline. But in order to be 1994 bug-compatible for sun's ar we use a null. */ 1995 if (padit) 1996 { 1997 if (bfd_write ("", 1, 1, arch) != 1) 1998 return false; 1999 } 2000 2001 return true; 2002 } 2003 2004 /* At the end of archive file handling, update the timestamp in the 2005 file, so the linker will accept it. 2006 2007 Return true if the timestamp was OK, or an unusual problem happened. 2008 Return false if we updated the timestamp. */ 2009 2010 boolean 2011 _bfd_archive_bsd_update_armap_timestamp (arch) 2012 bfd *arch; 2013 { 2014 struct stat archstat; 2015 struct ar_hdr hdr; 2016 unsigned int i; 2017 2018 /* Flush writes, get last-write timestamp from file, and compare it 2019 to the timestamp IN the file. */ 2020 bfd_flush (arch); 2021 if (bfd_stat (arch, &archstat) == -1) 2022 { 2023 perror (_("Reading archive file mod timestamp")); 2024 return true; /* Can't read mod time for some reason */ 2025 } 2026 if (archstat.st_mtime <= bfd_ardata (arch)->armap_timestamp) 2027 return true; /* OK by the linker's rules */ 2028 2029 /* Update the timestamp. */ 2030 bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET; 2031 2032 /* Prepare an ASCII version suitable for writing. */ 2033 memset (hdr.ar_date, 0, sizeof (hdr.ar_date)); 2034 sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp); 2035 for (i = 0; i < sizeof (hdr.ar_date); i++) 2036 if (hdr.ar_date[i] == '\0') 2037 (hdr.ar_date)[i] = ' '; 2038 2039 /* Write it into the file. */ 2040 bfd_ardata (arch)->armap_datepos = (SARMAG 2041 + offsetof (struct ar_hdr, ar_date[0])); 2042 if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0 2043 || (bfd_write (hdr.ar_date, sizeof (hdr.ar_date), 1, arch) 2044 != sizeof (hdr.ar_date))) 2045 { 2046 /* FIXME: bfd can't call perror. */ 2047 perror (_("Writing updated armap timestamp")); 2048 return true; /* Some error while writing */ 2049 } 2050 2051 return false; /* We updated the timestamp successfully. */ 2052 } 2053 2054 /* A coff armap looks like : 2055 lARMAG 2056 struct ar_hdr with name = '/' 2057 number of symbols 2058 offset of file for symbol 0 2059 offset of file for symbol 1 2060 2061 offset of file for symbol n-1 2062 symbol name 0 2063 symbol name 1 2064 2065 symbol name n-1 2066 */ 2067 2068 boolean 2069 coff_write_armap (arch, elength, map, symbol_count, stridx) 2070 bfd *arch; 2071 unsigned int elength; 2072 struct orl *map; 2073 unsigned int symbol_count; 2074 int stridx; 2075 { 2076 /* The size of the ranlib is the number of exported symbols in the 2077 archive * the number of bytes in a int, + an int for the count */ 2078 unsigned int ranlibsize = (symbol_count * 4) + 4; 2079 unsigned int stringsize = stridx; 2080 unsigned int mapsize = stringsize + ranlibsize; 2081 file_ptr archive_member_file_ptr; 2082 bfd *current = arch->archive_head; 2083 unsigned int count; 2084 struct ar_hdr hdr; 2085 unsigned int i; 2086 int padit = mapsize & 1; 2087 2088 if (padit) 2089 mapsize++; 2090 2091 /* work out where the first object file will go in the archive */ 2092 archive_member_file_ptr = (mapsize 2093 + elength 2094 + sizeof (struct ar_hdr) 2095 + SARMAG); 2096 2097 memset ((char *) (&hdr), 0, sizeof (struct ar_hdr)); 2098 hdr.ar_name[0] = '/'; 2099 sprintf (hdr.ar_size, "%-10d", (int) mapsize); 2100 sprintf (hdr.ar_date, "%ld", (long) time (NULL)); 2101 /* This, at least, is what Intel coff sets the values to.: */ 2102 sprintf ((hdr.ar_uid), "%d", 0); 2103 sprintf ((hdr.ar_gid), "%d", 0); 2104 sprintf ((hdr.ar_mode), "%-7o", (unsigned) 0); 2105 strncpy (hdr.ar_fmag, ARFMAG, 2); 2106 2107 for (i = 0; i < sizeof (struct ar_hdr); i++) 2108 if (((char *) (&hdr))[i] == '\0') 2109 (((char *) (&hdr))[i]) = ' '; 2110 2111 /* Write the ar header for this item and the number of symbols */ 2112 2113 if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), arch) 2114 != sizeof (struct ar_hdr)) 2115 return false; 2116 2117 bfd_write_bigendian_4byte_int (arch, symbol_count); 2118 2119 /* Two passes, first write the file offsets for each symbol - 2120 remembering that each offset is on a two byte boundary. */ 2121 2122 /* Write out the file offset for the file associated with each 2123 symbol, and remember to keep the offsets padded out. */ 2124 2125 current = arch->archive_head; 2126 count = 0; 2127 while (current != (bfd *) NULL && count < symbol_count) 2128 { 2129 /* For each symbol which is used defined in this object, write out 2130 the object file's address in the archive */ 2131 2132 while (((bfd *) (map[count]).pos) == current) 2133 { 2134 bfd_write_bigendian_4byte_int (arch, archive_member_file_ptr); 2135 count++; 2136 } 2137 /* Add size of this archive entry */ 2138 archive_member_file_ptr += (arelt_size (current) 2139 + sizeof (struct ar_hdr)); 2140 /* remember aboout the even alignment */ 2141 archive_member_file_ptr += archive_member_file_ptr % 2; 2142 current = current->next; 2143 } 2144 2145 /* now write the strings themselves */ 2146 for (count = 0; count < symbol_count; count++) 2147 { 2148 size_t len = strlen (*map[count].name) + 1; 2149 2150 if (bfd_write (*map[count].name, 1, len, arch) != len) 2151 return false; 2152 } 2153 2154 /* The spec sez this should be a newline. But in order to be 2155 bug-compatible for arc960 we use a null. */ 2156 if (padit) 2157 { 2158 if (bfd_write ("", 1, 1, arch) != 1) 2159 return false; 2160 } 2161 2162 return true; 2163 } 2164