Support special always-defined symbols for targets.
authorIan Lance Taylor <iant@google.com>
Wed, 14 Nov 2007 07:52:21 +0000 (07:52 +0000)
committerIan Lance Taylor <iant@google.com>
Wed, 14 Nov 2007 07:52:21 +0000 (07:52 +0000)
gold/i386.cc
gold/symtab.cc
gold/target.h
gold/x86_64.cc

index eae6b7f..9b90c79 100644 (file)
@@ -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>*,
index f5e2132..2443023 100644 (file)
@@ -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());
index 8ecc078..33c351c 100644 (file)
@@ -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&);
index 0614e89..ead93d9 100644 (file)
@@ -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>*,