From: ccoutant Date: Tue, 18 Oct 2011 00:25:52 +0000 (+0000) Subject: PR gold/13245 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b066fca9e67ce01cbaf61a27c5bc8084716b4518;p=pf3gnuchains%2Fpf3gnuchains4x.git 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. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index f5ef533813..1833996764 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,14 @@ 2011-10-17 Cary Coutant + 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 + * gold.cc: Include timer.h. (queue_middle_tasks): Stamp time. (queue_final_tasks): Likewise. diff --git a/gold/plugin.cc b/gold/plugin.cc index ebda0aff15..637613c897 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -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; diff --git a/gold/resolve.cc b/gold/resolve.cc index 03288eccf1..2a688769be 100644 --- a/gold/resolve.cc +++ b/gold/resolve.cc @@ -296,7 +296,7 @@ Symbol_table::resolve(Sized_symbol* 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 diff --git a/gold/symtab.h b/gold/symtab.h index b9b9e00811..4707e12483 100644 --- a/gold/symtab.h +++ b/gold/symtab.h @@ -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). diff --git a/gold/testsuite/plugin_test_2.sh b/gold/testsuite/plugin_test_2.sh index a47d22aaa6..293b1f0060 100755 --- a/gold/testsuite/plugin_test_2.sh +++ b/gold/testsuite/plugin_test_2.sh @@ -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"