[gold patch] Incremental 26/26: Fix problem with hidden/internal symbols
Cary Coutant
ccoutant@google.com
Thu Jun 9 00:02:00 GMT 2011
OK, one more -- then I'll stop numbering them.
This patch fixes a case where a hidden symbol overrides one defined in
a shared library. If we mark the def in the shared library as an
UNDEF, we'll complain about a reference to a hidden or internal symbol
during the incremental update where we don't complain during the full
link. Instead, the right thing to do is mark it as a DEF, and it'll go
through the same resolve logic as the first time around.
-cary
2011-06-08 Cary Coutant <ccoutant@google.com>
* gold/incremental.cc
(Output_section_incremental_inputs::write_info_blocks): Check for
hidden and internal symbols.
diff --git a/gold/incremental.cc b/gold/incremental.cc
index 710effc..cb97044 100644
--- a/gold/incremental.cc
+++ b/gold/incremental.cc
@@ -1669,9 +1669,15 @@ Output_section_incremental_inputs<size,
big_endian>::write_info_blocks(
if (sym->symtab_index() == -1U)
continue;
unsigned int flags = 0;
- if (sym->source() == Symbol::FROM_OBJECT
- && sym->object() == obj
- && sym->is_defined())
+ // If the symbol has hidden or internal visibility, we
+ // mark it as defined in the shared object so we don't
+ // try to resolve it during an incremental update.
+ if (sym->visibility() == elfcpp::STV_HIDDEN
+ || sym->visibility() == elfcpp::STV_INTERNAL)
+ flags = INCREMENTAL_SHLIB_SYM_DEF;
+ else if (sym->source() == Symbol::FROM_OBJECT
+ && sym->object() == obj
+ && sym->is_defined())
flags = INCREMENTAL_SHLIB_SYM_DEF;
else if (sym->is_copied_from_dynobj()
&& this->symtab_->get_copy_source(sym) == dynobj)
More information about the Binutils
mailing list