diff options
author | Ian Lance Taylor <iant@google.com> | 2007-11-14 07:52:21 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-11-14 07:52:21 +0000 |
commit | 3728821ffcf74858b028948e224e1dc4695d9112 (patch) | |
tree | 33789e7f02b4a7cece4de72bc9ceb1381dbc34bf /gold | |
parent | e2827e5f525574e8620bd43c8bcb27dba3407a7f (diff) | |
download | gdb-3728821ffcf74858b028948e224e1dc4695d9112.zip gdb-3728821ffcf74858b028948e224e1dc4695d9112.tar.gz gdb-3728821ffcf74858b028948e224e1dc4695d9112.tar.bz2 |
Support special always-defined symbols for targets.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/i386.cc | 5 | ||||
-rw-r--r-- | gold/symtab.cc | 3 | ||||
-rw-r--r-- | gold/target.h | 13 | ||||
-rw-r--r-- | gold/x86_64.cc | 5 |
4 files changed, 25 insertions, 1 deletions
diff --git a/gold/i386.cc b/gold/i386.cc index eae6b7f..9b90c79 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -84,6 +84,11 @@ class Target_i386 : public Sized_target<32, false> uint64_t 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. void relocate_section(const Relocate_info<32, false>*, diff --git a/gold/symtab.cc b/gold/symtab.cc index f5e2132..2443023 100644 --- a/gold/symtab.cc +++ b/gold/symtab.cc @@ -1610,7 +1610,8 @@ Symbol_table::sized_write_globals(const Target* target, && sym->object()->is_dynamic() && sym->shndx() == elfcpp::SHN_UNDEF && sym->binding() != elfcpp::STB_WEAK - && !parameters->allow_shlib_undefined()) + && !parameters->allow_shlib_undefined() + && !target->is_always_defined(sym)) { // A very ugly cast. Dynobj* dynobj = static_cast<Dynobj*>(sym->object()); diff --git a/gold/target.h b/gold/target.h index 8ecc078..33c351c 100644 --- a/gold/target.h +++ b/gold/target.h @@ -137,6 +137,13 @@ class Target code_fill(off_t 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: // This struct holds the constant information for a child class. We // use a struct to avoid the overhead of virtual function calls for @@ -188,6 +195,12 @@ class Target do_code_fill(off_t) { 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: Target(const Target&); Target& operator=(const Target&); diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 0614e89..ead93d9 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -97,6 +97,11 @@ class Target_x86_64 : public Sized_target<64, false> uint64_t 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. void relocate_section(const Relocate_info<64, false>*, |