Line 801... |
Line 801... |
&& parameters->options().copyreloc()
|
&& parameters->options().copyreloc()
|
&& this->is_from_dynobj()
|
&& this->is_from_dynobj()
|
&& !this->is_func());
|
&& !this->is_func());
|
}
|
}
|
|
|
|
// Return true if this symbol was predefined by the linker.
|
|
bool
|
|
is_predefined() const
|
|
{ return this->is_predefined_; }
|
|
|
protected:
|
protected:
|
// Instances of this class should always be created at a specific
|
// Instances of this class should always be created at a specific
|
// size.
|
// size.
|
Symbol()
|
Symbol()
|
{ memset(this, 0, sizeof *this); }
|
{ memset(this, 0, sizeof *this); }
|
Line 826... |
Line 831... |
|
|
// Initialize fields for an Output_data.
|
// Initialize fields for an Output_data.
|
void
|
void
|
init_base_output_data(const char* name, const char* version, Output_data*,
|
init_base_output_data(const char* name, const char* version, Output_data*,
|
elfcpp::STT, elfcpp::STB, elfcpp::STV,
|
elfcpp::STT, elfcpp::STB, elfcpp::STV,
|
unsigned char nonvis, bool offset_is_from_end);
|
unsigned char nonvis, bool offset_is_from_end,
|
|
bool is_predefined);
|
|
|
// Initialize fields for an Output_segment.
|
// Initialize fields for an Output_segment.
|
void
|
void
|
init_base_output_segment(const char* name, const char* version,
|
init_base_output_segment(const char* name, const char* version,
|
Output_segment* os, elfcpp::STT type,
|
Output_segment* os, elfcpp::STT type,
|
elfcpp::STB binding, elfcpp::STV visibility,
|
elfcpp::STB binding, elfcpp::STV visibility,
|
unsigned char nonvis,
|
unsigned char nonvis,
|
Segment_offset_base offset_base);
|
Segment_offset_base offset_base,
|
|
bool is_predefined);
|
|
|
// Initialize fields for a constant.
|
// Initialize fields for a constant.
|
void
|
void
|
init_base_constant(const char* name, const char* version, elfcpp::STT type,
|
init_base_constant(const char* name, const char* version, elfcpp::STT type,
|
elfcpp::STB binding, elfcpp::STV visibility,
|
elfcpp::STB binding, elfcpp::STV visibility,
|
unsigned char nonvis);
|
unsigned char nonvis, bool is_predefined);
|
|
|
// Initialize fields for an undefined symbol.
|
// Initialize fields for an undefined symbol.
|
void
|
void
|
init_base_undefined(const char* name, const char* version, elfcpp::STT type,
|
init_base_undefined(const char* name, const char* version, elfcpp::STT type,
|
elfcpp::STB binding, elfcpp::STV visibility,
|
elfcpp::STB binding, elfcpp::STV visibility,
|
Line 989... |
Line 996... |
// True if UNDEF_BINDING_WEAK_ has been set (bit 32).
|
// True if UNDEF_BINDING_WEAK_ has been set (bit 32).
|
bool undef_binding_set_ : 1;
|
bool undef_binding_set_ : 1;
|
// True if this symbol was a weak undef resolved by a dynamic def
|
// True if this symbol was a weak undef resolved by a dynamic def
|
// (bit 33).
|
// (bit 33).
|
bool undef_binding_weak_ : 1;
|
bool undef_binding_weak_ : 1;
|
|
// True if this symbol is a predefined linker symbol (bit 34).
|
|
bool is_predefined_ : 1;
|
};
|
};
|
|
|
// The parts of a symbol which are size specific. Using a template
|
// The parts of a symbol which are size specific. Using a template
|
// derived class like this helps us use less space on a 32-bit system.
|
// derived class like this helps us use less space on a 32-bit system.
|
|
|
Line 1018... |
Line 1027... |
// Initialize fields for an Output_data.
|
// Initialize fields for an Output_data.
|
void
|
void
|
init_output_data(const char* name, const char* version, Output_data*,
|
init_output_data(const char* name, const char* version, Output_data*,
|
Value_type value, Size_type symsize, elfcpp::STT,
|
Value_type value, Size_type symsize, elfcpp::STT,
|
elfcpp::STB, elfcpp::STV, unsigned char nonvis,
|
elfcpp::STB, elfcpp::STV, unsigned char nonvis,
|
bool offset_is_from_end);
|
bool offset_is_from_end, bool is_predefined);
|
|
|
// Initialize fields for an Output_segment.
|
// Initialize fields for an Output_segment.
|
void
|
void
|
init_output_segment(const char* name, const char* version, Output_segment*,
|
init_output_segment(const char* name, const char* version, Output_segment*,
|
Value_type value, Size_type symsize, elfcpp::STT,
|
Value_type value, Size_type symsize, elfcpp::STT,
|
elfcpp::STB, elfcpp::STV, unsigned char nonvis,
|
elfcpp::STB, elfcpp::STV, unsigned char nonvis,
|
Segment_offset_base offset_base);
|
Segment_offset_base offset_base, bool is_predefined);
|
|
|
// Initialize fields for a constant.
|
// Initialize fields for a constant.
|
void
|
void
|
init_constant(const char* name, const char* version, Value_type value,
|
init_constant(const char* name, const char* version, Value_type value,
|
Size_type symsize, elfcpp::STT, elfcpp::STB, elfcpp::STV,
|
Size_type symsize, elfcpp::STT, elfcpp::STB, elfcpp::STV,
|
unsigned char nonvis);
|
unsigned char nonvis, bool is_predefined);
|
|
|
// Initialize fields for an undefined symbol.
|
// Initialize fields for an undefined symbol.
|
void
|
void
|
init_undefined(const char* name, const char* version, elfcpp::STT,
|
init_undefined(const char* name, const char* version, elfcpp::STT,
|
elfcpp::STB, elfcpp::STV, unsigned char nonvis);
|
elfcpp::STB, elfcpp::STV, unsigned char nonvis);
|
Line 1248... |
Line 1257... |
UNDEFINED,
|
UNDEFINED,
|
// Defined in a linker script.
|
// Defined in a linker script.
|
SCRIPT,
|
SCRIPT,
|
// Predefined by the linker.
|
// Predefined by the linker.
|
PREDEFINED,
|
PREDEFINED,
|
|
// Defined by the linker during an incremental base link, but not
|
|
// a predefined symbol (e.g., common, defined in script).
|
|
INCREMENTAL_BASE,
|
};
|
};
|
|
|
// The order in which we sort common symbols.
|
// The order in which we sort common symbols.
|
enum Sort_commons_order
|
enum Sort_commons_order
|
{
|
{
|
Line 1339... |
Line 1351... |
size_t* defined);
|
size_t* defined);
|
|
|
// Add one external symbol from the incremental object OBJ to the symbol
|
// Add one external symbol from the incremental object OBJ to the symbol
|
// table. Returns a pointer to the resolved symbol in the symbol table.
|
// table. Returns a pointer to the resolved symbol in the symbol table.
|
template<int size, bool big_endian>
|
template<int size, bool big_endian>
|
Symbol*
|
Sized_symbol<size>*
|
add_from_incrobj(Object* obj, const char* name,
|
add_from_incrobj(Object* obj, const char* name,
|
const char* ver, elfcpp::Sym<size, big_endian>* sym);
|
const char* ver, elfcpp::Sym<size, big_endian>* sym);
|
|
|
// Define a special symbol based on an Output_data. It is a
|
// Define a special symbol based on an Output_data. It is a
|
// multiple definition error if this symbol is already defined.
|
// multiple definition error if this symbol is already defined.
|