2011-07-22 Sriraman Tallam <tmsriram@google.com>
authorSriraman Tallam <tmsriram@google.com>
Fri, 22 Jul 2011 22:38:42 +0000 (22:38 +0000)
committerSriraman Tallam <tmsriram@google.com>
Fri, 22 Jul 2011 22:38:42 +0000 (22:38 +0000)
* symtab.cc (Symbol_table::add_from_relobj): Mark symbol as referenced
only after checking if it cannot be forced local.
* symtab.h (is_externally_visible): Check if the symbol is not forced
local.

gold/ChangeLog
gold/symtab.cc
gold/symtab.h

index 9d509c281b797ad90e7356ada4b97ee874767a86..c894c710b7bcdfc3bfdd624410206aa2e1a074ed 100644 (file)
@@ -1,3 +1,10 @@
+2011-07-22  Sriraman Tallam  <tmsriram@google.com>
+
+       * symtab.cc (Symbol_table::add_from_relobj): Mark symbol as referenced
+       only after checking if it cannot be forced local.
+       * symtab.h (is_externally_visible): Check if the symbol is not forced
+       local.
+
 2011-07-15  Ian Lance Taylor  <iant@google.com>
 
        * options.h (class General_options): Add --print-output-format.
index 26d803262d57ba9c51ce7fcd51e967b7e03aa5ae..e289f796c59f4eaea360ad49c3dd5e90c16be9f0 100644 (file)
@@ -1238,15 +1238,15 @@ Symbol_table::add_from_relobj(
                                  is_default_version, *psym, st_shndx,
                                  is_ordinary, orig_st_shndx);
       
+      if (is_forced_local)
+       this->force_local(res);
+
       // If building a shared library using garbage collection, do not 
       // treat externally visible symbols as garbage.
       if (parameters->options().gc_sections() 
           && parameters->options().shared())
         this->gc_mark_symbol_for_shlib(res);
 
-      if (is_forced_local)
-       this->force_local(res);
-
       if (is_defined_in_discarded_section)
        res->set_is_defined_in_discarded_section();
 
index e2aa6a7f536e7f380e9b0d95dbc9153712e3833d..b9b9e00811e4c32380fa530da51f9e4b20190b25 100644 (file)
@@ -538,8 +538,9 @@ class Symbol
   bool
   is_externally_visible() const
   {
-    return (this->visibility_ == elfcpp::STV_DEFAULT
-            || this->visibility_ == elfcpp::STV_PROTECTED);
+    return ((this->visibility_ == elfcpp::STV_DEFAULT
+             || this->visibility_ == elfcpp::STV_PROTECTED)
+           && !this->is_forced_local_);
   }
 
   // Return true if this symbol can be preempted by a definition in