PR gold/13245
authorCary Coutant <ccoutant@google.com>
Tue, 18 Oct 2011 00:25:53 +0000 (00:25 +0000)
committerCary Coutant <ccoutant@google.com>
Tue, 18 Oct 2011 00:25:53 +0000 (00:25 +0000)
* plugin.cc (is_visible_from_outside): Check for symbols
referenced from dynamic objects.
* resolve.cc (Symbol_table::resolve): Don't count references
from dynamic objects as references from real ELF files.
* testsuite/plugin_test_2.sh: Adjust expected result.

gold/ChangeLog
gold/plugin.cc
gold/resolve.cc
gold/symtab.h
gold/testsuite/plugin_test_2.sh

index f5ef533813def5cdfc2ed345423dc810a4afd367..18339967649c5c030070e7b468a8a210828fde4c 100644 (file)
@@ -1,3 +1,12 @@
+2011-10-17  Cary Coutant  <ccoutant@google.com>
+
+       PR gold/13245
+       * plugin.cc (is_visible_from_outside): Check for symbols
+       referenced from dynamic objects.
+       * resolve.cc (Symbol_table::resolve): Don't count references
+       from dynamic objects as references from real ELF files.
+       * testsuite/plugin_test_2.sh: Adjust expected result.
+
 2011-10-17  Cary Coutant  <ccoutant@google.com>
 
        * gold.cc: Include timer.h.
index ebda0aff152466f9f483c86ce71a9805a597cd7d..637613c897a217eebf2a57da5f4df178c1ec3b3e 100644 (file)
@@ -818,7 +818,9 @@ Pluginobj::Pluginobj(const std::string& name, Input_file* input_file,
 }
 
 // Return TRUE if a defined symbol is referenced from outside the
-// universe of claimed objects.
+// universe of claimed objects.  Only references from relocatable,
+// non-IR (unclaimed) objects count as a reference.  References from
+// dynamic objects count only as "visible".
 
 static inline bool
 is_referenced_from_outside(Symbol* lsym)
@@ -838,6 +840,8 @@ is_referenced_from_outside(Symbol* lsym)
 static inline bool
 is_visible_from_outside(Symbol* lsym)
 {
+  if (lsym->in_dyn())
+    return true;
   if (parameters->options().export_dynamic() || parameters->options().shared())
     return lsym->is_externally_visible();
   return false;
index 03288eccf19ff20bc7aa1388cf533b796484819c..2a688769bed17b2d1bec307125337d59f62c9bf5 100644 (file)
@@ -296,7 +296,7 @@ Symbol_table::resolve(Sized_symbol<size>* to,
 
   // Record if we've seen this symbol in a real ELF object (i.e., the
   // symbol is referenced from outside the world known to the plugin).
-  if (object->pluginobj() == NULL)
+  if (object->pluginobj() == NULL && !object->is_dynamic())
     to->set_in_real_elf();
 
   // If we're processing replacement files, allow new symbols to override
index b9b9e00811e4c32380fa530da51f9e4b20190b25..4707e1248370813b8dd874f7fd0320ad685ca237 100644 (file)
@@ -993,7 +993,12 @@ class Symbol
   // index, not one of the special codes from SHN_LORESERVE to
   // SHN_HIRESERVE (bit 29).
   bool is_ordinary_shndx_ : 1;
-  // True if we've seen this symbol in a real ELF object (bit 30).
+  // True if we've seen this symbol in a "real" ELF object (bit 30).
+  // If the symbol has been seen in a relocatable, non-IR, object file,
+  // it's known to be referenced from outside the IR.  A reference from
+  // a dynamic object doesn't count as a "real" ELF, and we'll simply
+  // mark the symbol as "visible" from outside the IR.  The compiler
+  // can use this distinction to guide its handling of COMDAT symbols.
   bool in_real_elf_ : 1;
   // True if this symbol is defined in a section which was discarded
   // (bit 31).
index a47d22aaa65cb1ca662f3f632d2c4cf5d1ce06ff..293b1f00603cd90fb984cb618e763b3adcdd9345 100755 (executable)
@@ -45,7 +45,7 @@ check plugin_test_2.err "two_file_test_main.o: claim file hook called"
 check plugin_test_2.err "two_file_test_1.syms: claim file hook called"
 check plugin_test_2.err "two_file_test_1b.syms: claim file hook called"
 check plugin_test_2.err "two_file_shared_2.so: claim file hook called"
-check plugin_test_2.err "two_file_test_1.syms: _Z4f13iv: PREVAILING_DEF_REG"
+check plugin_test_2.err "two_file_test_1.syms: _Z4f13iv: PREVAILING_DEF_IRONLY_EXP"
 check plugin_test_2.err "two_file_test_1.syms: _Z2t2v: PREVAILING_DEF_REG"
 check plugin_test_2.err "two_file_test_1.syms: v2: RESOLVED_DYN"
 check plugin_test_2.err "two_file_test_1.syms: t17data: RESOLVED_DYN"
This page took 0.034629 seconds and 4 git commands to generate.