1 // symtab.cc -- the gold symbol table 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 <cstring> 26 #include <stdint.h> 27 #include <algorithm> 28 #include <set> 29 #include <string> 30 #include <utility> 31 #include "demangle.h" 32 33 #include "gc.h" 34 #include "object.h" 35 #include "dwarf_reader.h" 36 #include "dynobj.h" 37 #include "output.h" 38 #include "target.h" 39 #include "workqueue.h" 40 #include "symtab.h" 41 #include "script.h" 42 #include "plugin.h" 43 #include "incremental.h" 44 45 namespace gold 46 { 47 48 // Class Symbol. 49 50 // Initialize fields in Symbol. This initializes everything except u_ 51 // and source_. 52 53 void 54 Symbol::init_fields(const char* name, const char* version, 55 elfcpp::STT type, elfcpp::STB binding, 56 elfcpp::STV visibility, unsigned char nonvis) 57 { 58 this->name_ = name; 59 this->version_ = version; 60 this->symtab_index_ = 0; 61 this->dynsym_index_ = 0; 62 this->got_offsets_.init(); 63 this->plt_offset_ = -1U; 64 this->type_ = type; 65 this->binding_ = binding; 66 this->visibility_ = visibility; 67 this->nonvis_ = nonvis; 68 this->is_def_ = false; 69 this->is_forwarder_ = false; 70 this->has_alias_ = false; 71 this->needs_dynsym_entry_ = false; 72 this->in_reg_ = false; 73 this->in_dyn_ = false; 74 this->has_warning_ = false; 75 this->is_copied_from_dynobj_ = false; 76 this->is_forced_local_ = false; 77 this->is_ordinary_shndx_ = false; 78 this->in_real_elf_ = false; 79 this->is_defined_in_discarded_section_ = false; 80 this->undef_binding_set_ = false; 81 this->undef_binding_weak_ = false; 82 this->is_predefined_ = false; 83 } 84 85 // Return the demangled version of the symbol's name, but only 86 // if the --demangle flag was set. 87 88 static std::string 89 demangle(const char* name) 90 { 91 if (!parameters->options().do_demangle()) 92 return name; 93 94 // cplus_demangle allocates memory for the result it returns, 95 // and returns NULL if the name is already demangled. 96 char* demangled_name = cplus_demangle(name, DMGL_ANSI | DMGL_PARAMS); 97 if (demangled_name == NULL) 98 return name; 99 100 std::string retval(demangled_name); 101 free(demangled_name); 102 return retval; 103 } 104 105 std::string 106 Symbol::demangled_name() const 107 { 108 return demangle(this->name()); 109 } 110 111 // Initialize the fields in the base class Symbol for SYM in OBJECT. 112 113 template<int size, bool big_endian> 114 void 115 Symbol::init_base_object(const char* name, const char* version, Object* object, 116 const elfcpp::Sym<size, big_endian>& sym, 117 unsigned int st_shndx, bool is_ordinary) 118 { 119 this->init_fields(name, version, sym.get_st_type(), sym.get_st_bind(), 120 sym.get_st_visibility(), sym.get_st_nonvis()); 121 this->u_.from_object.object = object; 122 this->u_.from_object.shndx = st_shndx; 123 this->is_ordinary_shndx_ = is_ordinary; 124 this->source_ = FROM_OBJECT; 125 this->in_reg_ = !object->is_dynamic(); 126 this->in_dyn_ = object->is_dynamic(); 127 this->in_real_elf_ = object->pluginobj() == NULL; 128 } 129 130 // Initialize the fields in the base class Symbol for a symbol defined 131 // in an Output_data. 132 133 void 134 Symbol::init_base_output_data(const char* name, const char* version, 135 Output_data* od, elfcpp::STT type, 136 elfcpp::STB binding, elfcpp::STV visibility, 137 unsigned char nonvis, bool offset_is_from_end, 138 bool is_predefined) 139 { 140 this->init_fields(name, version, type, binding, visibility, nonvis); 141 this->u_.in_output_data.output_data = od; 142 this->u_.in_output_data.offset_is_from_end = offset_is_from_end; 143 this->source_ = IN_OUTPUT_DATA; 144 this->in_reg_ = true; 145 this->in_real_elf_ = true; 146 this->is_predefined_ = is_predefined; 147 } 148 149 // Initialize the fields in the base class Symbol for a symbol defined 150 // in an Output_segment. 151 152 void 153 Symbol::init_base_output_segment(const char* name, const char* version, 154 Output_segment* os, elfcpp::STT type, 155 elfcpp::STB binding, elfcpp::STV visibility, 156 unsigned char nonvis, 157 Segment_offset_base offset_base, 158 bool is_predefined) 159 { 160 this->init_fields(name, version, type, binding, visibility, nonvis); 161 this->u_.in_output_segment.output_segment = os; 162 this->u_.in_output_segment.offset_base = offset_base; 163 this->source_ = IN_OUTPUT_SEGMENT; 164 this->in_reg_ = true; 165 this->in_real_elf_ = true; 166 this->is_predefined_ = is_predefined; 167 } 168 169 // Initialize the fields in the base class Symbol for a symbol defined 170 // as a constant. 171 172 void 173 Symbol::init_base_constant(const char* name, const char* version, 174 elfcpp::STT type, elfcpp::STB binding, 175 elfcpp::STV visibility, unsigned char nonvis, 176 bool is_predefined) 177 { 178 this->init_fields(name, version, type, binding, visibility, nonvis); 179 this->source_ = IS_CONSTANT; 180 this->in_reg_ = true; 181 this->in_real_elf_ = true; 182 this->is_predefined_ = is_predefined; 183 } 184 185 // Initialize the fields in the base class Symbol for an undefined 186 // symbol. 187 188 void 189 Symbol::init_base_undefined(const char* name, const char* version, 190 elfcpp::STT type, elfcpp::STB binding, 191 elfcpp::STV visibility, unsigned char nonvis) 192 { 193 this->init_fields(name, version, type, binding, visibility, nonvis); 194 this->dynsym_index_ = -1U; 195 this->source_ = IS_UNDEFINED; 196 this->in_reg_ = true; 197 this->in_real_elf_ = true; 198 } 199 200 // Allocate a common symbol in the base. 201 202 void 203 Symbol::allocate_base_common(Output_data* od) 204 { 205 gold_assert(this->is_common()); 206 this->source_ = IN_OUTPUT_DATA; 207 this->u_.in_output_data.output_data = od; 208 this->u_.in_output_data.offset_is_from_end = false; 209 } 210 211 // Initialize the fields in Sized_symbol for SYM in OBJECT. 212 213 template<int size> 214 template<bool big_endian> 215 void 216 Sized_symbol<size>::init_object(const char* name, const char* version, 217 Object* object, 218 const elfcpp::Sym<size, big_endian>& sym, 219 unsigned int st_shndx, bool is_ordinary) 220 { 221 this->init_base_object(name, version, object, sym, st_shndx, is_ordinary); 222 this->value_ = sym.get_st_value(); 223 this->symsize_ = sym.get_st_size(); 224 } 225 226 // Initialize the fields in Sized_symbol for a symbol defined in an 227 // Output_data. 228 229 template<int size> 230 void 231 Sized_symbol<size>::init_output_data(const char* name, const char* version, 232 Output_data* od, Value_type value, 233 Size_type symsize, elfcpp::STT type, 234 elfcpp::STB binding, 235 elfcpp::STV visibility, 236 unsigned char nonvis, 237 bool offset_is_from_end, 238 bool is_predefined) 239 { 240 this->init_base_output_data(name, version, od, type, binding, visibility, 241 nonvis, offset_is_from_end, is_predefined); 242 this->value_ = value; 243 this->symsize_ = symsize; 244 } 245 246 // Initialize the fields in Sized_symbol for a symbol defined in an 247 // Output_segment. 248 249 template<int size> 250 void 251 Sized_symbol<size>::init_output_segment(const char* name, const char* version, 252 Output_segment* os, Value_type value, 253 Size_type symsize, elfcpp::STT type, 254 elfcpp::STB binding, 255 elfcpp::STV visibility, 256 unsigned char nonvis, 257 Segment_offset_base offset_base, 258 bool is_predefined) 259 { 260 this->init_base_output_segment(name, version, os, type, binding, visibility, 261 nonvis, offset_base, is_predefined); 262 this->value_ = value; 263 this->symsize_ = symsize; 264 } 265 266 // Initialize the fields in Sized_symbol for a symbol defined as a 267 // constant. 268 269 template<int size> 270 void 271 Sized_symbol<size>::init_constant(const char* name, const char* version, 272 Value_type value, Size_type symsize, 273 elfcpp::STT type, elfcpp::STB binding, 274 elfcpp::STV visibility, unsigned char nonvis, 275 bool is_predefined) 276 { 277 this->init_base_constant(name, version, type, binding, visibility, nonvis, 278 is_predefined); 279 this->value_ = value; 280 this->symsize_ = symsize; 281 } 282 283 // Initialize the fields in Sized_symbol for an undefined symbol. 284 285 template<int size> 286 void 287 Sized_symbol<size>::init_undefined(const char* name, const char* version, 288 elfcpp::STT type, elfcpp::STB binding, 289 elfcpp::STV visibility, unsigned char nonvis) 290 { 291 this->init_base_undefined(name, version, type, binding, visibility, nonvis); 292 this->value_ = 0; 293 this->symsize_ = 0; 294 } 295 296 // Return an allocated string holding the symbol's name as 297 // name@version. This is used for relocatable links. 298 299 std::string 300 Symbol::versioned_name() const 301 { 302 gold_assert(this->version_ != NULL); 303 std::string ret = this->name_; 304 ret.push_back('@'); 305 if (this->is_def_) 306 ret.push_back('@'); 307 ret += this->version_; 308 return ret; 309 } 310 311 // Return true if SHNDX represents a common symbol. 312 313 bool 314 Symbol::is_common_shndx(unsigned int shndx) 315 { 316 return (shndx == elfcpp::SHN_COMMON 317 || shndx == parameters->target().small_common_shndx() 318 || shndx == parameters->target().large_common_shndx()); 319 } 320 321 // Allocate a common symbol. 322 323 template<int size> 324 void 325 Sized_symbol<size>::allocate_common(Output_data* od, Value_type value) 326 { 327 this->allocate_base_common(od); 328 this->value_ = value; 329 } 330 331 // The ""'s around str ensure str is a string literal, so sizeof works. 332 #define strprefix(var, str) (strncmp(var, str, sizeof("" str "") - 1) == 0) 333 334 // Return true if this symbol should be added to the dynamic symbol 335 // table. 336 337 inline bool 338 Symbol::should_add_dynsym_entry(Symbol_table* symtab) const 339 { 340 // If the symbol is only present on plugin files, the plugin decided we 341 // don't need it. 342 if (!this->in_real_elf()) 343 return false; 344 345 // If the symbol is used by a dynamic relocation, we need to add it. 346 if (this->needs_dynsym_entry()) 347 return true; 348 349 // If this symbol's section is not added, the symbol need not be added. 350 // The section may have been GCed. Note that export_dynamic is being 351 // overridden here. This should not be done for shared objects. 352 if (parameters->options().gc_sections() 353 && !parameters->options().shared() 354 && this->source() == Symbol::FROM_OBJECT 355 && !this->object()->is_dynamic()) 356 { 357 Relobj* relobj = static_cast<Relobj*>(this->object()); 358 bool is_ordinary; 359 unsigned int shndx = this->shndx(&is_ordinary); 360 if (is_ordinary && shndx != elfcpp::SHN_UNDEF 361 && !relobj->is_section_included(shndx) 362 && !symtab->is_section_folded(relobj, shndx)) 363 return false; 364 } 365 366 // If the symbol was forced dynamic in a --dynamic-list file 367 // or an --export-dynamic-symbol option, add it. 368 if (!this->is_from_dynobj() 369 && (parameters->options().in_dynamic_list(this->name()) 370 || parameters->options().is_export_dynamic_symbol(this->name()))) 371 { 372 if (!this->is_forced_local()) 373 return true; 374 gold_warning(_("Cannot export local symbol '%s'"), 375 this->demangled_name().c_str()); 376 return false; 377 } 378 379 // If the symbol was forced local in a version script, do not add it. 380 if (this->is_forced_local()) 381 return false; 382 383 // If dynamic-list-data was specified, add any STT_OBJECT. 384 if (parameters->options().dynamic_list_data() 385 && !this->is_from_dynobj() 386 && this->type() == elfcpp::STT_OBJECT) 387 return true; 388 389 // If --dynamic-list-cpp-new was specified, add any new/delete symbol. 390 // If --dynamic-list-cpp-typeinfo was specified, add any typeinfo symbols. 391 if ((parameters->options().dynamic_list_cpp_new() 392 || parameters->options().dynamic_list_cpp_typeinfo()) 393 && !this->is_from_dynobj()) 394 { 395 // TODO(csilvers): We could probably figure out if we're an operator 396 // new/delete or typeinfo without the need to demangle. 397 char* demangled_name = cplus_demangle(this->name(), 398 DMGL_ANSI | DMGL_PARAMS); 399 if (demangled_name == NULL) 400 { 401 // Not a C++ symbol, so it can't satisfy these flags 402 } 403 else if (parameters->options().dynamic_list_cpp_new() 404 && (strprefix(demangled_name, "operator new") 405 || strprefix(demangled_name, "operator delete"))) 406 { 407 free(demangled_name); 408 return true; 409 } 410 else if (parameters->options().dynamic_list_cpp_typeinfo() 411 && (strprefix(demangled_name, "typeinfo name for") 412 || strprefix(demangled_name, "typeinfo for"))) 413 { 414 free(demangled_name); 415 return true; 416 } 417 else 418 free(demangled_name); 419 } 420 421 // If exporting all symbols or building a shared library, 422 // and the symbol is defined in a regular object and is 423 // externally visible, we need to add it. 424 if ((parameters->options().export_dynamic() || parameters->options().shared()) 425 && !this->is_from_dynobj() 426 && !this->is_undefined() 427 && this->is_externally_visible()) 428 return true; 429 430 return false; 431 } 432 433 // Return true if the final value of this symbol is known at link 434 // time. 435 436 bool 437 Symbol::final_value_is_known() const 438 { 439 // If we are not generating an executable, then no final values are 440 // known, since they will change at runtime. 441 if (parameters->options().output_is_position_independent() 442 || parameters->options().relocatable()) 443 return false; 444 445 // If the symbol is not from an object file, and is not undefined, 446 // then it is defined, and known. 447 if (this->source_ != FROM_OBJECT) 448 { 449 if (this->source_ != IS_UNDEFINED) 450 return true; 451 } 452 else 453 { 454 // If the symbol is from a dynamic object, then the final value 455 // is not known. 456 if (this->object()->is_dynamic()) 457 return false; 458 459 // If the symbol is not undefined (it is defined or common), 460 // then the final value is known. 461 if (!this->is_undefined()) 462 return true; 463 } 464 465 // If the symbol is undefined, then whether the final value is known 466 // depends on whether we are doing a static link. If we are doing a 467 // dynamic link, then the final value could be filled in at runtime. 468 // This could reasonably be the case for a weak undefined symbol. 469 return parameters->doing_static_link(); 470 } 471 472 // Return the output section where this symbol is defined. 473 474 Output_section* 475 Symbol::output_section() const 476 { 477 switch (this->source_) 478 { 479 case FROM_OBJECT: 480 { 481 unsigned int shndx = this->u_.from_object.shndx; 482 if (shndx != elfcpp::SHN_UNDEF && this->is_ordinary_shndx_) 483 { 484 gold_assert(!this->u_.from_object.object->is_dynamic()); 485 gold_assert(this->u_.from_object.object->pluginobj() == NULL); 486 Relobj* relobj = static_cast<Relobj*>(this->u_.from_object.object); 487 return relobj->output_section(shndx); 488 } 489 return NULL; 490 } 491 492 case IN_OUTPUT_DATA: 493 return this->u_.in_output_data.output_data->output_section(); 494 495 case IN_OUTPUT_SEGMENT: 496 case IS_CONSTANT: 497 case IS_UNDEFINED: 498 return NULL; 499 500 default: 501 gold_unreachable(); 502 } 503 } 504 505 // Set the symbol's output section. This is used for symbols defined 506 // in scripts. This should only be called after the symbol table has 507 // been finalized. 508 509 void 510 Symbol::set_output_section(Output_section* os) 511 { 512 switch (this->source_) 513 { 514 case FROM_OBJECT: 515 case IN_OUTPUT_DATA: 516 gold_assert(this->output_section() == os); 517 break; 518 case IS_CONSTANT: 519 this->source_ = IN_OUTPUT_DATA; 520 this->u_.in_output_data.output_data = os; 521 this->u_.in_output_data.offset_is_from_end = false; 522 break; 523 case IN_OUTPUT_SEGMENT: 524 case IS_UNDEFINED: 525 default: 526 gold_unreachable(); 527 } 528 } 529 530 // Class Symbol_table. 531 532 Symbol_table::Symbol_table(unsigned int count, 533 const Version_script_info& version_script) 534 : saw_undefined_(0), offset_(0), table_(count), namepool_(), 535 forwarders_(), commons_(), tls_commons_(), small_commons_(), 536 large_commons_(), forced_locals_(), warnings_(), 537 version_script_(version_script), gc_(NULL), icf_(NULL) 538 { 539 namepool_.reserve(count); 540 } 541 542 Symbol_table::~Symbol_table() 543 { 544 } 545 546 // The symbol table key equality function. This is called with 547 // Stringpool keys. 548 549 inline bool 550 Symbol_table::Symbol_table_eq::operator()(const Symbol_table_key& k1, 551 const Symbol_table_key& k2) const 552 { 553 return k1.first == k2.first && k1.second == k2.second; 554 } 555 556 bool 557 Symbol_table::is_section_folded(Object* obj, unsigned int shndx) const 558 { 559 return (parameters->options().icf_enabled() 560 && this->icf_->is_section_folded(obj, shndx)); 561 } 562 563 // For symbols that have been listed with a -u or --export-dynamic-symbol 564 // option, add them to the work list to avoid gc'ing them. 565 566 void 567 Symbol_table::gc_mark_undef_symbols(Layout* layout) 568 { 569 for (options::String_set::const_iterator p = 570 parameters->options().undefined_begin(); 571 p != parameters->options().undefined_end(); 572 ++p) 573 { 574 const char* name = p->c_str(); 575 Symbol* sym = this->lookup(name); 576 gold_assert(sym != NULL); 577 if (sym->source() == Symbol::FROM_OBJECT 578 && !sym->object()->is_dynamic()) 579 { 580 Relobj* obj = static_cast<Relobj*>(sym->object()); 581 bool is_ordinary; 582 unsigned int shndx = sym->shndx(&is_ordinary); 583 if (is_ordinary) 584 { 585 gold_assert(this->gc_ != NULL); 586 this->gc_->worklist().push(Section_id(obj, shndx)); 587 } 588 } 589 } 590 591 for (options::String_set::const_iterator p = 592 parameters->options().export_dynamic_symbol_begin(); 593 p != parameters->options().export_dynamic_symbol_end(); 594 ++p) 595 { 596 const char* name = p->c_str(); 597 Symbol* sym = this->lookup(name); 598 gold_assert(sym != NULL); 599 if (sym->source() == Symbol::FROM_OBJECT 600 && !sym->object()->is_dynamic()) 601 { 602 Relobj* obj = static_cast<Relobj*>(sym->object()); 603 bool is_ordinary; 604 unsigned int shndx = sym->shndx(&is_ordinary); 605 if (is_ordinary) 606 { 607 gold_assert(this->gc_ != NULL); 608 this->gc_->worklist().push(Section_id(obj, shndx)); 609 } 610 } 611 } 612 613 for (Script_options::referenced_const_iterator p = 614 layout->script_options()->referenced_begin(); 615 p != layout->script_options()->referenced_end(); 616 ++p) 617 { 618 Symbol* sym = this->lookup(p->c_str()); 619 gold_assert(sym != NULL); 620 if (sym->source() == Symbol::FROM_OBJECT 621 && !sym->object()->is_dynamic()) 622 { 623 Relobj* obj = static_cast<Relobj*>(sym->object()); 624 bool is_ordinary; 625 unsigned int shndx = sym->shndx(&is_ordinary); 626 if (is_ordinary) 627 { 628 gold_assert(this->gc_ != NULL); 629 this->gc_->worklist().push(Section_id(obj, shndx)); 630 } 631 } 632 } 633 } 634 635 void 636 Symbol_table::gc_mark_symbol(Symbol* sym) 637 { 638 // Add the object and section to the work list. 639 Relobj* obj = static_cast<Relobj*>(sym->object()); 640 bool is_ordinary; 641 unsigned int shndx = sym->shndx(&is_ordinary); 642 if (is_ordinary && shndx != elfcpp::SHN_UNDEF) 643 { 644 gold_assert(this->gc_!= NULL); 645 this->gc_->worklist().push(Section_id(obj, shndx)); 646 } 647 } 648 649 // When doing garbage collection, keep symbols that have been seen in 650 // dynamic objects. 651 inline void 652 Symbol_table::gc_mark_dyn_syms(Symbol* sym) 653 { 654 if (sym->in_dyn() && sym->source() == Symbol::FROM_OBJECT 655 && !sym->object()->is_dynamic()) 656 this->gc_mark_symbol(sym); 657 } 658 659 // Make TO a symbol which forwards to FROM. 660 661 void 662 Symbol_table::make_forwarder(Symbol* from, Symbol* to) 663 { 664 gold_assert(from != to); 665 gold_assert(!from->is_forwarder() && !to->is_forwarder()); 666 this->forwarders_[from] = to; 667 from->set_forwarder(); 668 } 669 670 // Resolve the forwards from FROM, returning the real symbol. 671 672 Symbol* 673 Symbol_table::resolve_forwards(const Symbol* from) const 674 { 675 gold_assert(from->is_forwarder()); 676 Unordered_map<const Symbol*, Symbol*>::const_iterator p = 677 this->forwarders_.find(from); 678 gold_assert(p != this->forwarders_.end()); 679 return p->second; 680 } 681 682 // Look up a symbol by name. 683 684 Symbol* 685 Symbol_table::lookup(const char* name, const char* version) const 686 { 687 Stringpool::Key name_key; 688 name = this->namepool_.find(name, &name_key); 689 if (name == NULL) 690 return NULL; 691 692 Stringpool::Key version_key = 0; 693 if (version != NULL) 694 { 695 version = this->namepool_.find(version, &version_key); 696 if (version == NULL) 697 return NULL; 698 } 699 700 Symbol_table_key key(name_key, version_key); 701 Symbol_table::Symbol_table_type::const_iterator p = this->table_.find(key); 702 if (p == this->table_.end()) 703 return NULL; 704 return p->second; 705 } 706 707 // Resolve a Symbol with another Symbol. This is only used in the 708 // unusual case where there are references to both an unversioned 709 // symbol and a symbol with a version, and we then discover that that 710 // version is the default version. Because this is unusual, we do 711 // this the slow way, by converting back to an ELF symbol. 712 713 template<int size, bool big_endian> 714 void 715 Symbol_table::resolve(Sized_symbol<size>* to, const Sized_symbol<size>* from) 716 { 717 unsigned char buf[elfcpp::Elf_sizes<size>::sym_size]; 718 elfcpp::Sym_write<size, big_endian> esym(buf); 719 // We don't bother to set the st_name or the st_shndx field. 720 esym.put_st_value(from->value()); 721 esym.put_st_size(from->symsize()); 722 esym.put_st_info(from->binding(), from->type()); 723 esym.put_st_other(from->visibility(), from->nonvis()); 724 bool is_ordinary; 725 unsigned int shndx = from->shndx(&is_ordinary); 726 this->resolve(to, esym.sym(), shndx, is_ordinary, shndx, from->object(), 727 from->version()); 728 if (from->in_reg()) 729 to->set_in_reg(); 730 if (from->in_dyn()) 731 to->set_in_dyn(); 732 if (parameters->options().gc_sections()) 733 this->gc_mark_dyn_syms(to); 734 } 735 736 // Record that a symbol is forced to be local by a version script or 737 // by visibility. 738 739 void 740 Symbol_table::force_local(Symbol* sym) 741 { 742 if (!sym->is_defined() && !sym->is_common()) 743 return; 744 if (sym->is_forced_local()) 745 { 746 // We already got this one. 747 return; 748 } 749 sym->set_is_forced_local(); 750 this->forced_locals_.push_back(sym); 751 } 752 753 // Adjust NAME for wrapping, and update *NAME_KEY if necessary. This 754 // is only called for undefined symbols, when at least one --wrap 755 // option was used. 756 757 const char* 758 Symbol_table::wrap_symbol(const char* name, Stringpool::Key* name_key) 759 { 760 // For some targets, we need to ignore a specific character when 761 // wrapping, and add it back later. 762 char prefix = '\0'; 763 if (name[0] == parameters->target().wrap_char()) 764 { 765 prefix = name[0]; 766 ++name; 767 } 768 769 if (parameters->options().is_wrap(name)) 770 { 771 // Turn NAME into __wrap_NAME. 772 std::string s; 773 if (prefix != '\0') 774 s += prefix; 775 s += "__wrap_"; 776 s += name; 777 778 // This will give us both the old and new name in NAMEPOOL_, but 779 // that is OK. Only the versions we need will wind up in the 780 // real string table in the output file. 781 return this->namepool_.add(s.c_str(), true, name_key); 782 } 783 784 const char* const real_prefix = "__real_"; 785 const size_t real_prefix_length = strlen(real_prefix); 786 if (strncmp(name, real_prefix, real_prefix_length) == 0 787 && parameters->options().is_wrap(name + real_prefix_length)) 788 { 789 // Turn __real_NAME into NAME. 790 std::string s; 791 if (prefix != '\0') 792 s += prefix; 793 s += name + real_prefix_length; 794 return this->namepool_.add(s.c_str(), true, name_key); 795 } 796 797 return name; 798 } 799 800 // This is called when we see a symbol NAME/VERSION, and the symbol 801 // already exists in the symbol table, and VERSION is marked as being 802 // the default version. SYM is the NAME/VERSION symbol we just added. 803 // DEFAULT_IS_NEW is true if this is the first time we have seen the 804 // symbol NAME/NULL. PDEF points to the entry for NAME/NULL. 805 806 template<int size, bool big_endian> 807 void 808 Symbol_table::define_default_version(Sized_symbol<size>* sym, 809 bool default_is_new, 810 Symbol_table_type::iterator pdef) 811 { 812 if (default_is_new) 813 { 814 // This is the first time we have seen NAME/NULL. Make 815 // NAME/NULL point to NAME/VERSION, and mark SYM as the default 816 // version. 817 pdef->second = sym; 818 sym->set_is_default(); 819 } 820 else if (pdef->second == sym) 821 { 822 // NAME/NULL already points to NAME/VERSION. Don't mark the 823 // symbol as the default if it is not already the default. 824 } 825 else 826 { 827 // This is the unfortunate case where we already have entries 828 // for both NAME/VERSION and NAME/NULL. We now see a symbol 829 // NAME/VERSION where VERSION is the default version. We have 830 // already resolved this new symbol with the existing 831 // NAME/VERSION symbol. 832 833 // It's possible that NAME/NULL and NAME/VERSION are both 834 // defined in regular objects. This can only happen if one 835 // object file defines foo and another defines foo@@ver. This 836 // is somewhat obscure, but we call it a multiple definition 837 // error. 838 839 // It's possible that NAME/NULL actually has a version, in which 840 // case it won't be the same as VERSION. This happens with 841 // ver_test_7.so in the testsuite for the symbol t2_2. We see 842 // t2_2@@VER2, so we define both t2_2/VER2 and t2_2/NULL. We 843 // then see an unadorned t2_2 in an object file and give it 844 // version VER1 from the version script. This looks like a 845 // default definition for VER1, so it looks like we should merge 846 // t2_2/NULL with t2_2/VER1. That doesn't make sense, but it's 847 // not obvious that this is an error, either. So we just punt. 848 849 // If one of the symbols has non-default visibility, and the 850 // other is defined in a shared object, then they are different 851 // symbols. 852 853 // Otherwise, we just resolve the symbols as though they were 854 // the same. 855 856 if (pdef->second->version() != NULL) 857 gold_assert(pdef->second->version() != sym->version()); 858 else if (sym->visibility() != elfcpp::STV_DEFAULT 859 && pdef->second->is_from_dynobj()) 860 ; 861 else if (pdef->second->visibility() != elfcpp::STV_DEFAULT 862 && sym->is_from_dynobj()) 863 ; 864 else 865 { 866 const Sized_symbol<size>* symdef; 867 symdef = this->get_sized_symbol<size>(pdef->second); 868 Symbol_table::resolve<size, big_endian>(sym, symdef); 869 this->make_forwarder(pdef->second, sym); 870 pdef->second = sym; 871 sym->set_is_default(); 872 } 873 } 874 } 875 876 // Add one symbol from OBJECT to the symbol table. NAME is symbol 877 // name and VERSION is the version; both are canonicalized. DEF is 878 // whether this is the default version. ST_SHNDX is the symbol's 879 // section index; IS_ORDINARY is whether this is a normal section 880 // rather than a special code. 881 882 // If IS_DEFAULT_VERSION is true, then this is the definition of a 883 // default version of a symbol. That means that any lookup of 884 // NAME/NULL and any lookup of NAME/VERSION should always return the 885 // same symbol. This is obvious for references, but in particular we 886 // want to do this for definitions: overriding NAME/NULL should also 887 // override NAME/VERSION. If we don't do that, it would be very hard 888 // to override functions in a shared library which uses versioning. 889 890 // We implement this by simply making both entries in the hash table 891 // point to the same Symbol structure. That is easy enough if this is 892 // the first time we see NAME/NULL or NAME/VERSION, but it is possible 893 // that we have seen both already, in which case they will both have 894 // independent entries in the symbol table. We can't simply change 895 // the symbol table entry, because we have pointers to the entries 896 // attached to the object files. So we mark the entry attached to the 897 // object file as a forwarder, and record it in the forwarders_ map. 898 // Note that entries in the hash table will never be marked as 899 // forwarders. 900 // 901 // ORIG_ST_SHNDX and ST_SHNDX are almost always the same. 902 // ORIG_ST_SHNDX is the section index in the input file, or SHN_UNDEF 903 // for a special section code. ST_SHNDX may be modified if the symbol 904 // is defined in a section being discarded. 905 906 template<int size, bool big_endian> 907 Sized_symbol<size>* 908 Symbol_table::add_from_object(Object* object, 909 const char* name, 910 Stringpool::Key name_key, 911 const char* version, 912 Stringpool::Key version_key, 913 bool is_default_version, 914 const elfcpp::Sym<size, big_endian>& sym, 915 unsigned int st_shndx, 916 bool is_ordinary, 917 unsigned int orig_st_shndx) 918 { 919 // Print a message if this symbol is being traced. 920 if (parameters->options().is_trace_symbol(name)) 921 { 922 if (orig_st_shndx == elfcpp::SHN_UNDEF) 923 gold_info(_("%s: reference to %s"), object->name().c_str(), name); 924 else 925 gold_info(_("%s: definition of %s"), object->name().c_str(), name); 926 } 927 928 // For an undefined symbol, we may need to adjust the name using 929 // --wrap. 930 if (orig_st_shndx == elfcpp::SHN_UNDEF 931 && parameters->options().any_wrap()) 932 { 933 const char* wrap_name = this->wrap_symbol(name, &name_key); 934 if (wrap_name != name) 935 { 936 // If we see a reference to malloc with version GLIBC_2.0, 937 // and we turn it into a reference to __wrap_malloc, then we 938 // discard the version number. Otherwise the user would be 939 // required to specify the correct version for 940 // __wrap_malloc. 941 version = NULL; 942 version_key = 0; 943 name = wrap_name; 944 } 945 } 946 947 Symbol* const snull = NULL; 948 std::pair<typename Symbol_table_type::iterator, bool> ins = 949 this->table_.insert(std::make_pair(std::make_pair(name_key, version_key), 950 snull)); 951 952 std::pair<typename Symbol_table_type::iterator, bool> insdefault = 953 std::make_pair(this->table_.end(), false); 954 if (is_default_version) 955 { 956 const Stringpool::Key vnull_key = 0; 957 insdefault = this->table_.insert(std::make_pair(std::make_pair(name_key, 958 vnull_key), 959 snull)); 960 } 961 962 // ins.first: an iterator, which is a pointer to a pair. 963 // ins.first->first: the key (a pair of name and version). 964 // ins.first->second: the value (Symbol*). 965 // ins.second: true if new entry was inserted, false if not. 966 967 Sized_symbol<size>* ret; 968 bool was_undefined; 969 bool was_common; 970 if (!ins.second) 971 { 972 // We already have an entry for NAME/VERSION. 973 ret = this->get_sized_symbol<size>(ins.first->second); 974 gold_assert(ret != NULL); 975 976 was_undefined = ret->is_undefined(); 977 was_common = ret->is_common(); 978 979 this->resolve(ret, sym, st_shndx, is_ordinary, orig_st_shndx, object, 980 version); 981 if (parameters->options().gc_sections()) 982 this->gc_mark_dyn_syms(ret); 983 984 if (is_default_version) 985 this->define_default_version<size, big_endian>(ret, insdefault.second, 986 insdefault.first); 987 } 988 else 989 { 990 // This is the first time we have seen NAME/VERSION. 991 gold_assert(ins.first->second == NULL); 992 993 if (is_default_version && !insdefault.second) 994 { 995 // We already have an entry for NAME/NULL. If we override 996 // it, then change it to NAME/VERSION. 997 ret = this->get_sized_symbol<size>(insdefault.first->second); 998 999 was_undefined = ret->is_undefined(); 1000 was_common = ret->is_common(); 1001 1002 this->resolve(ret, sym, st_shndx, is_ordinary, orig_st_shndx, object, 1003 version); 1004 if (parameters->options().gc_sections()) 1005 this->gc_mark_dyn_syms(ret); 1006 ins.first->second = ret; 1007 } 1008 else 1009 { 1010 was_undefined = false; 1011 was_common = false; 1012 1013 Sized_target<size, big_endian>* target = 1014 parameters->sized_target<size, big_endian>(); 1015 if (!target->has_make_symbol()) 1016 ret = new Sized_symbol<size>(); 1017 else 1018 { 1019 ret = target->make_symbol(); 1020 if (ret == NULL) 1021 { 1022 // This means that we don't want a symbol table 1023 // entry after all. 1024 if (!is_default_version) 1025 this->table_.erase(ins.first); 1026 else 1027 { 1028 this->table_.erase(insdefault.first); 1029 // Inserting INSDEFAULT invalidated INS. 1030 this->table_.erase(std::make_pair(name_key, 1031 version_key)); 1032 } 1033 return NULL; 1034 } 1035 } 1036 1037 ret->init_object(name, version, object, sym, st_shndx, is_ordinary); 1038 1039 ins.first->second = ret; 1040 if (is_default_version) 1041 { 1042 // This is the first time we have seen NAME/NULL. Point 1043 // it at the new entry for NAME/VERSION. 1044 gold_assert(insdefault.second); 1045 insdefault.first->second = ret; 1046 } 1047 } 1048 1049 if (is_default_version) 1050 ret->set_is_default(); 1051 } 1052 1053 // Record every time we see a new undefined symbol, to speed up 1054 // archive groups. 1055 if (!was_undefined && ret->is_undefined()) 1056 { 1057 ++this->saw_undefined_; 1058 if (parameters->options().has_plugins()) 1059 parameters->options().plugins()->new_undefined_symbol(ret); 1060 } 1061 1062 // Keep track of common symbols, to speed up common symbol 1063 // allocation. 1064 if (!was_common && ret->is_common()) 1065 { 1066 if (ret->type() == elfcpp::STT_TLS) 1067 this->tls_commons_.push_back(ret); 1068 else if (!is_ordinary 1069 && st_shndx == parameters->target().small_common_shndx()) 1070 this->small_commons_.push_back(ret); 1071 else if (!is_ordinary 1072 && st_shndx == parameters->target().large_common_shndx()) 1073 this->large_commons_.push_back(ret); 1074 else 1075 this->commons_.push_back(ret); 1076 } 1077 1078 // If we're not doing a relocatable link, then any symbol with 1079 // hidden or internal visibility is local. 1080 if ((ret->visibility() == elfcpp::STV_HIDDEN 1081 || ret->visibility() == elfcpp::STV_INTERNAL) 1082 && (ret->binding() == elfcpp::STB_GLOBAL 1083 || ret->binding() == elfcpp::STB_GNU_UNIQUE 1084 || ret->binding() == elfcpp::STB_WEAK) 1085 && !parameters->options().relocatable()) 1086 this->force_local(ret); 1087 1088 return ret; 1089 } 1090 1091 // Add all the symbols in a relocatable object to the hash table. 1092 1093 template<int size, bool big_endian> 1094 void 1095 Symbol_table::add_from_relobj( 1096 Sized_relobj_file<size, big_endian>* relobj, 1097 const unsigned char* syms, 1098 size_t count, 1099 size_t symndx_offset, 1100 const char* sym_names, 1101 size_t sym_name_size, 1102 typename Sized_relobj_file<size, big_endian>::Symbols* sympointers, 1103 size_t* defined) 1104 { 1105 *defined = 0; 1106 1107 gold_assert(size == parameters->target().get_size()); 1108 1109 const int sym_size = elfcpp::Elf_sizes<size>::sym_size; 1110 1111 const bool just_symbols = relobj->just_symbols(); 1112 1113 const unsigned char* p = syms; 1114 for (size_t i = 0; i < count; ++i, p += sym_size) 1115 { 1116 (*sympointers)[i] = NULL; 1117 1118 elfcpp::Sym<size, big_endian> sym(p); 1119 1120 unsigned int st_name = sym.get_st_name(); 1121 if (st_name >= sym_name_size) 1122 { 1123 relobj->error(_("bad global symbol name offset %u at %zu"), 1124 st_name, i); 1125 continue; 1126 } 1127 1128 const char* name = sym_names + st_name; 1129 1130 bool is_ordinary; 1131 unsigned int st_shndx = relobj->adjust_sym_shndx(i + symndx_offset, 1132 sym.get_st_shndx(), 1133 &is_ordinary); 1134 unsigned int orig_st_shndx = st_shndx; 1135 if (!is_ordinary) 1136 orig_st_shndx = elfcpp::SHN_UNDEF; 1137 1138 if (st_shndx != elfcpp::SHN_UNDEF) 1139 ++*defined; 1140 1141 // A symbol defined in a section which we are not including must 1142 // be treated as an undefined symbol. 1143 bool is_defined_in_discarded_section = false; 1144 if (st_shndx != elfcpp::SHN_UNDEF 1145 && is_ordinary 1146 && !relobj->is_section_included(st_shndx) 1147 && !this->is_section_folded(relobj, st_shndx)) 1148 { 1149 st_shndx = elfcpp::SHN_UNDEF; 1150 is_defined_in_discarded_section = true; 1151 } 1152 1153 // In an object file, an '@' in the name separates the symbol 1154 // name from the version name. If there are two '@' characters, 1155 // this is the default version. 1156 const char* ver = strchr(name, '@'); 1157 Stringpool::Key ver_key = 0; 1158 int namelen = 0; 1159 // IS_DEFAULT_VERSION: is the version default? 1160 // IS_FORCED_LOCAL: is the symbol forced local? 1161 bool is_default_version = false; 1162 bool is_forced_local = false; 1163 1164 // FIXME: For incremental links, we don't store version information, 1165 // so we need to ignore version symbols for now. 1166 if (parameters->incremental_update() && ver != NULL) 1167 { 1168 namelen = ver - name; 1169 ver = NULL; 1170 } 1171 1172 if (ver != NULL) 1173 { 1174 // The symbol name is of the form foo@VERSION or foo@@VERSION 1175 namelen = ver - name; 1176 ++ver; 1177 if (*ver == '@') 1178 { 1179 is_default_version = true; 1180 ++ver; 1181 } 1182 ver = this->namepool_.add(ver, true, &ver_key); 1183 } 1184 // We don't want to assign a version to an undefined symbol, 1185 // even if it is listed in the version script. FIXME: What 1186 // about a common symbol? 1187 else 1188 { 1189 namelen = strlen(name); 1190 if (!this->version_script_.empty() 1191 && st_shndx != elfcpp::SHN_UNDEF) 1192 { 1193 // The symbol name did not have a version, but the 1194 // version script may assign a version anyway. 1195 std::string version; 1196 bool is_global; 1197 if (this->version_script_.get_symbol_version(name, &version, 1198 &is_global)) 1199 { 1200 if (!is_global) 1201 is_forced_local = true; 1202 else if (!version.empty()) 1203 { 1204 ver = this->namepool_.add_with_length(version.c_str(), 1205 version.length(), 1206 true, 1207 &ver_key); 1208 is_default_version = true; 1209 } 1210 } 1211 } 1212 } 1213 1214 elfcpp::Sym<size, big_endian>* psym = &sym; 1215 unsigned char symbuf[sym_size]; 1216 elfcpp::Sym<size, big_endian> sym2(symbuf); 1217 if (just_symbols) 1218 { 1219 memcpy(symbuf, p, sym_size); 1220 elfcpp::Sym_write<size, big_endian> sw(symbuf); 1221 if (orig_st_shndx != elfcpp::SHN_UNDEF 1222 && is_ordinary 1223 && relobj->e_type() == elfcpp::ET_REL) 1224 { 1225 // Symbol values in relocatable object files are section 1226 // relative. This is normally what we want, but since here 1227 // we are converting the symbol to absolute we need to add 1228 // the section address. The section address in an object 1229 // file is normally zero, but people can use a linker 1230 // script to change it. 1231 sw.put_st_value(sym.get_st_value() 1232 + relobj->section_address(orig_st_shndx)); 1233 } 1234 st_shndx = elfcpp::SHN_ABS; 1235 is_ordinary = false; 1236 psym = &sym2; 1237 } 1238 1239 // Fix up visibility if object has no-export set. 1240 if (relobj->no_export() 1241 && (orig_st_shndx != elfcpp::SHN_UNDEF || !is_ordinary)) 1242 { 1243 // We may have copied symbol already above. 1244 if (psym != &sym2) 1245 { 1246 memcpy(symbuf, p, sym_size); 1247 psym = &sym2; 1248 } 1249 1250 elfcpp::STV visibility = sym2.get_st_visibility(); 1251 if (visibility == elfcpp::STV_DEFAULT 1252 || visibility == elfcpp::STV_PROTECTED) 1253 { 1254 elfcpp::Sym_write<size, big_endian> sw(symbuf); 1255 unsigned char nonvis = sym2.get_st_nonvis(); 1256 sw.put_st_other(elfcpp::STV_HIDDEN, nonvis); 1257 } 1258 } 1259 1260 Stringpool::Key name_key; 1261 name = this->namepool_.add_with_length(name, namelen, true, 1262 &name_key); 1263 1264 Sized_symbol<size>* res; 1265 res = this->add_from_object(relobj, name, name_key, ver, ver_key, 1266 is_default_version, *psym, st_shndx, 1267 is_ordinary, orig_st_shndx); 1268 1269 if (is_forced_local) 1270 this->force_local(res); 1271 1272 // Do not treat this symbol as garbage if this symbol will be 1273 // exported to the dynamic symbol table. This is true when 1274 // building a shared library or using --export-dynamic and 1275 // the symbol is externally visible. 1276 if (parameters->options().gc_sections() 1277 && res->is_externally_visible() 1278 && !res->is_from_dynobj() 1279 && (parameters->options().shared() 1280 || parameters->options().export_dynamic())) 1281 this->gc_mark_symbol(res); 1282 1283 if (is_defined_in_discarded_section) 1284 res->set_is_defined_in_discarded_section(); 1285 1286 (*sympointers)[i] = res; 1287 } 1288 } 1289 1290 // Add a symbol from a plugin-claimed file. 1291 1292 template<int size, bool big_endian> 1293 Symbol* 1294 Symbol_table::add_from_pluginobj( 1295 Sized_pluginobj<size, big_endian>* obj, 1296 const char* name, 1297 const char* ver, 1298 elfcpp::Sym<size, big_endian>* sym) 1299 { 1300 unsigned int st_shndx = sym->get_st_shndx(); 1301 bool is_ordinary = st_shndx < elfcpp::SHN_LORESERVE; 1302 1303 Stringpool::Key ver_key = 0; 1304 bool is_default_version = false; 1305 bool is_forced_local = false; 1306 1307 if (ver != NULL) 1308 { 1309 ver = this->namepool_.add(ver, true, &ver_key); 1310 } 1311 // We don't want to assign a version to an undefined symbol, 1312 // even if it is listed in the version script. FIXME: What 1313 // about a common symbol? 1314 else 1315 { 1316 if (!this->version_script_.empty() 1317 && st_shndx != elfcpp::SHN_UNDEF) 1318 { 1319 // The symbol name did not have a version, but the 1320 // version script may assign a version anyway. 1321 std::string version; 1322 bool is_global; 1323 if (this->version_script_.get_symbol_version(name, &version, 1324 &is_global)) 1325 { 1326 if (!is_global) 1327 is_forced_local = true; 1328 else if (!version.empty()) 1329 { 1330 ver = this->namepool_.add_with_length(version.c_str(), 1331 version.length(), 1332 true, 1333 &ver_key); 1334 is_default_version = true; 1335 } 1336 } 1337 } 1338 } 1339 1340 Stringpool::Key name_key; 1341 name = this->namepool_.add(name, true, &name_key); 1342 1343 Sized_symbol<size>* res; 1344 res = this->add_from_object(obj, name, name_key, ver, ver_key, 1345 is_default_version, *sym, st_shndx, 1346 is_ordinary, st_shndx); 1347 1348 if (is_forced_local) 1349 this->force_local(res); 1350 1351 return res; 1352 } 1353 1354 // Add all the symbols in a dynamic object to the hash table. 1355 1356 template<int size, bool big_endian> 1357 void 1358 Symbol_table::add_from_dynobj( 1359 Sized_dynobj<size, big_endian>* dynobj, 1360 const unsigned char* syms, 1361 size_t count, 1362 const char* sym_names, 1363 size_t sym_name_size, 1364 const unsigned char* versym, 1365 size_t versym_size, 1366 const std::vector<const char*>* version_map, 1367 typename Sized_relobj_file<size, big_endian>::Symbols* sympointers, 1368 size_t* defined) 1369 { 1370 *defined = 0; 1371 1372 gold_assert(size == parameters->target().get_size()); 1373 1374 if (dynobj->just_symbols()) 1375 { 1376 gold_error(_("--just-symbols does not make sense with a shared object")); 1377 return; 1378 } 1379 1380 // FIXME: For incremental links, we don't store version information, 1381 // so we need to ignore version symbols for now. 1382 if (parameters->incremental_update()) 1383 versym = NULL; 1384 1385 if (versym != NULL && versym_size / 2 < count) 1386 { 1387 dynobj->error(_("too few symbol versions")); 1388 return; 1389 } 1390 1391 const int sym_size = elfcpp::Elf_sizes<size>::sym_size; 1392 1393 // We keep a list of all STT_OBJECT symbols, so that we can resolve 1394 // weak aliases. This is necessary because if the dynamic object 1395 // provides the same variable under two names, one of which is a 1396 // weak definition, and the regular object refers to the weak 1397 // definition, we have to put both the weak definition and the 1398 // strong definition into the dynamic symbol table. Given a weak 1399 // definition, the only way that we can find the corresponding 1400 // strong definition, if any, is to search the symbol table. 1401 std::vector<Sized_symbol<size>*> object_symbols; 1402 1403 const unsigned char* p = syms; 1404 const unsigned char* vs = versym; 1405 for (size_t i = 0; i < count; ++i, p += sym_size, vs += 2) 1406 { 1407 elfcpp::Sym<size, big_endian> sym(p); 1408 1409 if (sympointers != NULL) 1410 (*sympointers)[i] = NULL; 1411 1412 // Ignore symbols with local binding or that have 1413 // internal or hidden visibility. 1414 if (sym.get_st_bind() == elfcpp::STB_LOCAL 1415 || sym.get_st_visibility() == elfcpp::STV_INTERNAL 1416 || sym.get_st_visibility() == elfcpp::STV_HIDDEN) 1417 continue; 1418 1419 // A protected symbol in a shared library must be treated as a 1420 // normal symbol when viewed from outside the shared library. 1421 // Implement this by overriding the visibility here. 1422 elfcpp::Sym<size, big_endian>* psym = &sym; 1423 unsigned char symbuf[sym_size]; 1424 elfcpp::Sym<size, big_endian> sym2(symbuf); 1425 if (sym.get_st_visibility() == elfcpp::STV_PROTECTED) 1426 { 1427 memcpy(symbuf, p, sym_size); 1428 elfcpp::Sym_write<size, big_endian> sw(symbuf); 1429 sw.put_st_other(elfcpp::STV_DEFAULT, sym.get_st_nonvis()); 1430 psym = &sym2; 1431 } 1432 1433 unsigned int st_name = psym->get_st_name(); 1434 if (st_name >= sym_name_size) 1435 { 1436 dynobj->error(_("bad symbol name offset %u at %zu"), 1437 st_name, i); 1438 continue; 1439 } 1440 1441 const char* name = sym_names + st_name; 1442 1443 bool is_ordinary; 1444 unsigned int st_shndx = dynobj->adjust_sym_shndx(i, psym->get_st_shndx(), 1445 &is_ordinary); 1446 1447 if (st_shndx != elfcpp::SHN_UNDEF) 1448 ++*defined; 1449 1450 Sized_symbol<size>* res; 1451 1452 if (versym == NULL) 1453 { 1454 Stringpool::Key name_key; 1455 name = this->namepool_.add(name, true, &name_key); 1456 res = this->add_from_object(dynobj, name, name_key, NULL, 0, 1457 false, *psym, st_shndx, is_ordinary, 1458 st_shndx); 1459 } 1460 else 1461 { 1462 // Read the version information. 1463 1464 unsigned int v = elfcpp::Swap<16, big_endian>::readval(vs); 1465 1466 bool hidden = (v & elfcpp::VERSYM_HIDDEN) != 0; 1467 v &= elfcpp::VERSYM_VERSION; 1468 1469 // The Sun documentation says that V can be VER_NDX_LOCAL, 1470 // or VER_NDX_GLOBAL, or a version index. The meaning of 1471 // VER_NDX_LOCAL is defined as "Symbol has local scope." 1472 // The old GNU linker will happily generate VER_NDX_LOCAL 1473 // for an undefined symbol. I don't know what the Sun 1474 // linker will generate. 1475 1476 if (v == static_cast<unsigned int>(elfcpp::VER_NDX_LOCAL) 1477 && st_shndx != elfcpp::SHN_UNDEF) 1478 { 1479 // This symbol should not be visible outside the object. 1480 continue; 1481 } 1482 1483 // At this point we are definitely going to add this symbol. 1484 Stringpool::Key name_key; 1485 name = this->namepool_.add(name, true, &name_key); 1486 1487 if (v == static_cast<unsigned int>(elfcpp::VER_NDX_LOCAL) 1488 || v == static_cast<unsigned int>(elfcpp::VER_NDX_GLOBAL)) 1489 { 1490 // This symbol does not have a version. 1491 res = this->add_from_object(dynobj, name, name_key, NULL, 0, 1492 false, *psym, st_shndx, is_ordinary, 1493 st_shndx); 1494 } 1495 else 1496 { 1497 if (v >= version_map->size()) 1498 { 1499 dynobj->error(_("versym for symbol %zu out of range: %u"), 1500 i, v); 1501 continue; 1502 } 1503 1504 const char* version = (*version_map)[v]; 1505 if (version == NULL) 1506 { 1507 dynobj->error(_("versym for symbol %zu has no name: %u"), 1508 i, v); 1509 continue; 1510 } 1511 1512 Stringpool::Key version_key; 1513 version = this->namepool_.add(version, true, &version_key); 1514 1515 // If this is an absolute symbol, and the version name 1516 // and symbol name are the same, then this is the 1517 // version definition symbol. These symbols exist to 1518 // support using -u to pull in particular versions. We 1519 // do not want to record a version for them. 1520 if (st_shndx == elfcpp::SHN_ABS 1521 && !is_ordinary 1522 && name_key == version_key) 1523 res = this->add_from_object(dynobj, name, name_key, NULL, 0, 1524 false, *psym, st_shndx, is_ordinary, 1525 st_shndx); 1526 else 1527 { 1528 const bool is_default_version = 1529 !hidden && st_shndx != elfcpp::SHN_UNDEF; 1530 res = this->add_from_object(dynobj, name, name_key, version, 1531 version_key, is_default_version, 1532 *psym, st_shndx, 1533 is_ordinary, st_shndx); 1534 } 1535 } 1536 } 1537 1538 // Note that it is possible that RES was overridden by an 1539 // earlier object, in which case it can't be aliased here. 1540 if (st_shndx != elfcpp::SHN_UNDEF 1541 && is_ordinary 1542 && psym->get_st_type() == elfcpp::STT_OBJECT 1543 && res->source() == Symbol::FROM_OBJECT 1544 && res->object() == dynobj) 1545 object_symbols.push_back(res); 1546 1547 if (sympointers != NULL) 1548 (*sympointers)[i] = res; 1549 } 1550 1551 this->record_weak_aliases(&object_symbols); 1552 } 1553 1554 // Add a symbol from a incremental object file. 1555 1556 template<int size, bool big_endian> 1557 Sized_symbol<size>* 1558 Symbol_table::add_from_incrobj( 1559 Object* obj, 1560 const char* name, 1561 const char* ver, 1562 elfcpp::Sym<size, big_endian>* sym) 1563 { 1564 unsigned int st_shndx = sym->get_st_shndx(); 1565 bool is_ordinary = st_shndx < elfcpp::SHN_LORESERVE; 1566 1567 Stringpool::Key ver_key = 0; 1568 bool is_default_version = false; 1569 bool is_forced_local = false; 1570 1571 Stringpool::Key name_key; 1572 name = this->namepool_.add(name, true, &name_key); 1573 1574 Sized_symbol<size>* res; 1575 res = this->add_from_object(obj, name, name_key, ver, ver_key, 1576 is_default_version, *sym, st_shndx, 1577 is_ordinary, st_shndx); 1578 1579 if (is_forced_local) 1580 this->force_local(res); 1581 1582 return res; 1583 } 1584 1585 // This is used to sort weak aliases. We sort them first by section 1586 // index, then by offset, then by weak ahead of strong. 1587 1588 template<int size> 1589 class Weak_alias_sorter 1590 { 1591 public: 1592 bool operator()(const Sized_symbol<size>*, const Sized_symbol<size>*) const; 1593 }; 1594 1595 template<int size> 1596 bool 1597 Weak_alias_sorter<size>::operator()(const Sized_symbol<size>* s1, 1598 const Sized_symbol<size>* s2) const 1599 { 1600 bool is_ordinary; 1601 unsigned int s1_shndx = s1->shndx(&is_ordinary); 1602 gold_assert(is_ordinary); 1603 unsigned int s2_shndx = s2->shndx(&is_ordinary); 1604 gold_assert(is_ordinary); 1605 if (s1_shndx != s2_shndx) 1606 return s1_shndx < s2_shndx; 1607 1608 if (s1->value() != s2->value()) 1609 return s1->value() < s2->value(); 1610 if (s1->binding() != s2->binding()) 1611 { 1612 if (s1->binding() == elfcpp::STB_WEAK) 1613 return true; 1614 if (s2->binding() == elfcpp::STB_WEAK) 1615 return false; 1616 } 1617 return std::string(s1->name()) < std::string(s2->name()); 1618 } 1619 1620 // SYMBOLS is a list of object symbols from a dynamic object. Look 1621 // for any weak aliases, and record them so that if we add the weak 1622 // alias to the dynamic symbol table, we also add the corresponding 1623 // strong symbol. 1624 1625 template<int size> 1626 void 1627 Symbol_table::record_weak_aliases(std::vector<Sized_symbol<size>*>* symbols) 1628 { 1629 // Sort the vector by section index, then by offset, then by weak 1630 // ahead of strong. 1631 std::sort(symbols->begin(), symbols->end(), Weak_alias_sorter<size>()); 1632 1633 // Walk through the vector. For each weak definition, record 1634 // aliases. 1635 for (typename std::vector<Sized_symbol<size>*>::const_iterator p = 1636 symbols->begin(); 1637 p != symbols->end(); 1638 ++p) 1639 { 1640 if ((*p)->binding() != elfcpp::STB_WEAK) 1641 continue; 1642 1643 // Build a circular list of weak aliases. Each symbol points to 1644 // the next one in the circular list. 1645 1646 Sized_symbol<size>* from_sym = *p; 1647 typename std::vector<Sized_symbol<size>*>::const_iterator q; 1648 for (q = p + 1; q != symbols->end(); ++q) 1649 { 1650 bool dummy; 1651 if ((*q)->shndx(&dummy) != from_sym->shndx(&dummy) 1652 || (*q)->value() != from_sym->value()) 1653 break; 1654 1655 this->weak_aliases_[from_sym] = *q; 1656 from_sym->set_has_alias(); 1657 from_sym = *q; 1658 } 1659 1660 if (from_sym != *p) 1661 { 1662 this->weak_aliases_[from_sym] = *p; 1663 from_sym->set_has_alias(); 1664 } 1665 1666 p = q - 1; 1667 } 1668 } 1669 1670 // Create and return a specially defined symbol. If ONLY_IF_REF is 1671 // true, then only create the symbol if there is a reference to it. 1672 // If this does not return NULL, it sets *POLDSYM to the existing 1673 // symbol if there is one. This sets *RESOLVE_OLDSYM if we should 1674 // resolve the newly created symbol to the old one. This 1675 // canonicalizes *PNAME and *PVERSION. 1676 1677 template<int size, bool big_endian> 1678 Sized_symbol<size>* 1679 Symbol_table::define_special_symbol(const char** pname, const char** pversion, 1680 bool only_if_ref, 1681 Sized_symbol<size>** poldsym, 1682 bool* resolve_oldsym) 1683 { 1684 *resolve_oldsym = false; 1685 *poldsym = NULL; 1686 1687 // If the caller didn't give us a version, see if we get one from 1688 // the version script. 1689 std::string v; 1690 bool is_default_version = false; 1691 if (*pversion == NULL) 1692 { 1693 bool is_global; 1694 if (this->version_script_.get_symbol_version(*pname, &v, &is_global)) 1695 { 1696 if (is_global && !v.empty()) 1697 { 1698 *pversion = v.c_str(); 1699 // If we get the version from a version script, then we 1700 // are also the default version. 1701 is_default_version = true; 1702 } 1703 } 1704 } 1705 1706 Symbol* oldsym; 1707 Sized_symbol<size>* sym; 1708 1709 bool add_to_table = false; 1710 typename Symbol_table_type::iterator add_loc = this->table_.end(); 1711 bool add_def_to_table = false; 1712 typename Symbol_table_type::iterator add_def_loc = this->table_.end(); 1713 1714 if (only_if_ref) 1715 { 1716 oldsym = this->lookup(*pname, *pversion); 1717 if (oldsym == NULL && is_default_version) 1718 oldsym = this->lookup(*pname, NULL); 1719 if (oldsym == NULL || !oldsym->is_undefined()) 1720 return NULL; 1721 1722 *pname = oldsym->name(); 1723 if (is_default_version) 1724 *pversion = this->namepool_.add(*pversion, true, NULL); 1725 else 1726 *pversion = oldsym->version(); 1727 } 1728 else 1729 { 1730 // Canonicalize NAME and VERSION. 1731 Stringpool::Key name_key; 1732 *pname = this->namepool_.add(*pname, true, &name_key); 1733 1734 Stringpool::Key version_key = 0; 1735 if (*pversion != NULL) 1736 *pversion = this->namepool_.add(*pversion, true, &version_key); 1737 1738 Symbol* const snull = NULL; 1739 std::pair<typename Symbol_table_type::iterator, bool> ins = 1740 this->table_.insert(std::make_pair(std::make_pair(name_key, 1741 version_key), 1742 snull)); 1743 1744 std::pair<typename Symbol_table_type::iterator, bool> insdefault = 1745 std::make_pair(this->table_.end(), false); 1746 if (is_default_version) 1747 { 1748 const Stringpool::Key vnull = 0; 1749 insdefault = 1750 this->table_.insert(std::make_pair(std::make_pair(name_key, 1751 vnull), 1752 snull)); 1753 } 1754 1755 if (!ins.second) 1756 { 1757 // We already have a symbol table entry for NAME/VERSION. 1758 oldsym = ins.first->second; 1759 gold_assert(oldsym != NULL); 1760 1761 if (is_default_version) 1762 { 1763 Sized_symbol<size>* soldsym = 1764 this->get_sized_symbol<size>(oldsym); 1765 this->define_default_version<size, big_endian>(soldsym, 1766 insdefault.second, 1767 insdefault.first); 1768 } 1769 } 1770 else 1771 { 1772 // We haven't seen this symbol before. 1773 gold_assert(ins.first->second == NULL); 1774 1775 add_to_table = true; 1776 add_loc = ins.first; 1777 1778 if (is_default_version && !insdefault.second) 1779 { 1780 // We are adding NAME/VERSION, and it is the default 1781 // version. We already have an entry for NAME/NULL. 1782 oldsym = insdefault.first->second; 1783 *resolve_oldsym = true; 1784 } 1785 else 1786 { 1787 oldsym = NULL; 1788 1789 if (is_default_version) 1790 { 1791 add_def_to_table = true; 1792 add_def_loc = insdefault.first; 1793 } 1794 } 1795 } 1796 } 1797 1798 const Target& target = parameters->target(); 1799 if (!target.has_make_symbol()) 1800 sym = new Sized_symbol<size>(); 1801 else 1802 { 1803 Sized_target<size, big_endian>* sized_target = 1804 parameters->sized_target<size, big_endian>(); 1805 sym = sized_target->make_symbol(); 1806 if (sym == NULL) 1807 return NULL; 1808 } 1809 1810 if (add_to_table) 1811 add_loc->second = sym; 1812 else 1813 gold_assert(oldsym != NULL); 1814 1815 if (add_def_to_table) 1816 add_def_loc->second = sym; 1817 1818 *poldsym = this->get_sized_symbol<size>(oldsym); 1819 1820 return sym; 1821 } 1822 1823 // Define a symbol based on an Output_data. 1824 1825 Symbol* 1826 Symbol_table::define_in_output_data(const char* name, 1827 const char* version, 1828 Defined defined, 1829 Output_data* od, 1830 uint64_t value, 1831 uint64_t symsize, 1832 elfcpp::STT type, 1833 elfcpp::STB binding, 1834 elfcpp::STV visibility, 1835 unsigned char nonvis, 1836 bool offset_is_from_end, 1837 bool only_if_ref) 1838 { 1839 if (parameters->target().get_size() == 32) 1840 { 1841 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG) 1842 return this->do_define_in_output_data<32>(name, version, defined, od, 1843 value, symsize, type, binding, 1844 visibility, nonvis, 1845 offset_is_from_end, 1846 only_if_ref); 1847 #else 1848 gold_unreachable(); 1849 #endif 1850 } 1851 else if (parameters->target().get_size() == 64) 1852 { 1853 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG) 1854 return this->do_define_in_output_data<64>(name, version, defined, od, 1855 value, symsize, type, binding, 1856 visibility, nonvis, 1857 offset_is_from_end, 1858 only_if_ref); 1859 #else 1860 gold_unreachable(); 1861 #endif 1862 } 1863 else 1864 gold_unreachable(); 1865 } 1866 1867 // Define a symbol in an Output_data, sized version. 1868 1869 template<int size> 1870 Sized_symbol<size>* 1871 Symbol_table::do_define_in_output_data( 1872 const char* name, 1873 const char* version, 1874 Defined defined, 1875 Output_data* od, 1876 typename elfcpp::Elf_types<size>::Elf_Addr value, 1877 typename elfcpp::Elf_types<size>::Elf_WXword symsize, 1878 elfcpp::STT type, 1879 elfcpp::STB binding, 1880 elfcpp::STV visibility, 1881 unsigned char nonvis, 1882 bool offset_is_from_end, 1883 bool only_if_ref) 1884 { 1885 Sized_symbol<size>* sym; 1886 Sized_symbol<size>* oldsym; 1887 bool resolve_oldsym; 1888 1889 if (parameters->target().is_big_endian()) 1890 { 1891 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG) 1892 sym = this->define_special_symbol<size, true>(&name, &version, 1893 only_if_ref, &oldsym, 1894 &resolve_oldsym); 1895 #else 1896 gold_unreachable(); 1897 #endif 1898 } 1899 else 1900 { 1901 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_64_LITTLE) 1902 sym = this->define_special_symbol<size, false>(&name, &version, 1903 only_if_ref, &oldsym, 1904 &resolve_oldsym); 1905 #else 1906 gold_unreachable(); 1907 #endif 1908 } 1909 1910 if (sym == NULL) 1911 return NULL; 1912 1913 sym->init_output_data(name, version, od, value, symsize, type, binding, 1914 visibility, nonvis, offset_is_from_end, 1915 defined == PREDEFINED); 1916 1917 if (oldsym == NULL) 1918 { 1919 if (binding == elfcpp::STB_LOCAL 1920 || this->version_script_.symbol_is_local(name)) 1921 this->force_local(sym); 1922 else if (version != NULL) 1923 sym->set_is_default(); 1924 return sym; 1925 } 1926 1927 if (Symbol_table::should_override_with_special(oldsym, type, defined)) 1928 this->override_with_special(oldsym, sym); 1929 1930 if (resolve_oldsym) 1931 return sym; 1932 else 1933 { 1934 delete sym; 1935 return oldsym; 1936 } 1937 } 1938 1939 // Define a symbol based on an Output_segment. 1940 1941 Symbol* 1942 Symbol_table::define_in_output_segment(const char* name, 1943 const char* version, 1944 Defined defined, 1945 Output_segment* os, 1946 uint64_t value, 1947 uint64_t symsize, 1948 elfcpp::STT type, 1949 elfcpp::STB binding, 1950 elfcpp::STV visibility, 1951 unsigned char nonvis, 1952 Symbol::Segment_offset_base offset_base, 1953 bool only_if_ref) 1954 { 1955 if (parameters->target().get_size() == 32) 1956 { 1957 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG) 1958 return this->do_define_in_output_segment<32>(name, version, defined, os, 1959 value, symsize, type, 1960 binding, visibility, nonvis, 1961 offset_base, only_if_ref); 1962 #else 1963 gold_unreachable(); 1964 #endif 1965 } 1966 else if (parameters->target().get_size() == 64) 1967 { 1968 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG) 1969 return this->do_define_in_output_segment<64>(name, version, defined, os, 1970 value, symsize, type, 1971 binding, visibility, nonvis, 1972 offset_base, only_if_ref); 1973 #else 1974 gold_unreachable(); 1975 #endif 1976 } 1977 else 1978 gold_unreachable(); 1979 } 1980 1981 // Define a symbol in an Output_segment, sized version. 1982 1983 template<int size> 1984 Sized_symbol<size>* 1985 Symbol_table::do_define_in_output_segment( 1986 const char* name, 1987 const char* version, 1988 Defined defined, 1989 Output_segment* os, 1990 typename elfcpp::Elf_types<size>::Elf_Addr value, 1991 typename elfcpp::Elf_types<size>::Elf_WXword symsize, 1992 elfcpp::STT type, 1993 elfcpp::STB binding, 1994 elfcpp::STV visibility, 1995 unsigned char nonvis, 1996 Symbol::Segment_offset_base offset_base, 1997 bool only_if_ref) 1998 { 1999 Sized_symbol<size>* sym; 2000 Sized_symbol<size>* oldsym; 2001 bool resolve_oldsym; 2002 2003 if (parameters->target().is_big_endian()) 2004 { 2005 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG) 2006 sym = this->define_special_symbol<size, true>(&name, &version, 2007 only_if_ref, &oldsym, 2008 &resolve_oldsym); 2009 #else 2010 gold_unreachable(); 2011 #endif 2012 } 2013 else 2014 { 2015 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_64_LITTLE) 2016 sym = this->define_special_symbol<size, false>(&name, &version, 2017 only_if_ref, &oldsym, 2018 &resolve_oldsym); 2019 #else 2020 gold_unreachable(); 2021 #endif 2022 } 2023 2024 if (sym == NULL) 2025 return NULL; 2026 2027 sym->init_output_segment(name, version, os, value, symsize, type, binding, 2028 visibility, nonvis, offset_base, 2029 defined == PREDEFINED); 2030 2031 if (oldsym == NULL) 2032 { 2033 if (binding == elfcpp::STB_LOCAL 2034 || this->version_script_.symbol_is_local(name)) 2035 this->force_local(sym); 2036 else if (version != NULL) 2037 sym->set_is_default(); 2038 return sym; 2039 } 2040 2041 if (Symbol_table::should_override_with_special(oldsym, type, defined)) 2042 this->override_with_special(oldsym, sym); 2043 2044 if (resolve_oldsym) 2045 return sym; 2046 else 2047 { 2048 delete sym; 2049 return oldsym; 2050 } 2051 } 2052 2053 // Define a special symbol with a constant value. It is a multiple 2054 // definition error if this symbol is already defined. 2055 2056 Symbol* 2057 Symbol_table::define_as_constant(const char* name, 2058 const char* version, 2059 Defined defined, 2060 uint64_t value, 2061 uint64_t symsize, 2062 elfcpp::STT type, 2063 elfcpp::STB binding, 2064 elfcpp::STV visibility, 2065 unsigned char nonvis, 2066 bool only_if_ref, 2067 bool force_override) 2068 { 2069 if (parameters->target().get_size() == 32) 2070 { 2071 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG) 2072 return this->do_define_as_constant<32>(name, version, defined, value, 2073 symsize, type, binding, 2074 visibility, nonvis, only_if_ref, 2075 force_override); 2076 #else 2077 gold_unreachable(); 2078 #endif 2079 } 2080 else if (parameters->target().get_size() == 64) 2081 { 2082 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG) 2083 return this->do_define_as_constant<64>(name, version, defined, value, 2084 symsize, type, binding, 2085 visibility, nonvis, only_if_ref, 2086 force_override); 2087 #else 2088 gold_unreachable(); 2089 #endif 2090 } 2091 else 2092 gold_unreachable(); 2093 } 2094 2095 // Define a symbol as a constant, sized version. 2096 2097 template<int size> 2098 Sized_symbol<size>* 2099 Symbol_table::do_define_as_constant( 2100 const char* name, 2101 const char* version, 2102 Defined defined, 2103 typename elfcpp::Elf_types<size>::Elf_Addr value, 2104 typename elfcpp::Elf_types<size>::Elf_WXword symsize, 2105 elfcpp::STT type, 2106 elfcpp::STB binding, 2107 elfcpp::STV visibility, 2108 unsigned char nonvis, 2109 bool only_if_ref, 2110 bool force_override) 2111 { 2112 Sized_symbol<size>* sym; 2113 Sized_symbol<size>* oldsym; 2114 bool resolve_oldsym; 2115 2116 if (parameters->target().is_big_endian()) 2117 { 2118 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG) 2119 sym = this->define_special_symbol<size, true>(&name, &version, 2120 only_if_ref, &oldsym, 2121 &resolve_oldsym); 2122 #else 2123 gold_unreachable(); 2124 #endif 2125 } 2126 else 2127 { 2128 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_64_LITTLE) 2129 sym = this->define_special_symbol<size, false>(&name, &version, 2130 only_if_ref, &oldsym, 2131 &resolve_oldsym); 2132 #else 2133 gold_unreachable(); 2134 #endif 2135 } 2136 2137 if (sym == NULL) 2138 return NULL; 2139 2140 sym->init_constant(name, version, value, symsize, type, binding, visibility, 2141 nonvis, defined == PREDEFINED); 2142 2143 if (oldsym == NULL) 2144 { 2145 // Version symbols are absolute symbols with name == version. 2146 // We don't want to force them to be local. 2147 if ((version == NULL 2148 || name != version 2149 || value != 0) 2150 && (binding == elfcpp::STB_LOCAL 2151 || this->version_script_.symbol_is_local(name))) 2152 this->force_local(sym); 2153 else if (version != NULL 2154 && (name != version || value != 0)) 2155 sym->set_is_default(); 2156 return sym; 2157 } 2158 2159 if (force_override 2160 || Symbol_table::should_override_with_special(oldsym, type, defined)) 2161 this->override_with_special(oldsym, sym); 2162 2163 if (resolve_oldsym) 2164 return sym; 2165 else 2166 { 2167 delete sym; 2168 return oldsym; 2169 } 2170 } 2171 2172 // Define a set of symbols in output sections. 2173 2174 void 2175 Symbol_table::define_symbols(const Layout* layout, int count, 2176 const Define_symbol_in_section* p, 2177 bool only_if_ref) 2178 { 2179 for (int i = 0; i < count; ++i, ++p) 2180 { 2181 Output_section* os = layout->find_output_section(p->output_section); 2182 if (os != NULL) 2183 this->define_in_output_data(p->name, NULL, PREDEFINED, os, p->value, 2184 p->size, p->type, p->binding, 2185 p->visibility, p->nonvis, 2186 p->offset_is_from_end, 2187 only_if_ref || p->only_if_ref); 2188 else 2189 this->define_as_constant(p->name, NULL, PREDEFINED, 0, p->size, 2190 p->type, p->binding, p->visibility, p->nonvis, 2191 only_if_ref || p->only_if_ref, 2192 false); 2193 } 2194 } 2195 2196 // Define a set of symbols in output segments. 2197 2198 void 2199 Symbol_table::define_symbols(const Layout* layout, int count, 2200 const Define_symbol_in_segment* p, 2201 bool only_if_ref) 2202 { 2203 for (int i = 0; i < count; ++i, ++p) 2204 { 2205 Output_segment* os = layout->find_output_segment(p->segment_type, 2206 p->segment_flags_set, 2207 p->segment_flags_clear); 2208 if (os != NULL) 2209 this->define_in_output_segment(p->name, NULL, PREDEFINED, os, p->value, 2210 p->size, p->type, p->binding, 2211 p->visibility, p->nonvis, 2212 p->offset_base, 2213 only_if_ref || p->only_if_ref); 2214 else 2215 this->define_as_constant(p->name, NULL, PREDEFINED, 0, p->size, 2216 p->type, p->binding, p->visibility, p->nonvis, 2217 only_if_ref || p->only_if_ref, 2218 false); 2219 } 2220 } 2221 2222 // Define CSYM using a COPY reloc. POSD is the Output_data where the 2223 // symbol should be defined--typically a .dyn.bss section. VALUE is 2224 // the offset within POSD. 2225 2226 template<int size> 2227 void 2228 Symbol_table::define_with_copy_reloc( 2229 Sized_symbol<size>* csym, 2230 Output_data* posd, 2231 typename elfcpp::Elf_types<size>::Elf_Addr value) 2232 { 2233 gold_assert(csym->is_from_dynobj()); 2234 gold_assert(!csym->is_copied_from_dynobj()); 2235 Object* object = csym->object(); 2236 gold_assert(object->is_dynamic()); 2237 Dynobj* dynobj = static_cast<Dynobj*>(object); 2238 2239 // Our copied variable has to override any variable in a shared 2240 // library. 2241 elfcpp::STB binding = csym->binding(); 2242 if (binding == elfcpp::STB_WEAK) 2243 binding = elfcpp::STB_GLOBAL; 2244 2245 this->define_in_output_data(csym->name(), csym->version(), COPY, 2246 posd, value, csym->symsize(), 2247 csym->type(), binding, 2248 csym->visibility(), csym->nonvis(), 2249 false, false); 2250 2251 csym->set_is_copied_from_dynobj(); 2252 csym->set_needs_dynsym_entry(); 2253 2254 this->copied_symbol_dynobjs_[csym] = dynobj; 2255 2256 // We have now defined all aliases, but we have not entered them all 2257 // in the copied_symbol_dynobjs_ map. 2258 if (csym->has_alias()) 2259 { 2260 Symbol* sym = csym; 2261 while (true) 2262 { 2263 sym = this->weak_aliases_[sym]; 2264 if (sym == csym) 2265 break; 2266 gold_assert(sym->output_data() == posd); 2267 2268 sym->set_is_copied_from_dynobj(); 2269 this->copied_symbol_dynobjs_[sym] = dynobj; 2270 } 2271 } 2272 } 2273 2274 // SYM is defined using a COPY reloc. Return the dynamic object where 2275 // the original definition was found. 2276 2277 Dynobj* 2278 Symbol_table::get_copy_source(const Symbol* sym) const 2279 { 2280 gold_assert(sym->is_copied_from_dynobj()); 2281 Copied_symbol_dynobjs::const_iterator p = 2282 this->copied_symbol_dynobjs_.find(sym); 2283 gold_assert(p != this->copied_symbol_dynobjs_.end()); 2284 return p->second; 2285 } 2286 2287 // Add any undefined symbols named on the command line. 2288 2289 void 2290 Symbol_table::add_undefined_symbols_from_command_line(Layout* layout) 2291 { 2292 if (parameters->options().any_undefined() 2293 || layout->script_options()->any_unreferenced()) 2294 { 2295 if (parameters->target().get_size() == 32) 2296 { 2297 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG) 2298 this->do_add_undefined_symbols_from_command_line<32>(layout); 2299 #else 2300 gold_unreachable(); 2301 #endif 2302 } 2303 else if (parameters->target().get_size() == 64) 2304 { 2305 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG) 2306 this->do_add_undefined_symbols_from_command_line<64>(layout); 2307 #else 2308 gold_unreachable(); 2309 #endif 2310 } 2311 else 2312 gold_unreachable(); 2313 } 2314 } 2315 2316 template<int size> 2317 void 2318 Symbol_table::do_add_undefined_symbols_from_command_line(Layout* layout) 2319 { 2320 for (options::String_set::const_iterator p = 2321 parameters->options().undefined_begin(); 2322 p != parameters->options().undefined_end(); 2323 ++p) 2324 this->add_undefined_symbol_from_command_line<size>(p->c_str()); 2325 2326 for (options::String_set::const_iterator p = 2327 parameters->options().export_dynamic_symbol_begin(); 2328 p != parameters->options().export_dynamic_symbol_end(); 2329 ++p) 2330 this->add_undefined_symbol_from_command_line<size>(p->c_str()); 2331 2332 for (Script_options::referenced_const_iterator p = 2333 layout->script_options()->referenced_begin(); 2334 p != layout->script_options()->referenced_end(); 2335 ++p) 2336 this->add_undefined_symbol_from_command_line<size>(p->c_str()); 2337 } 2338 2339 template<int size> 2340 void 2341 Symbol_table::add_undefined_symbol_from_command_line(const char* name) 2342 { 2343 if (this->lookup(name) != NULL) 2344 return; 2345 2346 const char* version = NULL; 2347 2348 Sized_symbol<size>* sym; 2349 Sized_symbol<size>* oldsym; 2350 bool resolve_oldsym; 2351 if (parameters->target().is_big_endian()) 2352 { 2353 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG) 2354 sym = this->define_special_symbol<size, true>(&name, &version, 2355 false, &oldsym, 2356 &resolve_oldsym); 2357 #else 2358 gold_unreachable(); 2359 #endif 2360 } 2361 else 2362 { 2363 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_64_LITTLE) 2364 sym = this->define_special_symbol<size, false>(&name, &version, 2365 false, &oldsym, 2366 &resolve_oldsym); 2367 #else 2368 gold_unreachable(); 2369 #endif 2370 } 2371 2372 gold_assert(oldsym == NULL); 2373 2374 sym->init_undefined(name, version, elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL, 2375 elfcpp::STV_DEFAULT, 0); 2376 ++this->saw_undefined_; 2377 } 2378 2379 // Set the dynamic symbol indexes. INDEX is the index of the first 2380 // global dynamic symbol. Pointers to the symbols are stored into the 2381 // vector SYMS. The names are added to DYNPOOL. This returns an 2382 // updated dynamic symbol index. 2383 2384 unsigned int 2385 Symbol_table::set_dynsym_indexes(unsigned int index, 2386 std::vector<Symbol*>* syms, 2387 Stringpool* dynpool, 2388 Versions* versions) 2389 { 2390 for (Symbol_table_type::iterator p = this->table_.begin(); 2391 p != this->table_.end(); 2392 ++p) 2393 { 2394 Symbol* sym = p->second; 2395 2396 // Note that SYM may already have a dynamic symbol index, since 2397 // some symbols appear more than once in the symbol table, with 2398 // and without a version. 2399 2400 if (!sym->should_add_dynsym_entry(this)) 2401 sym->set_dynsym_index(-1U); 2402 else if (!sym->has_dynsym_index()) 2403 { 2404 sym->set_dynsym_index(index); 2405 ++index; 2406 syms->push_back(sym); 2407 dynpool->add(sym->name(), false, NULL); 2408 2409 // Record any version information. 2410 if (sym->version() != NULL) 2411 versions->record_version(this, dynpool, sym); 2412 2413 // If the symbol is defined in a dynamic object and is 2414 // referenced in a regular object, then mark the dynamic 2415 // object as needed. This is used to implement --as-needed. 2416 if (sym->is_from_dynobj() && sym->in_reg()) 2417 sym->object()->set_is_needed(); 2418 } 2419 } 2420 2421 // Finish up the versions. In some cases this may add new dynamic 2422 // symbols. 2423 index = versions->finalize(this, index, syms); 2424 2425 return index; 2426 } 2427 2428 // Set the final values for all the symbols. The index of the first 2429 // global symbol in the output file is *PLOCAL_SYMCOUNT. Record the 2430 // file offset OFF. Add their names to POOL. Return the new file 2431 // offset. Update *PLOCAL_SYMCOUNT if necessary. 2432 2433 off_t 2434 Symbol_table::finalize(off_t off, off_t dynoff, size_t dyn_global_index, 2435 size_t dyncount, Stringpool* pool, 2436 unsigned int* plocal_symcount) 2437 { 2438 off_t ret; 2439 2440 gold_assert(*plocal_symcount != 0); 2441 this->first_global_index_ = *plocal_symcount; 2442 2443 this->dynamic_offset_ = dynoff; 2444 this->first_dynamic_global_index_ = dyn_global_index; 2445 this->dynamic_count_ = dyncount; 2446 2447 if (parameters->target().get_size() == 32) 2448 { 2449 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_32_LITTLE) 2450 ret = this->sized_finalize<32>(off, pool, plocal_symcount); 2451 #else 2452 gold_unreachable(); 2453 #endif 2454 } 2455 else if (parameters->target().get_size() == 64) 2456 { 2457 #if defined(HAVE_TARGET_64_BIG) || defined(HAVE_TARGET_64_LITTLE) 2458 ret = this->sized_finalize<64>(off, pool, plocal_symcount); 2459 #else 2460 gold_unreachable(); 2461 #endif 2462 } 2463 else 2464 gold_unreachable(); 2465 2466 // Now that we have the final symbol table, we can reliably note 2467 // which symbols should get warnings. 2468 this->warnings_.note_warnings(this); 2469 2470 return ret; 2471 } 2472 2473 // SYM is going into the symbol table at *PINDEX. Add the name to 2474 // POOL, update *PINDEX and *POFF. 2475 2476 template<int size> 2477 void 2478 Symbol_table::add_to_final_symtab(Symbol* sym, Stringpool* pool, 2479 unsigned int* pindex, off_t* poff) 2480 { 2481 sym->set_symtab_index(*pindex); 2482 if (sym->version() == NULL || !parameters->options().relocatable()) 2483 pool->add(sym->name(), false, NULL); 2484 else 2485 pool->add(sym->versioned_name(), true, NULL); 2486 ++*pindex; 2487 *poff += elfcpp::Elf_sizes<size>::sym_size; 2488 } 2489 2490 // Set the final value for all the symbols. This is called after 2491 // Layout::finalize, so all the output sections have their final 2492 // address. 2493 2494 template<int size> 2495 off_t 2496 Symbol_table::sized_finalize(off_t off, Stringpool* pool, 2497 unsigned int* plocal_symcount) 2498 { 2499 off = align_address(off, size >> 3); 2500 this->offset_ = off; 2501 2502 unsigned int index = *plocal_symcount; 2503 const unsigned int orig_index = index; 2504 2505 // First do all the symbols which have been forced to be local, as 2506 // they must appear before all global symbols. 2507 for (Forced_locals::iterator p = this->forced_locals_.begin(); 2508 p != this->forced_locals_.end(); 2509 ++p) 2510 { 2511 Symbol* sym = *p; 2512 gold_assert(sym->is_forced_local()); 2513 if (this->sized_finalize_symbol<size>(sym)) 2514 { 2515 this->add_to_final_symtab<size>(sym, pool, &index, &off); 2516 ++*plocal_symcount; 2517 } 2518 } 2519 2520 // Now do all the remaining symbols. 2521 for (Symbol_table_type::iterator p = this->table_.begin(); 2522 p != this->table_.end(); 2523 ++p) 2524 { 2525 Symbol* sym = p->second; 2526 if (this->sized_finalize_symbol<size>(sym)) 2527 this->add_to_final_symtab<size>(sym, pool, &index, &off); 2528 } 2529 2530 this->output_count_ = index - orig_index; 2531 2532 return off; 2533 } 2534 2535 // Compute the final value of SYM and store status in location PSTATUS. 2536 // During relaxation, this may be called multiple times for a symbol to 2537 // compute its would-be final value in each relaxation pass. 2538 2539 template<int size> 2540 typename Sized_symbol<size>::Value_type 2541 Symbol_table::compute_final_value( 2542 const Sized_symbol<size>* sym, 2543 Compute_final_value_status* pstatus) const 2544 { 2545 typedef typename Sized_symbol<size>::Value_type Value_type; 2546 Value_type value; 2547 2548 switch (sym->source()) 2549 { 2550 case Symbol::FROM_OBJECT: 2551 { 2552 bool is_ordinary; 2553 unsigned int shndx = sym->shndx(&is_ordinary); 2554 2555 if (!is_ordinary 2556 && shndx != elfcpp::SHN_ABS 2557 && !Symbol::is_common_shndx(shndx)) 2558 { 2559 *pstatus = CFVS_UNSUPPORTED_SYMBOL_SECTION; 2560 return 0; 2561 } 2562 2563 Object* symobj = sym->object(); 2564 if (symobj->is_dynamic()) 2565 { 2566 value = 0; 2567 shndx = elfcpp::SHN_UNDEF; 2568 } 2569 else if (symobj->pluginobj() != NULL) 2570 { 2571 value = 0; 2572 shndx = elfcpp::SHN_UNDEF; 2573 } 2574 else if (shndx == elfcpp::SHN_UNDEF) 2575 value = 0; 2576 else if (!is_ordinary 2577 && (shndx == elfcpp::SHN_ABS 2578 || Symbol::is_common_shndx(shndx))) 2579 value = sym->value(); 2580 else 2581 { 2582 Relobj* relobj = static_cast<Relobj*>(symobj); 2583 Output_section* os = relobj->output_section(shndx); 2584 2585 if (this->is_section_folded(relobj, shndx)) 2586 { 2587 gold_assert(os == NULL); 2588 // Get the os of the section it is folded onto. 2589 Section_id folded = this->icf_->get_folded_section(relobj, 2590 shndx); 2591 gold_assert(folded.first != NULL); 2592 Relobj* folded_obj = reinterpret_cast<Relobj*>(folded.first); 2593 unsigned folded_shndx = folded.second; 2594 2595 os = folded_obj->output_section(folded_shndx); 2596 gold_assert(os != NULL); 2597 2598 // Replace (relobj, shndx) with canonical ICF input section. 2599 shndx = folded_shndx; 2600 relobj = folded_obj; 2601 } 2602 2603 uint64_t secoff64 = relobj->output_section_offset(shndx); 2604 if (os == NULL) 2605 { 2606 bool static_or_reloc = (parameters->doing_static_link() || 2607 parameters->options().relocatable()); 2608 gold_assert(static_or_reloc || sym->dynsym_index() == -1U); 2609 2610 *pstatus = CFVS_NO_OUTPUT_SECTION; 2611 return 0; 2612 } 2613 2614 if (secoff64 == -1ULL) 2615 { 2616 // The section needs special handling (e.g., a merge section). 2617 2618 value = os->output_address(relobj, shndx, sym->value()); 2619 } 2620 else 2621 { 2622 Value_type secoff = 2623 convert_types<Value_type, uint64_t>(secoff64); 2624 if (sym->type() == elfcpp::STT_TLS) 2625 value = sym->value() + os->tls_offset() + secoff; 2626 else 2627 value = sym->value() + os->address() + secoff; 2628 } 2629 } 2630 } 2631 break; 2632 2633 case Symbol::IN_OUTPUT_DATA: 2634 { 2635 Output_data* od = sym->output_data(); 2636 value = sym->value(); 2637 if (sym->type() != elfcpp::STT_TLS) 2638 value += od->address(); 2639 else 2640 { 2641 Output_section* os = od->output_section(); 2642 gold_assert(os != NULL); 2643 value += os->tls_offset() + (od->address() - os->address()); 2644 } 2645 if (sym->offset_is_from_end()) 2646 value += od->data_size(); 2647 } 2648 break; 2649 2650 case Symbol::IN_OUTPUT_SEGMENT: 2651 { 2652 Output_segment* os = sym->output_segment(); 2653 value = sym->value(); 2654 if (sym->type() != elfcpp::STT_TLS) 2655 value += os->vaddr(); 2656 switch (sym->offset_base()) 2657 { 2658 case Symbol::SEGMENT_START: 2659 break; 2660 case Symbol::SEGMENT_END: 2661 value += os->memsz(); 2662 break; 2663 case Symbol::SEGMENT_BSS: 2664 value += os->filesz(); 2665 break; 2666 default: 2667 gold_unreachable(); 2668 } 2669 } 2670 break; 2671 2672 case Symbol::IS_CONSTANT: 2673 value = sym->value(); 2674 break; 2675 2676 case Symbol::IS_UNDEFINED: 2677 value = 0; 2678 break; 2679 2680 default: 2681 gold_unreachable(); 2682 } 2683 2684 *pstatus = CFVS_OK; 2685 return value; 2686 } 2687 2688 // Finalize the symbol SYM. This returns true if the symbol should be 2689 // added to the symbol table, false otherwise. 2690 2691 template<int size> 2692 bool 2693 Symbol_table::sized_finalize_symbol(Symbol* unsized_sym) 2694 { 2695 typedef typename Sized_symbol<size>::Value_type Value_type; 2696 2697 Sized_symbol<size>* sym = static_cast<Sized_symbol<size>*>(unsized_sym); 2698 2699 // The default version of a symbol may appear twice in the symbol 2700 // table. We only need to finalize it once. 2701 if (sym->has_symtab_index()) 2702 return false; 2703 2704 if (!sym->in_reg()) 2705 { 2706 gold_assert(!sym->has_symtab_index()); 2707 sym->set_symtab_index(-1U); 2708 gold_assert(sym->dynsym_index() == -1U); 2709 return false; 2710 } 2711 2712 // If the symbol is only present on plugin files, the plugin decided we 2713 // don't need it. 2714 if (!sym->in_real_elf()) 2715 { 2716 gold_assert(!sym->has_symtab_index()); 2717 sym->set_symtab_index(-1U); 2718 return false; 2719 } 2720 2721 // Compute final symbol value. 2722 Compute_final_value_status status; 2723 Value_type value = this->compute_final_value(sym, &status); 2724 2725 switch (status) 2726 { 2727 case CFVS_OK: 2728 break; 2729 case CFVS_UNSUPPORTED_SYMBOL_SECTION: 2730 { 2731 bool is_ordinary; 2732 unsigned int shndx = sym->shndx(&is_ordinary); 2733 gold_error(_("%s: unsupported symbol section 0x%x"), 2734 sym->demangled_name().c_str(), shndx); 2735 } 2736 break; 2737 case CFVS_NO_OUTPUT_SECTION: 2738 sym->set_symtab_index(-1U); 2739 return false; 2740 default: 2741 gold_unreachable(); 2742 } 2743 2744 sym->set_value(value); 2745 2746 if (parameters->options().strip_all() 2747 || !parameters->options().should_retain_symbol(sym->name())) 2748 { 2749 sym->set_symtab_index(-1U); 2750 return false; 2751 } 2752 2753 return true; 2754 } 2755 2756 // Write out the global symbols. 2757 2758 void 2759 Symbol_table::write_globals(const Stringpool* sympool, 2760 const Stringpool* dynpool, 2761 Output_symtab_xindex* symtab_xindex, 2762 Output_symtab_xindex* dynsym_xindex, 2763 Output_file* of) const 2764 { 2765 switch (parameters->size_and_endianness()) 2766 { 2767 #ifdef HAVE_TARGET_32_LITTLE 2768 case Parameters::TARGET_32_LITTLE: 2769 this->sized_write_globals<32, false>(sympool, dynpool, symtab_xindex, 2770 dynsym_xindex, of); 2771 break; 2772 #endif 2773 #ifdef HAVE_TARGET_32_BIG 2774 case Parameters::TARGET_32_BIG: 2775 this->sized_write_globals<32, true>(sympool, dynpool, symtab_xindex, 2776 dynsym_xindex, of); 2777 break; 2778 #endif 2779 #ifdef HAVE_TARGET_64_LITTLE 2780 case Parameters::TARGET_64_LITTLE: 2781 this->sized_write_globals<64, false>(sympool, dynpool, symtab_xindex, 2782 dynsym_xindex, of); 2783 break; 2784 #endif 2785 #ifdef HAVE_TARGET_64_BIG 2786 case Parameters::TARGET_64_BIG: 2787 this->sized_write_globals<64, true>(sympool, dynpool, symtab_xindex, 2788 dynsym_xindex, of); 2789 break; 2790 #endif 2791 default: 2792 gold_unreachable(); 2793 } 2794 } 2795 2796 // Write out the global symbols. 2797 2798 template<int size, bool big_endian> 2799 void 2800 Symbol_table::sized_write_globals(const Stringpool* sympool, 2801 const Stringpool* dynpool, 2802 Output_symtab_xindex* symtab_xindex, 2803 Output_symtab_xindex* dynsym_xindex, 2804 Output_file* of) const 2805 { 2806 const Target& target = parameters->target(); 2807 2808 const int sym_size = elfcpp::Elf_sizes<size>::sym_size; 2809 2810 const unsigned int output_count = this->output_count_; 2811 const section_size_type oview_size = output_count * sym_size; 2812 const unsigned int first_global_index = this->first_global_index_; 2813 unsigned char* psyms; 2814 if (this->offset_ == 0 || output_count == 0) 2815 psyms = NULL; 2816 else 2817 psyms = of->get_output_view(this->offset_, oview_size); 2818 2819 const unsigned int dynamic_count = this->dynamic_count_; 2820 const section_size_type dynamic_size = dynamic_count * sym_size; 2821 const unsigned int first_dynamic_global_index = 2822 this->first_dynamic_global_index_; 2823 unsigned char* dynamic_view; 2824 if (this->dynamic_offset_ == 0 || dynamic_count == 0) 2825 dynamic_view = NULL; 2826 else 2827 dynamic_view = of->get_output_view(this->dynamic_offset_, dynamic_size); 2828 2829 for (Symbol_table_type::const_iterator p = this->table_.begin(); 2830 p != this->table_.end(); 2831 ++p) 2832 { 2833 Sized_symbol<size>* sym = static_cast<Sized_symbol<size>*>(p->second); 2834 2835 // Possibly warn about unresolved symbols in shared libraries. 2836 this->warn_about_undefined_dynobj_symbol(sym); 2837 2838 unsigned int sym_index = sym->symtab_index(); 2839 unsigned int dynsym_index; 2840 if (dynamic_view == NULL) 2841 dynsym_index = -1U; 2842 else 2843 dynsym_index = sym->dynsym_index(); 2844 2845 if (sym_index == -1U && dynsym_index == -1U) 2846 { 2847 // This symbol is not included in the output file. 2848 continue; 2849 } 2850 2851 unsigned int shndx; 2852 typename elfcpp::Elf_types<size>::Elf_Addr sym_value = sym->value(); 2853 typename elfcpp::Elf_types<size>::Elf_Addr dynsym_value = sym_value; 2854 elfcpp::STB binding = sym->binding(); 2855 2856 // If --no-gnu-unique is set, change STB_GNU_UNIQUE to STB_GLOBAL. 2857 if (binding == elfcpp::STB_GNU_UNIQUE 2858 && !parameters->options().gnu_unique()) 2859 binding = elfcpp::STB_GLOBAL; 2860 2861 switch (sym->source()) 2862 { 2863 case Symbol::FROM_OBJECT: 2864 { 2865 bool is_ordinary; 2866 unsigned int in_shndx = sym->shndx(&is_ordinary); 2867 2868 if (!is_ordinary 2869 && in_shndx != elfcpp::SHN_ABS 2870 && !Symbol::is_common_shndx(in_shndx)) 2871 { 2872 gold_error(_("%s: unsupported symbol section 0x%x"), 2873 sym->demangled_name().c_str(), in_shndx); 2874 shndx = in_shndx; 2875 } 2876 else 2877 { 2878 Object* symobj = sym->object(); 2879 if (symobj->is_dynamic()) 2880 { 2881 if (sym->needs_dynsym_value()) 2882 dynsym_value = target.dynsym_value(sym); 2883 shndx = elfcpp::SHN_UNDEF; 2884 if (sym->is_undef_binding_weak()) 2885 binding = elfcpp::STB_WEAK; 2886 else 2887 binding = elfcpp::STB_GLOBAL; 2888 } 2889 else if (symobj->pluginobj() != NULL) 2890 shndx = elfcpp::SHN_UNDEF; 2891 else if (in_shndx == elfcpp::SHN_UNDEF 2892 || (!is_ordinary 2893 && (in_shndx == elfcpp::SHN_ABS 2894 || Symbol::is_common_shndx(in_shndx)))) 2895 shndx = in_shndx; 2896 else 2897 { 2898 Relobj* relobj = static_cast<Relobj*>(symobj); 2899 Output_section* os = relobj->output_section(in_shndx); 2900 if (this->is_section_folded(relobj, in_shndx)) 2901 { 2902 // This global symbol must be written out even though 2903 // it is folded. 2904 // Get the os of the section it is folded onto. 2905 Section_id folded = 2906 this->icf_->get_folded_section(relobj, in_shndx); 2907 gold_assert(folded.first !=NULL); 2908 Relobj* folded_obj = 2909 reinterpret_cast<Relobj*>(folded.first); 2910 os = folded_obj->output_section(folded.second); 2911 gold_assert(os != NULL); 2912 } 2913 gold_assert(os != NULL); 2914 shndx = os->out_shndx(); 2915 2916 if (shndx >= elfcpp::SHN_LORESERVE) 2917 { 2918 if (sym_index != -1U) 2919 symtab_xindex->add(sym_index, shndx); 2920 if (dynsym_index != -1U) 2921 dynsym_xindex->add(dynsym_index, shndx); 2922 shndx = elfcpp::SHN_XINDEX; 2923 } 2924 2925 // In object files symbol values are section 2926 // relative. 2927 if (parameters->options().relocatable()) 2928 sym_value -= os->address(); 2929 } 2930 } 2931 } 2932 break; 2933 2934 case Symbol::IN_OUTPUT_DATA: 2935 shndx = sym->output_data()->out_shndx(); 2936 if (shndx >= elfcpp::SHN_LORESERVE) 2937 { 2938 if (sym_index != -1U) 2939 symtab_xindex->add(sym_index, shndx); 2940 if (dynsym_index != -1U) 2941 dynsym_xindex->add(dynsym_index, shndx); 2942 shndx = elfcpp::SHN_XINDEX; 2943 } 2944 break; 2945 2946 case Symbol::IN_OUTPUT_SEGMENT: 2947 shndx = elfcpp::SHN_ABS; 2948 break; 2949 2950 case Symbol::IS_CONSTANT: 2951 shndx = elfcpp::SHN_ABS; 2952 break; 2953 2954 case Symbol::IS_UNDEFINED: 2955 shndx = elfcpp::SHN_UNDEF; 2956 break; 2957 2958 default: 2959 gold_unreachable(); 2960 } 2961 2962 if (sym_index != -1U) 2963 { 2964 sym_index -= first_global_index; 2965 gold_assert(sym_index < output_count); 2966 unsigned char* ps = psyms + (sym_index * sym_size); 2967 this->sized_write_symbol<size, big_endian>(sym, sym_value, shndx, 2968 binding, sympool, ps); 2969 } 2970 2971 if (dynsym_index != -1U) 2972 { 2973 dynsym_index -= first_dynamic_global_index; 2974 gold_assert(dynsym_index < dynamic_count); 2975 unsigned char* pd = dynamic_view + (dynsym_index * sym_size); 2976 this->sized_write_symbol<size, big_endian>(sym, dynsym_value, shndx, 2977 binding, dynpool, pd); 2978 } 2979 } 2980 2981 of->write_output_view(this->offset_, oview_size, psyms); 2982 if (dynamic_view != NULL) 2983 of->write_output_view(this->dynamic_offset_, dynamic_size, dynamic_view); 2984 } 2985 2986 // Write out the symbol SYM, in section SHNDX, to P. POOL is the 2987 // strtab holding the name. 2988 2989 template<int size, bool big_endian> 2990 void 2991 Symbol_table::sized_write_symbol( 2992 Sized_symbol<size>* sym, 2993 typename elfcpp::Elf_types<size>::Elf_Addr value, 2994 unsigned int shndx, 2995 elfcpp::STB binding, 2996 const Stringpool* pool, 2997 unsigned char* p) const 2998 { 2999 elfcpp::Sym_write<size, big_endian> osym(p); 3000 if (sym->version() == NULL || !parameters->options().relocatable()) 3001 osym.put_st_name(pool->get_offset(sym->name())); 3002 else 3003 osym.put_st_name(pool->get_offset(sym->versioned_name())); 3004 osym.put_st_value(value); 3005 // Use a symbol size of zero for undefined symbols from shared libraries. 3006 if (shndx == elfcpp::SHN_UNDEF && sym->is_from_dynobj()) 3007 osym.put_st_size(0); 3008 else 3009 osym.put_st_size(sym->symsize()); 3010 elfcpp::STT type = sym->type(); 3011 // Turn IFUNC symbols from shared libraries into normal FUNC symbols. 3012 if (type == elfcpp::STT_GNU_IFUNC 3013 && sym->is_from_dynobj()) 3014 type = elfcpp::STT_FUNC; 3015 // A version script may have overridden the default binding. 3016 if (sym->is_forced_local()) 3017 osym.put_st_info(elfcpp::elf_st_info(elfcpp::STB_LOCAL, type)); 3018 else 3019 osym.put_st_info(elfcpp::elf_st_info(binding, type)); 3020 osym.put_st_other(elfcpp::elf_st_other(sym->visibility(), sym->nonvis())); 3021 osym.put_st_shndx(shndx); 3022 } 3023 3024 // Check for unresolved symbols in shared libraries. This is 3025 // controlled by the --allow-shlib-undefined option. 3026 3027 // We only warn about libraries for which we have seen all the 3028 // DT_NEEDED entries. We don't try to track down DT_NEEDED entries 3029 // which were not seen in this link. If we didn't see a DT_NEEDED 3030 // entry, we aren't going to be able to reliably report whether the 3031 // symbol is undefined. 3032 3033 // We also don't warn about libraries found in a system library 3034 // directory (e.g., /lib or /usr/lib); we assume that those libraries 3035 // are OK. This heuristic avoids problems on GNU/Linux, in which -ldl 3036 // can have undefined references satisfied by ld-linux.so. 3037 3038 inline void 3039 Symbol_table::warn_about_undefined_dynobj_symbol(Symbol* sym) const 3040 { 3041 bool dummy; 3042 if (sym->source() == Symbol::FROM_OBJECT 3043 && sym->object()->is_dynamic() 3044 && sym->shndx(&dummy) == elfcpp::SHN_UNDEF 3045 && sym->binding() != elfcpp::STB_WEAK 3046 && !parameters->options().allow_shlib_undefined() 3047 && !parameters->target().is_defined_by_abi(sym) 3048 && !sym->object()->is_in_system_directory()) 3049 { 3050 // A very ugly cast. 3051 Dynobj* dynobj = static_cast<Dynobj*>(sym->object()); 3052 if (!dynobj->has_unknown_needed_entries()) 3053 gold_undefined_symbol(sym); 3054 } 3055 } 3056 3057 // Write out a section symbol. Return the update offset. 3058 3059 void 3060 Symbol_table::write_section_symbol(const Output_section* os, 3061 Output_symtab_xindex* symtab_xindex, 3062 Output_file* of, 3063 off_t offset) const 3064 { 3065 switch (parameters->size_and_endianness()) 3066 { 3067 #ifdef HAVE_TARGET_32_LITTLE 3068 case Parameters::TARGET_32_LITTLE: 3069 this->sized_write_section_symbol<32, false>(os, symtab_xindex, of, 3070 offset); 3071 break; 3072 #endif 3073 #ifdef HAVE_TARGET_32_BIG 3074 case Parameters::TARGET_32_BIG: 3075 this->sized_write_section_symbol<32, true>(os, symtab_xindex, of, 3076 offset); 3077 break; 3078 #endif 3079 #ifdef HAVE_TARGET_64_LITTLE 3080 case Parameters::TARGET_64_LITTLE: 3081 this->sized_write_section_symbol<64, false>(os, symtab_xindex, of, 3082 offset); 3083 break; 3084 #endif 3085 #ifdef HAVE_TARGET_64_BIG 3086 case Parameters::TARGET_64_BIG: 3087 this->sized_write_section_symbol<64, true>(os, symtab_xindex, of, 3088 offset); 3089 break; 3090 #endif 3091 default: 3092 gold_unreachable(); 3093 } 3094 } 3095 3096 // Write out a section symbol, specialized for size and endianness. 3097 3098 template<int size, bool big_endian> 3099 void 3100 Symbol_table::sized_write_section_symbol(const Output_section* os, 3101 Output_symtab_xindex* symtab_xindex, 3102 Output_file* of, 3103 off_t offset) const 3104 { 3105 const int sym_size = elfcpp::Elf_sizes<size>::sym_size; 3106 3107 unsigned char* pov = of->get_output_view(offset, sym_size); 3108 3109 elfcpp::Sym_write<size, big_endian> osym(pov); 3110 osym.put_st_name(0); 3111 if (parameters->options().relocatable()) 3112 osym.put_st_value(0); 3113 else 3114 osym.put_st_value(os->address()); 3115 osym.put_st_size(0); 3116 osym.put_st_info(elfcpp::elf_st_info(elfcpp::STB_LOCAL, 3117 elfcpp::STT_SECTION)); 3118 osym.put_st_other(elfcpp::elf_st_other(elfcpp::STV_DEFAULT, 0)); 3119 3120 unsigned int shndx = os->out_shndx(); 3121 if (shndx >= elfcpp::SHN_LORESERVE) 3122 { 3123 symtab_xindex->add(os->symtab_index(), shndx); 3124 shndx = elfcpp::SHN_XINDEX; 3125 } 3126 osym.put_st_shndx(shndx); 3127 3128 of->write_output_view(offset, sym_size, pov); 3129 } 3130 3131 // Print statistical information to stderr. This is used for --stats. 3132 3133 void 3134 Symbol_table::print_stats() const 3135 { 3136 #if defined(HAVE_TR1_UNORDERED_MAP) || defined(HAVE_EXT_HASH_MAP) 3137 fprintf(stderr, _("%s: symbol table entries: %zu; buckets: %zu\n"), 3138 program_name, this->table_.size(), this->table_.bucket_count()); 3139 #else 3140 fprintf(stderr, _("%s: symbol table entries: %zu\n"), 3141 program_name, this->table_.size()); 3142 #endif 3143 this->namepool_.print_stats("symbol table stringpool"); 3144 } 3145 3146 // We check for ODR violations by looking for symbols with the same 3147 // name for which the debugging information reports that they were 3148 // defined in disjoint source locations. When comparing the source 3149 // location, we consider instances with the same base filename to be 3150 // the same. This is because different object files/shared libraries 3151 // can include the same header file using different paths, and 3152 // different optimization settings can make the line number appear to 3153 // be a couple lines off, and we don't want to report an ODR violation 3154 // in those cases. 3155 3156 // This struct is used to compare line information, as returned by 3157 // Dwarf_line_info::one_addr2line. It implements a < comparison 3158 // operator used with std::sort. 3159 3160 struct Odr_violation_compare 3161 { 3162 bool 3163 operator()(const std::string& s1, const std::string& s2) const 3164 { 3165 // Inputs should be of the form "dirname/filename:linenum" where 3166 // "dirname/" is optional. We want to compare just the filename:linenum. 3167 3168 // Find the last '/' in each string. 3169 std::string::size_type s1begin = s1.rfind('/'); 3170 std::string::size_type s2begin = s2.rfind('/'); 3171 // If there was no '/' in a string, start at the beginning. 3172 if (s1begin == std::string::npos) 3173 s1begin = 0; 3174 if (s2begin == std::string::npos) 3175 s2begin = 0; 3176 return s1.compare(s1begin, std::string::npos, 3177 s2, s2begin, std::string::npos) < 0; 3178 } 3179 }; 3180 3181 // Returns all of the lines attached to LOC, not just the one the 3182 // instruction actually came from. 3183 std::vector<std::string> 3184 Symbol_table::linenos_from_loc(const Task* task, 3185 const Symbol_location& loc) 3186 { 3187 // We need to lock the object in order to read it. This 3188 // means that we have to run in a singleton Task. If we 3189 // want to run this in a general Task for better 3190 // performance, we will need one Task for object, plus 3191 // appropriate locking to ensure that we don't conflict with 3192 // other uses of the object. Also note, one_addr2line is not 3193 // currently thread-safe. 3194 Task_lock_obj<Object> tl(task, loc.object); 3195 3196 std::vector<std::string> result; 3197 // 16 is the size of the object-cache that one_addr2line should use. 3198 std::string canonical_result = Dwarf_line_info::one_addr2line( 3199 loc.object, loc.shndx, loc.offset, 16, &result); 3200 if (!canonical_result.empty()) 3201 result.push_back(canonical_result); 3202 return result; 3203 } 3204 3205 // OutputIterator that records if it was ever assigned to. This 3206 // allows it to be used with std::set_intersection() to check for 3207 // intersection rather than computing the intersection. 3208 struct Check_intersection 3209 { 3210 Check_intersection() 3211 : value_(false) 3212 {} 3213 3214 bool had_intersection() const 3215 { return this->value_; } 3216 3217 Check_intersection& operator++() 3218 { return *this; } 3219 3220 Check_intersection& operator*() 3221 { return *this; } 3222 3223 template<typename T> 3224 Check_intersection& operator=(const T&) 3225 { 3226 this->value_ = true; 3227 return *this; 3228 } 3229 3230 private: 3231 bool value_; 3232 }; 3233 3234 // Check candidate_odr_violations_ to find symbols with the same name 3235 // but apparently different definitions (different source-file/line-no 3236 // for each line assigned to the first instruction). 3237 3238 void 3239 Symbol_table::detect_odr_violations(const Task* task, 3240 const char* output_file_name) const 3241 { 3242 for (Odr_map::const_iterator it = candidate_odr_violations_.begin(); 3243 it != candidate_odr_violations_.end(); 3244 ++it) 3245 { 3246 const char* const symbol_name = it->first; 3247 3248 std::string first_object_name; 3249 std::vector<std::string> first_object_linenos; 3250 3251 Unordered_set<Symbol_location, Symbol_location_hash>::const_iterator 3252 locs = it->second.begin(); 3253 const Unordered_set<Symbol_location, Symbol_location_hash>::const_iterator 3254 locs_end = it->second.end(); 3255 for (; locs != locs_end && first_object_linenos.empty(); ++locs) 3256 { 3257 // Save the line numbers from the first definition to 3258 // compare to the other definitions. Ideally, we'd compare 3259 // every definition to every other, but we don't want to 3260 // take O(N^2) time to do this. This shortcut may cause 3261 // false negatives that appear or disappear depending on the 3262 // link order, but it won't cause false positives. 3263 first_object_name = locs->object->name(); 3264 first_object_linenos = this->linenos_from_loc(task, *locs); 3265 } 3266 3267 // Sort by Odr_violation_compare to make std::set_intersection work. 3268 std::sort(first_object_linenos.begin(), first_object_linenos.end(), 3269 Odr_violation_compare()); 3270 3271 for (; locs != locs_end; ++locs) 3272 { 3273 std::vector<std::string> linenos = 3274 this->linenos_from_loc(task, *locs); 3275 // linenos will be empty if we couldn't parse the debug info. 3276 if (linenos.empty()) 3277 continue; 3278 // Sort by Odr_violation_compare to make std::set_intersection work. 3279 std::sort(linenos.begin(), linenos.end(), Odr_violation_compare()); 3280 3281 Check_intersection intersection_result = 3282 std::set_intersection(first_object_linenos.begin(), 3283 first_object_linenos.end(), 3284 linenos.begin(), 3285 linenos.end(), 3286 Check_intersection(), 3287 Odr_violation_compare()); 3288 if (!intersection_result.had_intersection()) 3289 { 3290 gold_warning(_("while linking %s: symbol '%s' defined in " 3291 "multiple places (possible ODR violation):"), 3292 output_file_name, demangle(symbol_name).c_str()); 3293 // This only prints one location from each definition, 3294 // which may not be the location we expect to intersect 3295 // with another definition. We could print the whole 3296 // set of locations, but that seems too verbose. 3297 gold_assert(!first_object_linenos.empty()); 3298 gold_assert(!linenos.empty()); 3299 fprintf(stderr, _(" %s from %s\n"), 3300 first_object_linenos[0].c_str(), 3301 first_object_name.c_str()); 3302 fprintf(stderr, _(" %s from %s\n"), 3303 linenos[0].c_str(), 3304 locs->object->name().c_str()); 3305 // Only print one broken pair, to avoid needing to 3306 // compare against a list of the disjoint definition 3307 // locations we've found so far. (If we kept comparing 3308 // against just the first one, we'd get a lot of 3309 // redundant complaints about the second definition 3310 // location.) 3311 break; 3312 } 3313 } 3314 } 3315 // We only call one_addr2line() in this function, so we can clear its cache. 3316 Dwarf_line_info::clear_addr2line_cache(); 3317 } 3318 3319 // Warnings functions. 3320 3321 // Add a new warning. 3322 3323 void 3324 Warnings::add_warning(Symbol_table* symtab, const char* name, Object* obj, 3325 const std::string& warning) 3326 { 3327 name = symtab->canonicalize_name(name); 3328 this->warnings_[name].set(obj, warning); 3329 } 3330 3331 // Look through the warnings and mark the symbols for which we should 3332 // warn. This is called during Layout::finalize when we know the 3333 // sources for all the symbols. 3334 3335 void 3336 Warnings::note_warnings(Symbol_table* symtab) 3337 { 3338 for (Warning_table::iterator p = this->warnings_.begin(); 3339 p != this->warnings_.end(); 3340 ++p) 3341 { 3342 Symbol* sym = symtab->lookup(p->first, NULL); 3343 if (sym != NULL 3344 && sym->source() == Symbol::FROM_OBJECT 3345 && sym->object() == p->second.object) 3346 sym->set_has_warning(); 3347 } 3348 } 3349 3350 // Issue a warning. This is called when we see a relocation against a 3351 // symbol for which has a warning. 3352 3353 template<int size, bool big_endian> 3354 void 3355 Warnings::issue_warning(const Symbol* sym, 3356 const Relocate_info<size, big_endian>* relinfo, 3357 size_t relnum, off_t reloffset) const 3358 { 3359 gold_assert(sym->has_warning()); 3360 3361 // We don't want to issue a warning for a relocation against the 3362 // symbol in the same object file in which the symbol is defined. 3363 if (sym->object() == relinfo->object) 3364 return; 3365 3366 Warning_table::const_iterator p = this->warnings_.find(sym->name()); 3367 gold_assert(p != this->warnings_.end()); 3368 gold_warning_at_location(relinfo, relnum, reloffset, 3369 "%s", p->second.text.c_str()); 3370 } 3371 3372 // Instantiate the templates we need. We could use the configure 3373 // script to restrict this to only the ones needed for implemented 3374 // targets. 3375 3376 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG) 3377 template 3378 void 3379 Sized_symbol<32>::allocate_common(Output_data*, Value_type); 3380 #endif 3381 3382 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG) 3383 template 3384 void 3385 Sized_symbol<64>::allocate_common(Output_data*, Value_type); 3386 #endif 3387 3388 #ifdef HAVE_TARGET_32_LITTLE 3389 template 3390 void 3391 Symbol_table::add_from_relobj<32, false>( 3392 Sized_relobj_file<32, false>* relobj, 3393 const unsigned char* syms, 3394 size_t count, 3395 size_t symndx_offset, 3396 const char* sym_names, 3397 size_t sym_name_size, 3398 Sized_relobj_file<32, false>::Symbols* sympointers, 3399 size_t* defined); 3400 #endif 3401 3402 #ifdef HAVE_TARGET_32_BIG 3403 template 3404 void 3405 Symbol_table::add_from_relobj<32, true>( 3406 Sized_relobj_file<32, true>* relobj, 3407 const unsigned char* syms, 3408 size_t count, 3409 size_t symndx_offset, 3410 const char* sym_names, 3411 size_t sym_name_size, 3412 Sized_relobj_file<32, true>::Symbols* sympointers, 3413 size_t* defined); 3414 #endif 3415 3416 #ifdef HAVE_TARGET_64_LITTLE 3417 template 3418 void 3419 Symbol_table::add_from_relobj<64, false>( 3420 Sized_relobj_file<64, false>* relobj, 3421 const unsigned char* syms, 3422 size_t count, 3423 size_t symndx_offset, 3424 const char* sym_names, 3425 size_t sym_name_size, 3426 Sized_relobj_file<64, false>::Symbols* sympointers, 3427 size_t* defined); 3428 #endif 3429 3430 #ifdef HAVE_TARGET_64_BIG 3431 template 3432 void 3433 Symbol_table::add_from_relobj<64, true>( 3434 Sized_relobj_file<64, true>* relobj, 3435 const unsigned char* syms, 3436 size_t count, 3437 size_t symndx_offset, 3438 const char* sym_names, 3439 size_t sym_name_size, 3440 Sized_relobj_file<64, true>::Symbols* sympointers, 3441 size_t* defined); 3442 #endif 3443 3444 #ifdef HAVE_TARGET_32_LITTLE 3445 template 3446 Symbol* 3447 Symbol_table::add_from_pluginobj<32, false>( 3448 Sized_pluginobj<32, false>* obj, 3449 const char* name, 3450 const char* ver, 3451 elfcpp::Sym<32, false>* sym); 3452 #endif 3453 3454 #ifdef HAVE_TARGET_32_BIG 3455 template 3456 Symbol* 3457 Symbol_table::add_from_pluginobj<32, true>( 3458 Sized_pluginobj<32, true>* obj, 3459 const char* name, 3460 const char* ver, 3461 elfcpp::Sym<32, true>* sym); 3462 #endif 3463 3464 #ifdef HAVE_TARGET_64_LITTLE 3465 template 3466 Symbol* 3467 Symbol_table::add_from_pluginobj<64, false>( 3468 Sized_pluginobj<64, false>* obj, 3469 const char* name, 3470 const char* ver, 3471 elfcpp::Sym<64, false>* sym); 3472 #endif 3473 3474 #ifdef HAVE_TARGET_64_BIG 3475 template 3476 Symbol* 3477 Symbol_table::add_from_pluginobj<64, true>( 3478 Sized_pluginobj<64, true>* obj, 3479 const char* name, 3480 const char* ver, 3481 elfcpp::Sym<64, true>* sym); 3482 #endif 3483 3484 #ifdef HAVE_TARGET_32_LITTLE 3485 template 3486 void 3487 Symbol_table::add_from_dynobj<32, false>( 3488 Sized_dynobj<32, false>* dynobj, 3489 const unsigned char* syms, 3490 size_t count, 3491 const char* sym_names, 3492 size_t sym_name_size, 3493 const unsigned char* versym, 3494 size_t versym_size, 3495 const std::vector<const char*>* version_map, 3496 Sized_relobj_file<32, false>::Symbols* sympointers, 3497 size_t* defined); 3498 #endif 3499 3500 #ifdef HAVE_TARGET_32_BIG 3501 template 3502 void 3503 Symbol_table::add_from_dynobj<32, true>( 3504 Sized_dynobj<32, true>* dynobj, 3505 const unsigned char* syms, 3506 size_t count, 3507 const char* sym_names, 3508 size_t sym_name_size, 3509 const unsigned char* versym, 3510 size_t versym_size, 3511 const std::vector<const char*>* version_map, 3512 Sized_relobj_file<32, true>::Symbols* sympointers, 3513 size_t* defined); 3514 #endif 3515 3516 #ifdef HAVE_TARGET_64_LITTLE 3517 template 3518 void 3519 Symbol_table::add_from_dynobj<64, false>( 3520 Sized_dynobj<64, false>* dynobj, 3521 const unsigned char* syms, 3522 size_t count, 3523 const char* sym_names, 3524 size_t sym_name_size, 3525 const unsigned char* versym, 3526 size_t versym_size, 3527 const std::vector<const char*>* version_map, 3528 Sized_relobj_file<64, false>::Symbols* sympointers, 3529 size_t* defined); 3530 #endif 3531 3532 #ifdef HAVE_TARGET_64_BIG 3533 template 3534 void 3535 Symbol_table::add_from_dynobj<64, true>( 3536 Sized_dynobj<64, true>* dynobj, 3537 const unsigned char* syms, 3538 size_t count, 3539 const char* sym_names, 3540 size_t sym_name_size, 3541 const unsigned char* versym, 3542 size_t versym_size, 3543 const std::vector<const char*>* version_map, 3544 Sized_relobj_file<64, true>::Symbols* sympointers, 3545 size_t* defined); 3546 #endif 3547 3548 #ifdef HAVE_TARGET_32_LITTLE 3549 template 3550 Sized_symbol<32>* 3551 Symbol_table::add_from_incrobj( 3552 Object* obj, 3553 const char* name, 3554 const char* ver, 3555 elfcpp::Sym<32, false>* sym); 3556 #endif 3557 3558 #ifdef HAVE_TARGET_32_BIG 3559 template 3560 Sized_symbol<32>* 3561 Symbol_table::add_from_incrobj( 3562 Object* obj, 3563 const char* name, 3564 const char* ver, 3565 elfcpp::Sym<32, true>* sym); 3566 #endif 3567 3568 #ifdef HAVE_TARGET_64_LITTLE 3569 template 3570 Sized_symbol<64>* 3571 Symbol_table::add_from_incrobj( 3572 Object* obj, 3573 const char* name, 3574 const char* ver, 3575 elfcpp::Sym<64, false>* sym); 3576 #endif 3577 3578 #ifdef HAVE_TARGET_64_BIG 3579 template 3580 Sized_symbol<64>* 3581 Symbol_table::add_from_incrobj( 3582 Object* obj, 3583 const char* name, 3584 const char* ver, 3585 elfcpp::Sym<64, true>* sym); 3586 #endif 3587 3588 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG) 3589 template 3590 void 3591 Symbol_table::define_with_copy_reloc<32>( 3592 Sized_symbol<32>* sym, 3593 Output_data* posd, 3594 elfcpp::Elf_types<32>::Elf_Addr value); 3595 #endif 3596 3597 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG) 3598 template 3599 void 3600 Symbol_table::define_with_copy_reloc<64>( 3601 Sized_symbol<64>* sym, 3602 Output_data* posd, 3603 elfcpp::Elf_types<64>::Elf_Addr value); 3604 #endif 3605 3606 #ifdef HAVE_TARGET_32_LITTLE 3607 template 3608 void 3609 Warnings::issue_warning<32, false>(const Symbol* sym, 3610 const Relocate_info<32, false>* relinfo, 3611 size_t relnum, off_t reloffset) const; 3612 #endif 3613 3614 #ifdef HAVE_TARGET_32_BIG 3615 template 3616 void 3617 Warnings::issue_warning<32, true>(const Symbol* sym, 3618 const Relocate_info<32, true>* relinfo, 3619 size_t relnum, off_t reloffset) const; 3620 #endif 3621 3622 #ifdef HAVE_TARGET_64_LITTLE 3623 template 3624 void 3625 Warnings::issue_warning<64, false>(const Symbol* sym, 3626 const Relocate_info<64, false>* relinfo, 3627 size_t relnum, off_t reloffset) const; 3628 #endif 3629 3630 #ifdef HAVE_TARGET_64_BIG 3631 template 3632 void 3633 Warnings::issue_warning<64, true>(const Symbol* sym, 3634 const Relocate_info<64, true>* relinfo, 3635 size_t relnum, off_t reloffset) const; 3636 #endif 3637 3638 } // End namespace gold. 3639