Remove warning about references from shared objects to hidden symbols.
authorYiran Wang <yiran@google.com>
Mon, 20 Jul 2015 15:47:57 +0000 (08:47 -0700)
committerCary Coutant <ccoutant@gmail.com>
Mon, 20 Jul 2015 16:19:02 +0000 (09:19 -0700)
gold/
PR gold/15574
* resolve.cc (Symbol_table): Remove warning about references
from shared objects to hidden symbols.
* testsuite/Makefile.am (hidden_test): Add hidden_test.syms.
* testsuite/Makefile.in: Regenerate.
* testsuite/hidden_test.sh: Check dynamic symbol table; update
expected error messages.

gold/ChangeLog
gold/resolve.cc
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/testsuite/hidden_test.sh

index 309b4753654a47b9ac0bc51eed92f1892b0438dd..de73b7de65c6c93b250f667851a215aed3c83564 100644 (file)
@@ -1,3 +1,14 @@
+2015-07-20  Yiran Wang  <yiran@google.com>
+       Cary Coutant  <ccoutant@gmail.com>
+
+       PR gold/15574
+       * resolve.cc (Symbol_table): Remove warning about references
+       from shared objects to hidden symbols.
+       * testsuite/Makefile.am (hidden_test): Add hidden_test.syms.
+       * testsuite/Makefile.in: Regenerate.
+       * testsuite/hidden_test.sh: Check dynamic symbol table; update
+       expected error messages.
+
 2015-07-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        * compressed_output.cc (Output_compressed_section::set_final_data_size):
index fdae0bae4a4bc2b9f676f91b67ab9ef1b79e406f..22d1e788261e2dfb9379200ad05798a702226d3c 100644 (file)
@@ -286,15 +286,10 @@ Symbol_table::resolve(Sized_symbol<size>* to,
            && (to->visibility() == elfcpp::STV_HIDDEN
                || to->visibility() == elfcpp::STV_INTERNAL))
     {
-      // A dynamic object cannot reference a hidden or internal symbol
-      // defined in another object.
-      gold_warning(_("%s symbol '%s' in %s is referenced by DSO %s"),
-                   (to->visibility() == elfcpp::STV_HIDDEN
-                    ? "hidden"
-                    : "internal"),
-                   to->demangled_name().c_str(),
-                   to->object()->name().c_str(),
-                   object->name().c_str());
+      // The symbol is hidden, so a reference from a shared object
+      // cannot bind to it.  We tried issuing a warning in this case,
+      // but that produces false positives when the symbol is
+      // actually resolved in a different shared object (PR 15574).
       return;
     }
   else
index 41186c694ce0ea558042d02087459f1a11f55008..cf56c32f3ae7ab1e9f11965f93ce85c3aba81894 100644 (file)
@@ -2099,11 +2099,13 @@ endif MCMODEL_MEDIUM
 # referenced by a shared library.
 check_SCRIPTS += hidden_test.sh
 check_DATA += hidden_test.err
-MOSTLYCLEANFILES += hidden_test hidden_test.err
+MOSTLYCLEANFILES += hidden_test hidden_test.err hidden_test.syms
 libhidden.so: hidden_test_1.c gcctestdir/ld
        $(COMPILE) -Bgcctestdir/ -g -shared -fPIC -w -o $@ $(srcdir)/hidden_test_1.c
 hidden_test: hidden_test_main.o libhidden.so gcctestdir/ld
        $(LINK) -Bgcctestdir/ -Wl,-R,. hidden_test_main.o libhidden.so 2>hidden_test.err
+hidden_test.syms: hidden_test
+       $(TEST_NM) -D hidden_test > $@
 hidden_test.err: hidden_test
        @touch hidden_test.err
 
index 563f598e877c5e4da4738caab38a3d370b065bd7..fc1063952ffe60761832f2bd0029eca936c7ffb2 100644 (file)
@@ -498,6 +498,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_relocatable_test1.out \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_relocatable_test2.out \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ hidden_test hidden_test.err \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ hidden_test.syms \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ retain_symbols_file_test \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ retain_symbols_file_test.in \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ retain_symbols_file_test.stdout \
@@ -6013,6 +6014,8 @@ uninstall-am:
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(COMPILE) -Bgcctestdir/ -g -shared -fPIC -w -o $@ $(srcdir)/hidden_test_1.c
 @GCC_TRUE@@NATIVE_LINKER_TRUE@hidden_test: hidden_test_main.o libhidden.so gcctestdir/ld
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(LINK) -Bgcctestdir/ -Wl,-R,. hidden_test_main.o libhidden.so 2>hidden_test.err
+@GCC_TRUE@@NATIVE_LINKER_TRUE@hidden_test.syms: hidden_test
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_NM) -D hidden_test > $@
 @GCC_TRUE@@NATIVE_LINKER_TRUE@hidden_test.err: hidden_test
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ @touch hidden_test.err
 @GCC_TRUE@@NATIVE_LINKER_TRUE@retain_symbols_file_test.so: basic_pic_test.o gcctestdir/ld
index 8366bc9390b18123bcd82ceab04941c780baf8d2..48bae4aa7052b93d4b95839caae68dfc5ceeec5d 100755 (executable)
 # error messages are issued for the references to internal and
 # hidden symbols.  The errors will be found in hidden_test.err.
 
-check()
+check_missing()
 {
-    if grep -q "$2" "$1"
+    if grep -q "$2" "$1"
     then
-       echo "Did not find expected error in $1:"
+       echo "Found unexpected error in $1:"
        echo "   $2"
        echo ""
        echo "Actual error output below:"
@@ -42,25 +42,29 @@ check()
     fi
 }
 
-check_missing()
+check_missing_sym()
 {
     if grep -q "$2" "$1"
     then
-       echo "Found unexpected error in $1:"
+       echo "Found unexpected symbol in $1:"
        echo "   $2"
        echo ""
-       echo "Actual error output below:"
+       echo "Actual nm output below:"
        cat "$1"
        exit 1
     fi
 }
 
-# We should see errors for hidden and internal symbols.
-check hidden_test.err "hidden symbol 'main_hidden' in hidden_test_main.o is referenced by DSO libhidden.so"
-check hidden_test.err "internal symbol 'main_internal' in hidden_test_main.o is referenced by DSO libhidden.so"
-
 # We shouldn't see errors for the default and protected symbols.
 check_missing hidden_test.err "main_default"
 check_missing hidden_test.err "main_protected"
 
+# We shouldn't see errors for the hidden and internal symbols either (PR 15574).
+check_missing hidden_test.err "main_hidden"
+check_missing hidden_test.err "main_internal"
+
+# We shouldn't see the hidden or internal symbols in the dynamic symbol table.
+check_missing_sym hidden_test.syms "main_hidden"
+check_missing_sym hidden_test.syms "main_internal"
+
 exit 0