X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fsymtab.h;h=b26b4e04a6e4b4ab7dff20fcfe3a58c731958d2a;hb=7229b687db8c5fe9c1534b763dea6d1211ff3993;hp=b6366d4c9d2747529862e8e2930e002d1a61ae85;hpb=d1bddd3c4b9c17736bf6c59aa336670a589ca844;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/symtab.h b/gold/symtab.h index b6366d4c9d..b26b4e04a6 100644 --- a/gold/symtab.h +++ b/gold/symtab.h @@ -1,6 +1,6 @@ // symtab.h -- the gold symbol table -*- C++ -*- -// Copyright (C) 2006-2014 Free Software Foundation, Inc. +// Copyright (C) 2006-2016 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -140,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; @@ -215,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 @@ -521,7 +531,8 @@ class Symbol { return (this->is_undefined() && (this->binding() == elfcpp::STB_WEAK - || this->is_undef_binding_weak())); + || this->is_undef_binding_weak() + || parameters->options().weak_unresolved_symbols())); } // Return whether this is a strong undefined symbol. @@ -530,7 +541,8 @@ class Symbol { return (this->is_undefined() && this->binding() != elfcpp::STB_WEAK - && !this->is_undef_binding_weak()); + && !this->is_undef_binding_weak() + && !parameters->options().weak_unresolved_symbols()); } // Return whether this is an absolute symbol. @@ -550,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); @@ -599,10 +609,8 @@ class Symbol if (parameters->options().in_dynamic_list(this->name())) return true; - // If the user used -Bsymbolic or provided a --dynamic-list script, - // then nothing (else) is preemptible. - if (parameters->options().Bsymbolic() - || parameters->options().have_dynamic_list()) + // If the user used -Bsymbolic, then nothing (else) is preemptible. + if (parameters->options().Bsymbolic()) return false; // If the user used -Bsymbolic-functions, then functions are not @@ -847,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()); } @@ -863,6 +870,19 @@ class Symbol is_cxx_vtable() const { return is_prefix_of("_ZTV", this->name_); } + // Return true if this symbol is protected in a shared object. + // This is not the same as checking if visibility() == elfcpp::STV_PROTECTED, + // because the visibility_ field reflects the symbol's visibility from + // outside the shared object. + bool + is_protected() const + { return this->is_protected_; } + + // Mark this symbol as protected in a shared object. + void + set_is_protected() + { this->is_protected_ = true; } + protected: // Instances of this class should always be created at a specific // size. @@ -1060,6 +1080,10 @@ class Symbol bool undef_binding_weak_ : 1; // True if this symbol is a predefined linker symbol (bit 34). bool is_predefined_ : 1; + // True if this symbol has protected visibility in a shared object (bit 35). + // The visibility_ field will be STV_DEFAULT in this case because we + // must treat it as such from outside the shared object. + bool is_protected_ : 1; }; // The parts of a symbol which are size specific. Using a template @@ -1106,8 +1130,8 @@ class Sized_symbol : public Symbol // Initialize fields for an undefined symbol. void - init_undefined(const char* name, const char* version, elfcpp::STT, - elfcpp::STB, elfcpp::STV, unsigned char nonvis); + init_undefined(const char* name, const char* version, Value_type value, + elfcpp::STT, elfcpp::STB, elfcpp::STV, unsigned char nonvis); // Override existing symbol. template @@ -1368,7 +1392,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) @@ -1474,6 +1498,12 @@ class Symbol_table define_symbols(const Layout*, int count, const Define_symbol_in_segment*, bool only_if_ref); + // Add a target-specific global symbol. + // (Used by SPARC backend to add STT_SPARC_REGISTER symbols.) + void + add_target_global_symbol(Symbol* sym) + { this->target_symbols_.push_back(sym); } + // Define SYM using a COPY reloc. POSD is the Output_data where the // symbol should be defined--typically a .dyn.bss section. VALUE is // the offset within POSD. @@ -1704,7 +1734,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 @@ -1723,7 +1754,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 @@ -1943,6 +1974,8 @@ class Symbol_table const Version_script_info& version_script_; Garbage_collection* gc_; Icf* icf_; + // Target-specific symbols, if any. + std::vector target_symbols_; }; // We inline get_sized_symbol for efficiency.