X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Fsymtab.h;h=e355b2a75cd6b89d1a6e3c823b42259f7a1fb1b6;hb=43bb514a1cc9641dfdb0f3ac20de48e2c17c0135;hp=1a81fd11ed8f8ecb5705b0109d9f47b6aa88c350;hpb=114dfbe13efea1a1405dbcf5d9254e59d309382f;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/symtab.h b/gold/symtab.h index 1a81fd11ed..e355b2a75c 100644 --- a/gold/symtab.h +++ b/gold/symtab.h @@ -227,6 +227,23 @@ class Symbol void override_visibility(elfcpp::STV); + // Set whether the symbol was originally a weak undef or a regular undef + // when resolved by a dynamic def. + inline void + set_undef_binding(elfcpp::STB bind) + { + if (!this->undef_binding_set_ || this->undef_binding_weak_) + { + this->undef_binding_weak_ = bind == elfcpp::STB_WEAK; + this->undef_binding_set_ = true; + } + } + + // Return TRUE if a weak undef was resolved by a dynamic def. + inline bool + is_undef_binding_weak() const + { return this->undef_binding_weak_; } + // Return the non-visibility part of the st_other field. unsigned char nonvis() const @@ -274,7 +291,7 @@ class Symbol // Return whether this symbol should be added to the dynamic symbol // table. bool - should_add_dynsym_entry() const; + should_add_dynsym_entry(Symbol_table*) const; // Return whether this symbol has been seen in a regular object. bool @@ -392,6 +409,11 @@ class Symbol set_got_offset(unsigned int got_type, unsigned int got_offset) { this->got_offsets_.set_offset(got_type, got_offset); } + // Return the GOT offset list. + const Got_offset_list* + got_offset_list() const + { return this->got_offsets_.get_list(); } + // Return whether this symbol has an entry in the PLT section. bool has_plt_offset() const @@ -459,6 +481,13 @@ class Symbol return this->source_ == FROM_OBJECT && this->object()->is_dynamic(); } + // Return whether this is a placeholder symbol from a plugin object. + bool + is_placeholder() const + { + return this->source_ == FROM_OBJECT && this->object()->pluginobj() != NULL; + } + // Return whether this is an undefined symbol. bool is_undefined() const @@ -553,9 +582,6 @@ class Symbol } // Return true if this symbol is a function that needs a PLT entry. - // If the symbol is defined in a dynamic object or if it is subject - // to pre-emption, we need to make a PLT entry. If we're doing a - // static link or a -pie link, we don't create PLT entries. bool needs_plt_entry() const { @@ -563,12 +589,27 @@ class Symbol if (this->is_undefined() && !parameters->options().shared()) return false; - return (!parameters->doing_static_link() - && !parameters->options().pie() - && this->is_func() - && (this->is_from_dynobj() - || this->is_undefined() - || this->is_preemptible())); + // An STT_GNU_IFUNC symbol always needs a PLT entry, even when + // doing a static link. + if (this->type() == elfcpp::STT_GNU_IFUNC) + return true; + + // We only need a PLT entry for a function. + if (!this->is_func()) + return false; + + // If we're doing a static link or a -pie link, we don't create + // PLT entries. + if (parameters->doing_static_link() + || parameters->options().pie()) + return false; + + // We need a PLT entry if the function is defined in a dynamic + // object, or is undefined when building a shared object, or if it + // is subject to pre-emption. + return (this->is_from_dynobj() + || this->is_undefined() + || this->is_preemptible()); } // When determining whether a reference to a symbol needs a dynamic @@ -616,7 +657,8 @@ class Symbol // shared library cannot use a PLT entry. if ((flags & FUNCTION_CALL) && this->has_plt_offset() - && !((flags & NON_PIC_REF) && parameters->options().shared())) + && !((flags & NON_PIC_REF) + && parameters->options().output_is_position_independent())) return false; // A reference to any PLT entry in a non-position-independent executable @@ -649,6 +691,10 @@ class Symbol if (!this->has_plt_offset()) return false; + // For a STT_GNU_IFUNC symbol we always have to use the PLT entry. + if (this->type() == elfcpp::STT_GNU_IFUNC) + return true; + // If we are going to generate a dynamic relocation, then we will // wind up using that, so no need to use the PLT entry. if (this->needs_dynamic_reloc(FUNCTION_CALL @@ -753,7 +799,7 @@ class Symbol bool may_need_copy_reloc() const { - return (!parameters->options().shared() + return (!parameters->options().output_is_position_independent() && parameters->options().copyreloc() && this->is_from_dynobj() && !this->is_func()); @@ -776,7 +822,7 @@ class Symbol // index rather than a special code. template void - init_base_object(const char *name, const char* version, Object* object, + init_base_object(const char* name, const char* version, Object* object, const elfcpp::Sym&, unsigned int st_shndx, bool is_ordinary); @@ -942,6 +988,11 @@ class Symbol // True if this symbol is defined in a section which was discarded // (bit 31). bool is_defined_in_discarded_section_ : 1; + // 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). + bool undef_binding_weak_ : 1; }; // The parts of a symbol which are size specific. Using a template @@ -962,7 +1013,7 @@ class Sized_symbol : public Symbol // index rather than a special code. template void - init_object(const char *name, const char* version, Object* object, + init_object(const char* name, const char* version, Object* object, const elfcpp::Sym&, unsigned int st_shndx, bool is_ordinary); @@ -1240,7 +1291,7 @@ class Symbol_table // During garbage collection, this keeps undefined symbols. void - gc_mark_undef_symbols(); + gc_mark_undef_symbols(Layout*); // During garbage collection, this ensures externally visible symbols // are not treated as garbage while building shared objects. @@ -1390,7 +1441,7 @@ class Symbol_table // Add any undefined symbols named on the command line to the symbol // table. void - add_undefined_symbols_from_command_line(); + add_undefined_symbols_from_command_line(Layout*); // SYM is defined using a COPY reloc. Return the dynamic object // where the original definition was found. @@ -1417,7 +1468,7 @@ class Symbol_table // local symbols. off_t finalize(off_t off, off_t dynoff, size_t dyn_global_index, size_t dyncount, - Stringpool* pool, unsigned int *plocal_symcount); + Stringpool* pool, unsigned int* plocal_symcount); // Status code of Symbol_table::compute_final_value. enum Compute_final_value_status @@ -1439,6 +1490,16 @@ class Symbol_table compute_final_value(const Sized_symbol* sym, Compute_final_value_status* pstatus) const; + // Return the index of the first global symbol. + unsigned int + first_global_index() const + { return this->first_global_index_; } + + // Return the total number of symbols in the symbol table. + unsigned int + output_count() const + { return this->output_count_; } + // Write out the global symbols. void write_globals(const Stringpool*, const Stringpool*, @@ -1450,6 +1511,20 @@ class Symbol_table write_section_symbol(const Output_section*, Output_symtab_xindex*, Output_file*, off_t) const; + // Loop over all symbols, applying the function F to each. + template + void + for_all_symbols(F f) const + { + for (Symbol_table_type::const_iterator p = this->table_.begin(); + p != this->table_.end(); + ++p) + { + Sized_symbol* sym = static_cast*>(p->second); + f(sym); + } + } + // Dump statistical information to stderr. void print_stats() const; @@ -1492,8 +1567,8 @@ class Symbol_table // Add a symbol. template Sized_symbol* - add_from_object(Object*, const char *name, Stringpool::Key name_key, - const char *version, Stringpool::Key version_key, + add_from_object(Object*, const char* name, Stringpool::Key name_key, + const char* version, Stringpool::Key version_key, bool def, const elfcpp::Sym& sym, unsigned int st_shndx, bool is_ordinary, unsigned int orig_st_shndx); @@ -1529,7 +1604,7 @@ class Symbol_table // Whether we should override a symbol, based on flags in // resolve.cc. static bool - should_override(const Symbol*, unsigned int, Defined, Object*, bool*); + should_override(const Symbol*, unsigned int, Defined, Object*, bool*, bool*); // Report a problem in symbol resolution. static void @@ -1604,7 +1679,12 @@ class Symbol_table // table, sized version. template void - do_add_undefined_symbols_from_command_line(); + do_add_undefined_symbols_from_command_line(Layout*); + + // Add one undefined symbol. + template + void + add_undefined_symbol_from_command_line(const char* name); // Types of common symbols. @@ -1660,7 +1740,7 @@ class Symbol_table void sized_write_symbol(Sized_symbol*, typename elfcpp::Elf_types::Elf_Addr value, - unsigned int shndx, + unsigned int shndx, elfcpp::STB, const Stringpool*, unsigned char* p) const; // Possibly warn about an undefined symbol from a dynamic object.