From 3728821ffcf74858b028948e224e1dc4695d9112 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 14 Nov 2007 07:52:21 +0000 Subject: Support special always-defined symbols for targets. --- gold/i386.cc | 5 +++++ gold/symtab.cc | 3 ++- gold/target.h | 13 +++++++++++++ gold/x86_64.cc | 5 +++++ 4 files changed, 25 insertions(+), 1 deletion(-) 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(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>*, -- cgit v1.1