1 // archive.cc -- archive support for gold 2 3 // Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4 // Written by Ian Lance Taylor <iant@google.com>. 5 6 // This file is part of gold. 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 3 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., 51 Franklin Street - Fifth Floor, Boston, 21 // MA 02110-1301, USA. 22 23 #include "gold.h" 24 25 #include <cerrno> 26 #include <cstring> 27 #include <climits> 28 #include <vector> 29 #include "libiberty.h" 30 #include "filenames.h" 31 32 #include "elfcpp.h" 33 #include "options.h" 34 #include "mapfile.h" 35 #include "fileread.h" 36 #include "readsyms.h" 37 #include "symtab.h" 38 #include "object.h" 39 #include "layout.h" 40 #include "archive.h" 41 #include "plugin.h" 42 #include "incremental.h" 43 44 namespace gold 45 { 46 47 // Library_base methods. 48 49 // Determine whether a definition of SYM_NAME should cause an archive 50 // library member to be included in the link. Returns SHOULD_INCLUDE_YES 51 // if the symbol is referenced but not defined, SHOULD_INCLUDE_NO if the 52 // symbol is already defined, and SHOULD_INCLUDE_UNKNOWN if the symbol is 53 // neither referenced nor defined. 54 55 Library_base::Should_include 56 Library_base::should_include_member(Symbol_table* symtab, Layout* layout, 57 const char* sym_name, Symbol** symp, 58 std::string* why, char** tmpbufp, 59 size_t* tmpbuflen) 60 { 61 // In an object file, and therefore in an archive map, an 62 // '@' in the name separates the symbol name from the 63 // version name. If there are two '@' characters, this is 64 // the default version. 65 char* tmpbuf = *tmpbufp; 66 const char* ver = strchr(sym_name, '@'); 67 bool def = false; 68 if (ver != NULL) 69 { 70 size_t symlen = ver - sym_name; 71 if (symlen + 1 > *tmpbuflen) 72 { 73 tmpbuf = static_cast<char*>(xrealloc(tmpbuf, symlen + 1)); 74 *tmpbufp = tmpbuf; 75 *tmpbuflen = symlen + 1; 76 } 77 memcpy(tmpbuf, sym_name, symlen); 78 tmpbuf[symlen] = '\0'; 79 sym_name = tmpbuf; 80 81 ++ver; 82 if (*ver == '@') 83 { 84 ++ver; 85 def = true; 86 } 87 } 88 89 Symbol* sym = symtab->lookup(sym_name, ver); 90 if (def 91 && ver != NULL 92 && (sym == NULL 93 || !sym->is_undefined() 94 || sym->binding() == elfcpp::STB_WEAK)) 95 sym = symtab->lookup(sym_name, NULL); 96 97 *symp = sym; 98 99 if (sym == NULL) 100 { 101 // Check whether the symbol was named in a -u option. 102 if (parameters->options().is_undefined(sym_name)) 103 { 104 *why = "-u "; 105 *why += sym_name; 106 } 107 else if (parameters->options().is_export_dynamic_symbol(sym_name)) 108 { 109 *why = "--export-dynamic-symbol "; 110 *why += sym_name; 111 } 112 else if (layout->script_options()->is_referenced(sym_name)) 113 { 114 size_t alc = 100 + strlen(sym_name); 115 char* buf = new char[alc]; 116 snprintf(buf, alc, _("script or expression reference to %s"), 117 sym_name); 118 *why = buf; 119 delete[] buf; 120 } 121 else if (strcmp(sym_name, parameters->entry()) == 0) 122 { 123 *why = "entry symbol "; 124 *why += sym_name; 125 } 126 else 127 return Library_base::SHOULD_INCLUDE_UNKNOWN; 128 } 129 else if (!sym->is_undefined()) 130 return Library_base::SHOULD_INCLUDE_NO; 131 // PR 12001: Do not include an archive when the undefined 132 // symbol has actually been defined on the command line. 133 else if (layout->script_options()->is_pending_assignment(sym_name)) 134 return Library_base::SHOULD_INCLUDE_NO; 135 else if (sym->binding() == elfcpp::STB_WEAK) 136 return Library_base::SHOULD_INCLUDE_UNKNOWN; 137 138 return Library_base::SHOULD_INCLUDE_YES; 139 } 140 141 // The header of an entry in the archive. This is all readable text, 142 // padded with spaces where necessary. If the contents of an archive 143 // are all text file, the entire archive is readable. 144 145 struct Archive::Archive_header 146 { 147 // The entry name. 148 char ar_name[16]; 149 // The file modification time. 150 char ar_date[12]; 151 // The user's UID in decimal. 152 char ar_uid[6]; 153 // The user's GID in decimal. 154 char ar_gid[6]; 155 // The file mode in octal. 156 char ar_mode[8]; 157 // The file size in decimal. 158 char ar_size[10]; 159 // The final magic code. 160 char ar_fmag[2]; 161 }; 162 163 // Class Archive static variables. 164 unsigned int Archive::total_archives; 165 unsigned int Archive::total_members; 166 unsigned int Archive::total_members_loaded; 167 168 // Archive methods. 169 170 const char Archive::armag[sarmag] = 171 { 172 '!', '<', 'a', 'r', 'c', 'h', '>', '\n' 173 }; 174 175 const char Archive::armagt[sarmag] = 176 { 177 '!', '<', 't', 'h', 'i', 'n', '>', '\n' 178 }; 179 180 const char Archive::arfmag[2] = { '`', '\n' }; 181 182 Archive::Archive(const std::string& name, Input_file* input_file, 183 bool is_thin_archive, Dirsearch* dirpath, Task* task) 184 : Library_base(task), name_(name), input_file_(input_file), armap_(), 185 armap_names_(), extended_names_(), armap_checked_(), seen_offsets_(), 186 members_(), is_thin_archive_(is_thin_archive), included_member_(false), 187 nested_archives_(), dirpath_(dirpath), num_members_(0), 188 included_all_members_(false) 189 { 190 this->no_export_ = 191 parameters->options().check_excluded_libs(input_file->found_name()); 192 } 193 194 // Set up the archive: read the symbol map and the extended name 195 // table. 196 197 void 198 Archive::setup() 199 { 200 // We need to ignore empty archives. 201 if (this->input_file_->file().filesize() == sarmag) 202 return; 203 204 // The first member of the archive should be the symbol table. 205 std::string armap_name; 206 off_t header_size = this->read_header(sarmag, false, &armap_name, NULL); 207 if (header_size == -1) 208 return; 209 210 section_size_type armap_size = convert_to_section_size_type(header_size); 211 off_t off = sarmag; 212 if (armap_name.empty()) 213 { 214 this->read_armap(sarmag + sizeof(Archive_header), armap_size); 215 off = sarmag + sizeof(Archive_header) + armap_size; 216 } 217 else if (!this->input_file_->options().whole_archive()) 218 gold_error(_("%s: no archive symbol table (run ranlib)"), 219 this->name().c_str()); 220 221 // See if there is an extended name table. We cache these views 222 // because it is likely that we will want to read the following 223 // header in the add_symbols routine. 224 if ((off & 1) != 0) 225 ++off; 226 std::string xname; 227 header_size = this->read_header(off, true, &xname, NULL); 228 if (header_size == -1) 229 return; 230 231 section_size_type extended_size = convert_to_section_size_type(header_size); 232 if (xname == "/") 233 { 234 const unsigned char* p = this->get_view(off + sizeof(Archive_header), 235 extended_size, false, true); 236 const char* px = reinterpret_cast<const char*>(p); 237 this->extended_names_.assign(px, extended_size); 238 } 239 bool preread_syms = (parameters->options().threads() 240 && parameters->options().preread_archive_symbols()); 241 #ifndef ENABLE_THREADS 242 preread_syms = false; 243 #else 244 if (parameters->options().has_plugins()) 245 preread_syms = false; 246 #endif 247 if (preread_syms) 248 this->read_all_symbols(); 249 } 250 251 // Unlock any nested archives. 252 253 void 254 Archive::unlock_nested_archives() 255 { 256 for (Nested_archive_table::iterator p = this->nested_archives_.begin(); 257 p != this->nested_archives_.end(); 258 ++p) 259 { 260 p->second->unlock(this->task_); 261 } 262 } 263 264 // Read the archive symbol map. 265 266 void 267 Archive::read_armap(off_t start, section_size_type size) 268 { 269 // To count the total number of archive members, we'll just count 270 // the number of times the file offset changes. Since most archives 271 // group the symbols in the armap by object, this ought to give us 272 // an accurate count. 273 off_t last_seen_offset = -1; 274 275 // Read in the entire armap. 276 const unsigned char* p = this->get_view(start, size, true, false); 277 278 // Numbers in the armap are always big-endian. 279 const elfcpp::Elf_Word* pword = reinterpret_cast<const elfcpp::Elf_Word*>(p); 280 unsigned int nsyms = elfcpp::Swap<32, true>::readval(pword); 281 ++pword; 282 283 // Note that the addition is in units of sizeof(elfcpp::Elf_Word). 284 const char* pnames = reinterpret_cast<const char*>(pword + nsyms); 285 section_size_type names_size = 286 reinterpret_cast<const char*>(p) + size - pnames; 287 this->armap_names_.assign(pnames, names_size); 288 289 this->armap_.resize(nsyms); 290 291 section_offset_type name_offset = 0; 292 for (unsigned int i = 0; i < nsyms; ++i) 293 { 294 this->armap_[i].name_offset = name_offset; 295 this->armap_[i].file_offset = elfcpp::Swap<32, true>::readval(pword); 296 name_offset += strlen(pnames + name_offset) + 1; 297 ++pword; 298 if (this->armap_[i].file_offset != last_seen_offset) 299 { 300 last_seen_offset = this->armap_[i].file_offset; 301 ++this->num_members_; 302 } 303 } 304 305 if (static_cast<section_size_type>(name_offset) > names_size) 306 gold_error(_("%s: bad archive symbol table names"), 307 this->name().c_str()); 308 309 // This array keeps track of which symbols are for archive elements 310 // which we have already included in the link. 311 this->armap_checked_.resize(nsyms); 312 } 313 314 // Read the header of an archive member at OFF. Fail if something 315 // goes wrong. Return the size of the member. Set *PNAME to the name 316 // of the member. 317 318 off_t 319 Archive::read_header(off_t off, bool cache, std::string* pname, 320 off_t* nested_off) 321 { 322 const unsigned char* p = this->get_view(off, sizeof(Archive_header), true, 323 cache); 324 const Archive_header* hdr = reinterpret_cast<const Archive_header*>(p); 325 return this->interpret_header(hdr, off, pname, nested_off); 326 } 327 328 // Interpret the header of HDR, the header of the archive member at 329 // file offset OFF. Return the size of the member, or -1 if something 330 // has gone wrong. Set *PNAME to the name of the member. 331 332 off_t 333 Archive::interpret_header(const Archive_header* hdr, off_t off, 334 std::string* pname, off_t* nested_off) const 335 { 336 if (memcmp(hdr->ar_fmag, arfmag, sizeof arfmag) != 0) 337 { 338 gold_error(_("%s: malformed archive header at %zu"), 339 this->name().c_str(), static_cast<size_t>(off)); 340 return -1; 341 } 342 343 const int size_string_size = sizeof hdr->ar_size; 344 char size_string[size_string_size + 1]; 345 memcpy(size_string, hdr->ar_size, size_string_size); 346 char* ps = size_string + size_string_size; 347 while (ps[-1] == ' ') 348 --ps; 349 *ps = '\0'; 350 351 errno = 0; 352 char* end; 353 off_t member_size = strtol(size_string, &end, 10); 354 if (*end != '\0' 355 || member_size < 0 356 || (member_size == LONG_MAX && errno == ERANGE)) 357 { 358 gold_error(_("%s: malformed archive header size at %zu"), 359 this->name().c_str(), static_cast<size_t>(off)); 360 return -1; 361 } 362 363 if (hdr->ar_name[0] != '/') 364 { 365 const char* name_end = strchr(hdr->ar_name, '/'); 366 if (name_end == NULL 367 || name_end - hdr->ar_name >= static_cast<int>(sizeof hdr->ar_name)) 368 { 369 gold_error(_("%s: malformed archive header name at %zu"), 370 this->name().c_str(), static_cast<size_t>(off)); 371 return -1; 372 } 373 pname->assign(hdr->ar_name, name_end - hdr->ar_name); 374 if (nested_off != NULL) 375 *nested_off = 0; 376 } 377 else if (hdr->ar_name[1] == ' ') 378 { 379 // This is the symbol table. 380 if (!pname->empty()) 381 pname->clear(); 382 } 383 else if (hdr->ar_name[1] == '/') 384 { 385 // This is the extended name table. 386 pname->assign(1, '/'); 387 } 388 else 389 { 390 errno = 0; 391 long x = strtol(hdr->ar_name + 1, &end, 10); 392 long y = 0; 393 if (*end == ':') 394 y = strtol(end + 1, &end, 10); 395 if (*end != ' ' 396 || x < 0 397 || (x == LONG_MAX && errno == ERANGE) 398 || static_cast<size_t>(x) >= this->extended_names_.size()) 399 { 400 gold_error(_("%s: bad extended name index at %zu"), 401 this->name().c_str(), static_cast<size_t>(off)); 402 return -1; 403 } 404 405 const char* name = this->extended_names_.data() + x; 406 const char* name_end = strchr(name, '\n'); 407 if (static_cast<size_t>(name_end - name) > this->extended_names_.size() 408 || name_end[-1] != '/') 409 { 410 gold_error(_("%s: bad extended name entry at header %zu"), 411 this->name().c_str(), static_cast<size_t>(off)); 412 return -1; 413 } 414 pname->assign(name, name_end - 1 - name); 415 if (nested_off != NULL) 416 *nested_off = y; 417 } 418 419 return member_size; 420 } 421 422 // An archive member iterator. 423 424 class Archive::const_iterator 425 { 426 public: 427 // The header of an archive member. This is what this iterator 428 // points to. 429 struct Header 430 { 431 // The name of the member. 432 std::string name; 433 // The file offset of the member. 434 off_t off; 435 // The file offset of a nested archive member. 436 off_t nested_off; 437 // The size of the member. 438 off_t size; 439 }; 440 441 const_iterator(Archive* archive, off_t off) 442 : archive_(archive), off_(off) 443 { this->read_next_header(); } 444 445 const Header& 446 operator*() const 447 { return this->header_; } 448 449 const Header* 450 operator->() const 451 { return &this->header_; } 452 453 const_iterator& 454 operator++() 455 { 456 if (this->off_ == this->archive_->file().filesize()) 457 return *this; 458 this->off_ += sizeof(Archive_header); 459 if (!this->archive_->is_thin_archive()) 460 this->off_ += this->header_.size; 461 if ((this->off_ & 1) != 0) 462 ++this->off_; 463 this->read_next_header(); 464 return *this; 465 } 466 467 const_iterator 468 operator++(int) 469 { 470 const_iterator ret = *this; 471 ++*this; 472 return ret; 473 } 474 475 bool 476 operator==(const const_iterator p) const 477 { return this->off_ == p->off; } 478 479 bool 480 operator!=(const const_iterator p) const 481 { return this->off_ != p->off; } 482 483 private: 484 void 485 read_next_header(); 486 487 // The underlying archive. 488 Archive* archive_; 489 // The current offset in the file. 490 off_t off_; 491 // The current archive header. 492 Header header_; 493 }; 494 495 // Read the next archive header. 496 497 void 498 Archive::const_iterator::read_next_header() 499 { 500 off_t filesize = this->archive_->file().filesize(); 501 while (true) 502 { 503 if (filesize - this->off_ < static_cast<off_t>(sizeof(Archive_header))) 504 { 505 if (filesize != this->off_) 506 { 507 gold_error(_("%s: short archive header at %zu"), 508 this->archive_->filename().c_str(), 509 static_cast<size_t>(this->off_)); 510 this->off_ = filesize; 511 } 512 this->header_.off = filesize; 513 return; 514 } 515 516 unsigned char buf[sizeof(Archive_header)]; 517 this->archive_->file().read(this->off_, sizeof(Archive_header), buf); 518 519 const Archive_header* hdr = reinterpret_cast<const Archive_header*>(buf); 520 off_t size = this->archive_->interpret_header(hdr, this->off_, 521 &this->header_.name, 522 &this->header_.nested_off); 523 if (size == -1) 524 { 525 this->header_.off = filesize; 526 return; 527 } 528 529 this->header_.size = size; 530 this->header_.off = this->off_; 531 532 // Skip special members. 533 if (!this->header_.name.empty() && this->header_.name != "/") 534 return; 535 536 this->off_ += sizeof(Archive_header) + this->header_.size; 537 if ((this->off_ & 1) != 0) 538 ++this->off_; 539 } 540 } 541 542 // Initial iterator. 543 544 Archive::const_iterator 545 Archive::begin() 546 { 547 return Archive::const_iterator(this, sarmag); 548 } 549 550 // Final iterator. 551 552 Archive::const_iterator 553 Archive::end() 554 { 555 return Archive::const_iterator(this, this->input_file_->file().filesize()); 556 } 557 558 // Get the file and offset for an archive member, which may be an 559 // external member of a thin archive. Set *INPUT_FILE to the 560 // file containing the actual member, *MEMOFF to the offset 561 // within that file (0 if not a nested archive), and *MEMBER_NAME 562 // to the name of the archive member. Return TRUE on success. 563 564 bool 565 Archive::get_file_and_offset(off_t off, Input_file** input_file, off_t* memoff, 566 off_t* memsize, std::string* member_name) 567 { 568 off_t nested_off; 569 570 *memsize = this->read_header(off, false, member_name, &nested_off); 571 if (*memsize == -1) 572 return false; 573 574 *input_file = this->input_file_; 575 *memoff = off + static_cast<off_t>(sizeof(Archive_header)); 576 577 if (!this->is_thin_archive_) 578 return true; 579 580 // Adjust a relative pathname so that it is relative 581 // to the directory containing the archive. 582 if (!IS_ABSOLUTE_PATH(member_name->c_str())) 583 { 584 const char* arch_path = this->filename().c_str(); 585 const char* basename = lbasename(arch_path); 586 if (basename > arch_path) 587 member_name->replace(0, 0, 588 this->filename().substr(0, basename - arch_path)); 589 } 590 591 if (nested_off > 0) 592 { 593 // This is a member of a nested archive. Open the containing 594 // archive if we don't already have it open, then do a recursive 595 // call to include the member from that archive. 596 Archive* arch; 597 Nested_archive_table::const_iterator p = 598 this->nested_archives_.find(*member_name); 599 if (p != this->nested_archives_.end()) 600 arch = p->second; 601 else 602 { 603 Input_file_argument* input_file_arg = 604 new Input_file_argument(member_name->c_str(), 605 Input_file_argument::INPUT_FILE_TYPE_FILE, 606 "", false, parameters->options()); 607 *input_file = new Input_file(input_file_arg); 608 int dummy = 0; 609 if (!(*input_file)->open(*this->dirpath_, this->task_, &dummy)) 610 return false; 611 arch = new Archive(*member_name, *input_file, false, this->dirpath_, 612 this->task_); 613 arch->setup(); 614 std::pair<Nested_archive_table::iterator, bool> ins = 615 this->nested_archives_.insert(std::make_pair(*member_name, arch)); 616 gold_assert(ins.second); 617 } 618 return arch->get_file_and_offset(nested_off, input_file, memoff, 619 memsize, member_name); 620 } 621 622 // This is an external member of a thin archive. Open the 623 // file as a regular relocatable object file. 624 Input_file_argument* input_file_arg = 625 new Input_file_argument(member_name->c_str(), 626 Input_file_argument::INPUT_FILE_TYPE_FILE, 627 "", false, this->input_file_->options()); 628 *input_file = new Input_file(input_file_arg); 629 int dummy = 0; 630 if (!(*input_file)->open(*this->dirpath_, this->task_, &dummy)) 631 return false; 632 633 *memoff = 0; 634 *memsize = (*input_file)->file().filesize(); 635 return true; 636 } 637 638 // Return an ELF object for the member at offset OFF. If 639 // PUNCONFIGURED is not NULL, then if the ELF object has an 640 // unsupported target type, set *PUNCONFIGURED to true and return 641 // NULL. 642 643 Object* 644 Archive::get_elf_object_for_member(off_t off, bool* punconfigured) 645 { 646 if (punconfigured != NULL) 647 *punconfigured = false; 648 649 Input_file* input_file; 650 off_t memoff; 651 off_t memsize; 652 std::string member_name; 653 if (!this->get_file_and_offset(off, &input_file, &memoff, &memsize, 654 &member_name)) 655 return NULL; 656 657 if (parameters->options().has_plugins()) 658 { 659 Object* obj = parameters->options().plugins()->claim_file(input_file, 660 memoff, 661 memsize, 662 NULL); 663 if (obj != NULL) 664 { 665 // The input file was claimed by a plugin, and its symbols 666 // have been provided by the plugin. 667 return obj; 668 } 669 } 670 671 const unsigned char* ehdr; 672 int read_size; 673 if (!is_elf_object(input_file, memoff, &ehdr, &read_size)) 674 { 675 gold_error(_("%s: member at %zu is not an ELF object"), 676 this->name().c_str(), static_cast<size_t>(off)); 677 return NULL; 678 } 679 680 Object* obj = make_elf_object((std::string(this->input_file_->filename()) 681 + "(" + member_name + ")"), 682 input_file, memoff, ehdr, read_size, 683 punconfigured); 684 if (obj == NULL) 685 return NULL; 686 obj->set_no_export(this->no_export()); 687 return obj; 688 } 689 690 // Read the symbols from all the archive members in the link. 691 692 void 693 Archive::read_all_symbols() 694 { 695 for (Archive::const_iterator p = this->begin(); 696 p != this->end(); 697 ++p) 698 this->read_symbols(p->off); 699 } 700 701 // Read the symbols from an archive member in the link. OFF is the file 702 // offset of the member header. 703 704 void 705 Archive::read_symbols(off_t off) 706 { 707 Object* obj = this->get_elf_object_for_member(off, NULL); 708 if (obj == NULL) 709 return; 710 711 Read_symbols_data* sd = new Read_symbols_data; 712 obj->read_symbols(sd); 713 Archive_member member(obj, sd); 714 this->members_[off] = member; 715 } 716 717 // Select members from the archive and add them to the link. We walk 718 // through the elements in the archive map, and look each one up in 719 // the symbol table. If it exists as a strong undefined symbol, we 720 // pull in the corresponding element. We have to do this in a loop, 721 // since pulling in one element may create new undefined symbols which 722 // may be satisfied by other objects in the archive. Return true in 723 // the normal case, false if the first member we tried to add from 724 // this archive had an incompatible target. 725 726 bool 727 Archive::add_symbols(Symbol_table* symtab, Layout* layout, 728 Input_objects* input_objects, Mapfile* mapfile) 729 { 730 ++Archive::total_archives; 731 732 if (this->input_file_->options().whole_archive()) 733 return this->include_all_members(symtab, layout, input_objects, 734 mapfile); 735 736 Archive::total_members += this->num_members_; 737 738 input_objects->archive_start(this); 739 740 const size_t armap_size = this->armap_.size(); 741 742 // This is a quick optimization, since we usually see many symbols 743 // in a row with the same offset. last_seen_offset holds the last 744 // offset we saw that was present in the seen_offsets_ set. 745 off_t last_seen_offset = -1; 746 747 // Track which symbols in the symbol table we've already found to be 748 // defined. 749 750 char* tmpbuf = NULL; 751 size_t tmpbuflen = 0; 752 bool added_new_object; 753 do 754 { 755 added_new_object = false; 756 for (size_t i = 0; i < armap_size; ++i) 757 { 758 if (this->armap_checked_[i]) 759 continue; 760 if (this->armap_[i].file_offset == last_seen_offset) 761 { 762 this->armap_checked_[i] = true; 763 continue; 764 } 765 if (this->seen_offsets_.find(this->armap_[i].file_offset) 766 != this->seen_offsets_.end()) 767 { 768 this->armap_checked_[i] = true; 769 last_seen_offset = this->armap_[i].file_offset; 770 continue; 771 } 772 773 const char* sym_name = (this->armap_names_.data() 774 + this->armap_[i].name_offset); 775 776 Symbol* sym; 777 std::string why; 778 Archive::Should_include t = 779 Archive::should_include_member(symtab, layout, sym_name, &sym, 780 &why, &tmpbuf, &tmpbuflen); 781 782 if (t == Archive::SHOULD_INCLUDE_NO 783 || t == Archive::SHOULD_INCLUDE_YES) 784 this->armap_checked_[i] = true; 785 786 if (t != Archive::SHOULD_INCLUDE_YES) 787 continue; 788 789 // We want to include this object in the link. 790 last_seen_offset = this->armap_[i].file_offset; 791 this->seen_offsets_.insert(last_seen_offset); 792 793 if (!this->include_member(symtab, layout, input_objects, 794 last_seen_offset, mapfile, sym, 795 why.c_str())) 796 { 797 if (tmpbuf != NULL) 798 free(tmpbuf); 799 return false; 800 } 801 802 added_new_object = true; 803 } 804 } 805 while (added_new_object); 806 807 if (tmpbuf != NULL) 808 free(tmpbuf); 809 810 input_objects->archive_stop(this); 811 812 return true; 813 } 814 815 // Return whether the archive includes a member which defines the 816 // symbol SYM. 817 818 bool 819 Archive::defines_symbol(Symbol* sym) const 820 { 821 const char* symname = sym->name(); 822 size_t symname_len = strlen(symname); 823 size_t armap_size = this->armap_.size(); 824 for (size_t i = 0; i < armap_size; ++i) 825 { 826 if (this->armap_checked_[i]) 827 continue; 828 const char* archive_symname = (this->armap_names_.data() 829 + this->armap_[i].name_offset); 830 if (strncmp(archive_symname, symname, symname_len) != 0) 831 continue; 832 char c = archive_symname[symname_len]; 833 if (c == '\0' && sym->version() == NULL) 834 return true; 835 if (c == '@') 836 { 837 const char* ver = archive_symname + symname_len + 1; 838 if (*ver == '@') 839 { 840 if (sym->version() == NULL) 841 return true; 842 ++ver; 843 } 844 if (sym->version() != NULL && strcmp(sym->version(), ver) == 0) 845 return true; 846 } 847 } 848 return false; 849 } 850 851 // Include all the archive members in the link. This is for --whole-archive. 852 853 bool 854 Archive::include_all_members(Symbol_table* symtab, Layout* layout, 855 Input_objects* input_objects, Mapfile* mapfile) 856 { 857 // Don't include the same archive twice. This can happen if 858 // --whole-archive is nested inside --start-group (PR gold/12163). 859 if (this->included_all_members_) 860 return true; 861 862 this->included_all_members_ = true; 863 864 input_objects->archive_start(this); 865 866 if (this->members_.size() > 0) 867 { 868 std::map<off_t, Archive_member>::const_iterator p; 869 for (p = this->members_.begin(); 870 p != this->members_.end(); 871 ++p) 872 { 873 if (!this->include_member(symtab, layout, input_objects, p->first, 874 mapfile, NULL, "--whole-archive")) 875 return false; 876 ++Archive::total_members; 877 } 878 } 879 else 880 { 881 for (Archive::const_iterator p = this->begin(); 882 p != this->end(); 883 ++p) 884 { 885 if (!this->include_member(symtab, layout, input_objects, p->off, 886 mapfile, NULL, "--whole-archive")) 887 return false; 888 ++Archive::total_members; 889 } 890 } 891 892 input_objects->archive_stop(this); 893 894 return true; 895 } 896 897 // Return the number of members in the archive. This is only used for 898 // reports. 899 900 size_t 901 Archive::count_members() 902 { 903 size_t ret = 0; 904 for (Archive::const_iterator p = this->begin(); 905 p != this->end(); 906 ++p) 907 ++ret; 908 return ret; 909 } 910 911 // Include an archive member in the link. OFF is the file offset of 912 // the member header. WHY is the reason we are including this member. 913 // Return true if we added the member or if we had an error, return 914 // false if this was the first member we tried to add from this 915 // archive and it had an incompatible format. 916 917 bool 918 Archive::include_member(Symbol_table* symtab, Layout* layout, 919 Input_objects* input_objects, off_t off, 920 Mapfile* mapfile, Symbol* sym, const char* why) 921 { 922 ++Archive::total_members_loaded; 923 924 std::map<off_t, Archive_member>::const_iterator p = this->members_.find(off); 925 if (p != this->members_.end()) 926 { 927 Object* obj = p->second.obj_; 928 929 Read_symbols_data* sd = p->second.sd_; 930 if (mapfile != NULL) 931 mapfile->report_include_archive_member(obj->name(), sym, why); 932 if (input_objects->add_object(obj)) 933 { 934 obj->layout(symtab, layout, sd); 935 obj->add_symbols(symtab, sd, layout); 936 this->included_member_ = true; 937 } 938 delete sd; 939 return true; 940 } 941 942 // If this is the first object we are including from this archive, 943 // and we searched for this archive, most likely because it was 944 // found via a -l option, then if the target is incompatible we want 945 // to move on to the next archive found in the search path. 946 bool unconfigured = false; 947 bool* punconfigured = NULL; 948 if (!this->included_member_ && this->searched_for()) 949 punconfigured = &unconfigured; 950 951 Object* obj = this->get_elf_object_for_member(off, punconfigured); 952 if (obj == NULL) 953 { 954 // Return false to search for another archive, true if we found 955 // an error. 956 return unconfigured ? false : true; 957 } 958 959 if (mapfile != NULL) 960 mapfile->report_include_archive_member(obj->name(), sym, why); 961 962 Pluginobj* pluginobj = obj->pluginobj(); 963 if (pluginobj != NULL) 964 { 965 pluginobj->add_symbols(symtab, NULL, layout); 966 this->included_member_ = true; 967 return true; 968 } 969 970 if (!input_objects->add_object(obj)) 971 { 972 // If this is an external member of a thin archive, unlock the 973 // file. 974 if (obj->offset() == 0) 975 obj->unlock(this->task_); 976 delete obj; 977 } 978 else 979 { 980 { 981 if (layout->incremental_inputs() != NULL) 982 layout->incremental_inputs()->report_object(obj, 0, this, NULL); 983 Read_symbols_data sd; 984 obj->read_symbols(&sd); 985 obj->layout(symtab, layout, &sd); 986 obj->add_symbols(symtab, &sd, layout); 987 } 988 989 // If this is an external member of a thin archive, unlock the file 990 // for the next task. 991 if (obj->offset() == 0) 992 obj->unlock(this->task_); 993 994 this->included_member_ = true; 995 } 996 997 return true; 998 } 999 1000 // Iterate over all unused symbols, and call the visitor class V for each. 1001 1002 void 1003 Archive::do_for_all_unused_symbols(Symbol_visitor_base* v) const 1004 { 1005 for (std::vector<Armap_entry>::const_iterator p = this->armap_.begin(); 1006 p != this->armap_.end(); 1007 ++p) 1008 { 1009 if (this->seen_offsets_.find(p->file_offset) 1010 == this->seen_offsets_.end()) 1011 v->visit(this->armap_names_.data() + p->name_offset); 1012 } 1013 } 1014 1015 // Print statistical information to stderr. This is used for --stats. 1016 1017 void 1018 Archive::print_stats() 1019 { 1020 fprintf(stderr, _("%s: archive libraries: %u\n"), 1021 program_name, Archive::total_archives); 1022 fprintf(stderr, _("%s: total archive members: %u\n"), 1023 program_name, Archive::total_members); 1024 fprintf(stderr, _("%s: loaded archive members: %u\n"), 1025 program_name, Archive::total_members_loaded); 1026 } 1027 1028 // Add_archive_symbols methods. 1029 1030 Add_archive_symbols::~Add_archive_symbols() 1031 { 1032 if (this->this_blocker_ != NULL) 1033 delete this->this_blocker_; 1034 // next_blocker_ is deleted by the task associated with the next 1035 // input file. 1036 } 1037 1038 // Return whether we can add the archive symbols. We are blocked by 1039 // this_blocker_. We block next_blocker_. We also lock the file. 1040 1041 Task_token* 1042 Add_archive_symbols::is_runnable() 1043 { 1044 if (this->this_blocker_ != NULL && this->this_blocker_->is_blocked()) 1045 return this->this_blocker_; 1046 return NULL; 1047 } 1048 1049 void 1050 Add_archive_symbols::locks(Task_locker* tl) 1051 { 1052 tl->add(this, this->next_blocker_); 1053 tl->add(this, this->archive_->token()); 1054 } 1055 1056 void 1057 Add_archive_symbols::run(Workqueue* workqueue) 1058 { 1059 // For an incremental link, begin recording layout information. 1060 Incremental_inputs* incremental_inputs = this->layout_->incremental_inputs(); 1061 if (incremental_inputs != NULL) 1062 { 1063 unsigned int arg_serial = this->input_argument_->file().arg_serial(); 1064 Script_info* script_info = this->input_argument_->script_info(); 1065 incremental_inputs->report_archive_begin(this->archive_, arg_serial, 1066 script_info); 1067 } 1068 1069 bool added = this->archive_->add_symbols(this->symtab_, this->layout_, 1070 this->input_objects_, 1071 this->mapfile_); 1072 this->archive_->unlock_nested_archives(); 1073 1074 this->archive_->release(); 1075 this->archive_->clear_uncached_views(); 1076 1077 if (!added) 1078 { 1079 // This archive holds object files which are incompatible with 1080 // our output file. 1081 Read_symbols::incompatible_warning(this->input_argument_, 1082 this->archive_->input_file()); 1083 Read_symbols::requeue(workqueue, this->input_objects_, this->symtab_, 1084 this->layout_, this->dirpath_, this->dirindex_, 1085 this->mapfile_, this->input_argument_, 1086 this->input_group_, this->next_blocker_); 1087 delete this->archive_; 1088 return; 1089 } 1090 1091 if (this->input_group_ != NULL) 1092 this->input_group_->add_archive(this->archive_); 1093 else 1094 { 1095 // For an incremental link, finish recording the layout information. 1096 if (incremental_inputs != NULL) 1097 incremental_inputs->report_archive_end(this->archive_); 1098 1099 if (!parameters->options().has_plugins() 1100 || this->archive_->input_file()->options().whole_archive()) 1101 { 1102 // We no longer need to know about this archive. 1103 delete this->archive_; 1104 } 1105 else 1106 { 1107 // The plugin interface may want to rescan this archive. 1108 parameters->options().plugins()->save_archive(this->archive_); 1109 } 1110 1111 this->archive_ = NULL; 1112 } 1113 } 1114 1115 // Class Lib_group static variables. 1116 unsigned int Lib_group::total_lib_groups; 1117 unsigned int Lib_group::total_members; 1118 unsigned int Lib_group::total_members_loaded; 1119 1120 Lib_group::Lib_group(const Input_file_lib* lib, Task* task) 1121 : Library_base(task), lib_(lib), members_() 1122 { 1123 this->members_.resize(lib->size()); 1124 } 1125 1126 const std::string& 1127 Lib_group::do_filename() const 1128 { 1129 std::string *filename = new std::string("/group/"); 1130 return *filename; 1131 } 1132 1133 // Select members from the lib group and add them to the link. We walk 1134 // through the members, and check if each one up should be included. 1135 // If the object says it should be included, we do so. We have to do 1136 // this in a loop, since including one member may create new undefined 1137 // symbols which may be satisfied by other members. 1138 1139 void 1140 Lib_group::add_symbols(Symbol_table* symtab, Layout* layout, 1141 Input_objects* input_objects) 1142 { 1143 ++Lib_group::total_lib_groups; 1144 1145 Lib_group::total_members += this->members_.size(); 1146 1147 bool added_new_object; 1148 do 1149 { 1150 added_new_object = false; 1151 unsigned int i = 0; 1152 while (i < this->members_.size()) 1153 { 1154 const Archive_member& member = this->members_[i]; 1155 Object* obj = member.obj_; 1156 std::string why; 1157 1158 // Skip files with no symbols. Plugin objects have 1159 // member.sd_ == NULL. 1160 if (obj != NULL 1161 && (member.sd_ == NULL || member.sd_->symbol_names != NULL)) 1162 { 1163 Archive::Should_include t = obj->should_include_member(symtab, 1164 layout, 1165 member.sd_, 1166 &why); 1167 1168 if (t != Archive::SHOULD_INCLUDE_YES) 1169 { 1170 ++i; 1171 continue; 1172 } 1173 1174 this->include_member(symtab, layout, input_objects, member); 1175 1176 added_new_object = true; 1177 } 1178 else 1179 { 1180 if (member.sd_ != NULL) 1181 { 1182 // The file must be locked in order to destroy the views 1183 // associated with it. 1184 gold_assert(obj != NULL); 1185 obj->lock(this->task_); 1186 delete member.sd_; 1187 obj->unlock(this->task_); 1188 } 1189 } 1190 1191 this->members_[i] = this->members_.back(); 1192 this->members_.pop_back(); 1193 } 1194 } 1195 while (added_new_object); 1196 } 1197 1198 // Include a lib group member in the link. 1199 1200 void 1201 Lib_group::include_member(Symbol_table* symtab, Layout* layout, 1202 Input_objects* input_objects, 1203 const Archive_member& member) 1204 { 1205 ++Lib_group::total_members_loaded; 1206 1207 Object* obj = member.obj_; 1208 gold_assert(obj != NULL); 1209 1210 Pluginobj* pluginobj = obj->pluginobj(); 1211 if (pluginobj != NULL) 1212 { 1213 pluginobj->add_symbols(symtab, NULL, layout); 1214 return; 1215 } 1216 1217 Read_symbols_data* sd = member.sd_; 1218 gold_assert(sd != NULL); 1219 obj->lock(this->task_); 1220 if (input_objects->add_object(obj)) 1221 { 1222 if (layout->incremental_inputs() != NULL) 1223 layout->incremental_inputs()->report_object(obj, member.arg_serial_, 1224 this, NULL); 1225 obj->layout(symtab, layout, sd); 1226 obj->add_symbols(symtab, sd, layout); 1227 } 1228 delete sd; 1229 // Unlock the file for the next task. 1230 obj->unlock(this->task_); 1231 } 1232 1233 // Iterate over all unused symbols, and call the visitor class V for each. 1234 1235 void 1236 Lib_group::do_for_all_unused_symbols(Symbol_visitor_base* v) const 1237 { 1238 // Files are removed from the members list when used, so all the 1239 // files remaining on the list are unused. 1240 for (std::vector<Archive_member>::const_iterator p = this->members_.begin(); 1241 p != this->members_.end(); 1242 ++p) 1243 { 1244 Object* obj = p->obj_; 1245 obj->for_all_global_symbols(p->sd_, v); 1246 } 1247 } 1248 1249 // Print statistical information to stderr. This is used for --stats. 1250 1251 void 1252 Lib_group::print_stats() 1253 { 1254 fprintf(stderr, _("%s: lib groups: %u\n"), 1255 program_name, Lib_group::total_lib_groups); 1256 fprintf(stderr, _("%s: total lib groups members: %u\n"), 1257 program_name, Lib_group::total_members); 1258 fprintf(stderr, _("%s: loaded lib groups members: %u\n"), 1259 program_name, Lib_group::total_members_loaded); 1260 } 1261 1262 Task_token* 1263 Add_lib_group_symbols::is_runnable() 1264 { 1265 if (this->readsyms_blocker_ != NULL && this->readsyms_blocker_->is_blocked()) 1266 return this->readsyms_blocker_; 1267 if (this->this_blocker_ != NULL && this->this_blocker_->is_blocked()) 1268 return this->this_blocker_; 1269 return NULL; 1270 } 1271 1272 void 1273 Add_lib_group_symbols::locks(Task_locker* tl) 1274 { 1275 tl->add(this, this->next_blocker_); 1276 } 1277 1278 void 1279 Add_lib_group_symbols::run(Workqueue*) 1280 { 1281 // For an incremental link, begin recording layout information. 1282 Incremental_inputs* incremental_inputs = this->layout_->incremental_inputs(); 1283 if (incremental_inputs != NULL) 1284 incremental_inputs->report_archive_begin(this->lib_, 0, NULL); 1285 1286 this->lib_->add_symbols(this->symtab_, this->layout_, this->input_objects_); 1287 1288 if (incremental_inputs != NULL) 1289 incremental_inputs->report_archive_end(this->lib_); 1290 } 1291 1292 Add_lib_group_symbols::~Add_lib_group_symbols() 1293 { 1294 if (this->this_blocker_ != NULL) 1295 delete this->this_blocker_; 1296 // next_blocker_ is deleted by the task associated with the next 1297 // input file. 1298 } 1299 1300 } // End namespace gold. 1301