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