X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fsymtab.h;h=1a1f1c78633b76d05224f5d6ec6878b931a8d8a7;hb=55c144e691ec05a7b8231b5c58dc6d6659a1c4eb;hp=040be95431238b3a533b9bae8b95a842738db647;hpb=dc3714f31f5b15f9c078dcf7ddaa705dacd313c0;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/symtab.h b/gold/symtab.h index 040be95431..1a1f1c7863 100644 --- a/gold/symtab.h +++ b/gold/symtab.h @@ -1,6 +1,6 @@ // symtab.h -- the gold symbol table -*- C++ -*- -// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +// Copyright (C) 2006-2015 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -121,6 +121,10 @@ class Symbol version() const { return this->version_; } + void + clear_version() + { this->version_ = NULL; } + // Return whether this version is the default for this symbol name // (eg, "foo@@V2" is a default version; "foo@V1" is not). Only // meaningful for versioned symbols. @@ -136,6 +140,11 @@ class Symbol set_is_default() { this->is_def_ = true; } + // Set that this version is not the default for this symbol name. + void + set_is_not_default() + { this->is_def_ = false; } + // Return the symbol's name as name@version (or name@@version). std::string versioned_name() const; @@ -211,6 +220,11 @@ class Symbol type() const { return this->type_; } + // Set the symbol type. + void + set_type(elfcpp::STT type) + { this->type_ = type; } + // Return true for function symbol. bool is_func() const @@ -234,7 +248,7 @@ class Symbol override_visibility(elfcpp::STV); // Set whether the symbol was originally a weak undef or a regular undef - // when resolved by a dynamic def. + // when resolved by a dynamic def or by a special symbol. inline void set_undef_binding(elfcpp::STB bind) { @@ -245,7 +259,8 @@ class Symbol } } - // Return TRUE if a weak undef was resolved by a dynamic def. + // Return TRUE if a weak undef was resolved by a dynamic def or + // by a special symbol. inline bool is_undef_binding_weak() const { return this->undef_binding_weak_; } @@ -255,6 +270,11 @@ class Symbol nonvis() const { return this->nonvis_; } + // Set the non-visibility part of the st_other field. + void + set_nonvis(unsigned int nonvis) + { this->nonvis_ = nonvis; } + // Return whether this symbol is a forwarder. This will never be // true of a symbol found in the hash table, but may be true of // symbol pointers attached to object files. @@ -508,7 +528,22 @@ class Symbol // Return whether this is a weak undefined symbol. bool is_weak_undefined() const - { return this->is_undefined() && this->binding() == elfcpp::STB_WEAK; } + { + return (this->is_undefined() + && (this->binding() == elfcpp::STB_WEAK + || this->is_undef_binding_weak() + || parameters->options().weak_unresolved_symbols())); + } + + // Return whether this is a strong undefined symbol. + bool + is_strong_undefined() const + { + return (this->is_undefined() + && this->binding() != elfcpp::STB_WEAK + && !this->is_undef_binding_weak() + && !parameters->options().weak_unresolved_symbols()); + } // Return whether this is an absolute symbol. bool @@ -527,8 +562,6 @@ class Symbol { if (this->source_ != FROM_OBJECT) return false; - if (this->type_ == elfcpp::STT_COMMON) - return true; bool is_ordinary; unsigned int shndx = this->shndx(&is_ordinary); return !is_ordinary && Symbol::is_common_shndx(shndx); @@ -572,7 +605,11 @@ class Symbol if (!parameters->options().shared()) return false; - // If the user used -Bsymbolic, then nothing is preemptible. + // If the symbol was named in a --dynamic-list script, it is preemptible. + if (parameters->options().in_dynamic_list(this->name())) + return true; + + // If the user used -Bsymbolic, then nothing (else) is preemptible. if (parameters->options().Bsymbolic()) return false; @@ -634,7 +671,10 @@ class Symbol // A TLS-related reference. TLS_REF = 4, // A reference that can always be treated as a function call. - FUNCTION_CALL = 8 + FUNCTION_CALL = 8, + // When set, says that dynamic relocations are needed even if a + // symbol has a plt entry. + FUNC_DESC_ABI = 16, }; // Given a direct absolute or pc-relative static relocation against @@ -671,7 +711,8 @@ class Symbol // A reference to any PLT entry in a non-position-independent executable // does not need a dynamic relocation. - if (!parameters->options().output_is_position_independent() + if (!(flags & FUNC_DESC_ABI) + && !parameters->options().output_is_position_independent() && this->has_plt_offset()) return false; @@ -763,6 +804,18 @@ class Symbol void set_output_section(Output_section*); + // Set the symbol's output segment. This is used for pre-defined + // symbols whose segments aren't known until after layout is done + // (e.g., __ehdr_start). + void + set_output_segment(Output_segment*, Segment_offset_base); + + // Set the symbol to undefined. This is used for pre-defined + // symbols whose segments aren't known until after layout is done + // (e.g., __ehdr_start). + void + set_undefined(); + // Return whether there should be a warning for references to this // symbol. bool @@ -802,8 +855,7 @@ class Symbol bool may_need_copy_reloc() const { - return (!parameters->options().output_is_position_independent() - && parameters->options().copyreloc() + return (parameters->options().copyreloc() && this->is_from_dynobj() && !this->is_func()); } @@ -813,6 +865,11 @@ class Symbol is_predefined() const { return this->is_predefined_; } + // Return true if this is a C++ vtable symbol. + bool + is_cxx_vtable() const + { return is_prefix_of("_ZTV", this->name_); } + protected: // Instances of this class should always be created at a specific // size. @@ -1006,7 +1063,7 @@ class Symbol // True if UNDEF_BINDING_WEAK_ has been set (bit 32). bool undef_binding_set_ : 1; // True if this symbol was a weak undef resolved by a dynamic def - // (bit 33). + // or by a special symbol (bit 33). bool undef_binding_weak_ : 1; // True if this symbol is a predefined linker symbol (bit 34). bool is_predefined_ : 1; @@ -1318,7 +1375,7 @@ class Symbol_table // Returns true if ICF determined that this is a duplicate section. bool - is_section_folded(Object* obj, unsigned int shndx) const; + is_section_folded(Relobj* obj, unsigned int shndx) const; void set_gc(Garbage_collection* gc) @@ -1654,7 +1711,8 @@ class Symbol_table const elfcpp::Sym& sym, unsigned int st_shndx, bool is_ordinary, unsigned int orig_st_shndx, - Object*, const char* version); + Object*, const char* version, + bool is_default_version); template void @@ -1673,7 +1731,7 @@ class Symbol_table // resolve.cc. static bool should_override(const Symbol*, unsigned int, elfcpp::STT, Defined, - Object*, bool*, bool*); + Object*, bool*, bool*, bool); // Report a problem in symbol resolution. static void