[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