Support special always-defined symbols for targets.

This commit is contained in:
Ian Lance Taylor 2007-11-14 07:52:21 +00:00
parent e2827e5f52
commit 3728821ffc
4 changed files with 25 additions and 1 deletions

View File

@ -84,6 +84,11 @@ class Target_i386 : public Sized_target<32, false>
uint64_t uint64_t
do_dynsym_value(const Symbol*) const; do_dynsym_value(const Symbol*) const;
// Return whether SYM is always defined.
bool
do_is_always_defined(Symbol* sym) const
{ return strcmp(sym->name(), "___tls_get_addr") == 0; }
// Relocate a section. // Relocate a section.
void void
relocate_section(const Relocate_info<32, false>*, relocate_section(const Relocate_info<32, false>*,

View File

@ -1610,7 +1610,8 @@ Symbol_table::sized_write_globals(const Target* target,
&& sym->object()->is_dynamic() && sym->object()->is_dynamic()
&& sym->shndx() == elfcpp::SHN_UNDEF && sym->shndx() == elfcpp::SHN_UNDEF
&& sym->binding() != elfcpp::STB_WEAK && sym->binding() != elfcpp::STB_WEAK
&& !parameters->allow_shlib_undefined()) && !parameters->allow_shlib_undefined()
&& !target->is_always_defined(sym))
{ {
// A very ugly cast. // A very ugly cast.
Dynobj* dynobj = static_cast<Dynobj*>(sym->object()); Dynobj* dynobj = static_cast<Dynobj*>(sym->object());

View File

@ -137,6 +137,13 @@ class Target
code_fill(off_t length) code_fill(off_t length)
{ return this->do_code_fill(length); } { return this->do_code_fill(length); }
// Return whether SYM is a special symbol which is known to be
// defined. This is used to avoid inappropriate warnings about
// undefined symbols.
bool
is_always_defined(Symbol* sym) const
{ return this->do_is_always_defined(sym); }
protected: protected:
// This struct holds the constant information for a child class. We // This struct holds the constant information for a child class. We
// use a struct to avoid the overhead of virtual function calls for // use a struct to avoid the overhead of virtual function calls for
@ -188,6 +195,12 @@ class Target
do_code_fill(off_t) do_code_fill(off_t)
{ gold_unreachable(); } { gold_unreachable(); }
// Virtual function which may be implemented by the child class if
// needed.
virtual bool
do_is_always_defined(Symbol*) const
{ return false; }
private: private:
Target(const Target&); Target(const Target&);
Target& operator=(const Target&); Target& operator=(const Target&);

View File

@ -97,6 +97,11 @@ class Target_x86_64 : public Sized_target<64, false>
uint64_t uint64_t
do_dynsym_value(const Symbol*) const; do_dynsym_value(const Symbol*) const;
// Return whether SYM is always defined.
bool
do_is_always_defined(Symbol* sym) const
{ return strcmp(sym->name(), "__tls_get_addr") == 0; }
// Relocate a section. // Relocate a section.
void void
relocate_section(const Relocate_info<64, false>*, relocate_section(const Relocate_info<64, false>*,