diff --git a/gold/ChangeLog b/gold/ChangeLog index 05aac4b1b6..f32f46fd92 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,11 @@ +2009-12-30 Ian Lance Taylor + + PR 10916 + * symtab.cc (Symbol_table::add_from_relobj): When not exporting + symbols from this object, don't change the visibility of an + undefined symbol. + * testsuite/exclude_libs_test_1.c (lib1_ref): New function. + 2009-12-30 Ian Lance Taylor PR 10861 diff --git a/gold/symtab.cc b/gold/symtab.cc index d8461a742d..79fc4e6c48 100644 --- a/gold/symtab.cc +++ b/gold/symtab.cc @@ -1151,7 +1151,8 @@ Symbol_table::add_from_relobj( } // Fix up visibility if object has no-export set. - if (relobj->no_export()) + if (relobj->no_export() + && (orig_st_shndx != elfcpp::SHN_UNDEF || !is_ordinary)) { // We may have copied symbol already above. if (psym != &sym2) diff --git a/gold/testsuite/exclude_libs_test_1.c b/gold/testsuite/exclude_libs_test_1.c index ced1aade14..48b617b0a0 100644 --- a/gold/testsuite/exclude_libs_test_1.c +++ b/gold/testsuite/exclude_libs_test_1.c @@ -2,6 +2,8 @@ void lib1_default (void); void lib1_hidden (void); void lib1_internal (void); void lib1_protected (void); +void lib1_ref (void); +extern void lib2_default (void); void __attribute__((visibility ("default"))) lib1_default (void) @@ -22,3 +24,9 @@ void __attribute__((visibility ("protected"))) lib1_protected (void) { } + +void +lib1_ref (void) +{ + lib2_default (); +}