diff options
Diffstat (limited to 'binutils-2.25/gold/symtab.h')
-rw-r--r-- | binutils-2.25/gold/symtab.h | 67 |
1 files changed, 56 insertions, 11 deletions
diff --git a/binutils-2.25/gold/symtab.h b/binutils-2.25/gold/symtab.h index 9299ea8a..7984dd6f 100644 --- a/binutils-2.25/gold/symtab.h +++ b/binutils-2.25/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-2014 Free Software Foundation, Inc. // Written by Ian Lance Taylor <iant@google.com>. // This file is part of gold. @@ -215,6 +215,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 @@ -238,7 +243,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) { @@ -249,7 +254,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_; } @@ -259,6 +265,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. @@ -512,7 +523,20 @@ 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())); + } + + // 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()); + } // Return whether this is an absolute symbol. bool @@ -576,8 +600,14 @@ class Symbol if (!parameters->options().shared()) return false; - // If the user used -Bsymbolic, then nothing is preemptible. - if (parameters->options().Bsymbolic()) + // 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 or provided a --dynamic-list script, + // then nothing (else) is preemptible. + if (parameters->options().Bsymbolic() + || parameters->options().have_dynamic_list()) return false; // If the user used -Bsymbolic-functions, then functions are not @@ -638,7 +668,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 @@ -675,7 +708,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; @@ -767,6 +801,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 @@ -806,8 +852,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()); } @@ -1015,7 +1060,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; |