aboutsummaryrefslogtreecommitdiff
path: root/gold/symtab.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2009-02-27 19:57:46 +0000
committerIan Lance Taylor <ian@airs.com>2009-02-27 19:57:46 +0000
commit0602e05a845a545a8b52386a4dec66b74a158bc7 (patch)
tree538c81672e2f97885ce7f8054e6726f0189ad79b /gold/symtab.cc
parentb5096abe11166944e2de1bb8a27a1c36d02a63ef (diff)
downloadbinutils-0602e05a845a545a8b52386a4dec66b74a158bc7.zip
binutils-0602e05a845a545a8b52386a4dec66b74a158bc7.tar.gz
binutils-0602e05a845a545a8b52386a4dec66b74a158bc7.tar.bz2
PR 9836
* symtab.cc (Symbol_table::add_from_object): If the visibility is hidden or internal, force the symbol to be local. * resolve.cc (Symbol::override_visibility): Define. (Symbol::override_base): Use override_visibility. (Symbol_table::resolve): Likewise. (Symbol::override_base_with_special): Likewise. (Symbol_table::override_with_special): If the visibility is hidden or internal, force the symbol to be local. * symtab.h (class Symbol): Add set_visibility and override_visibility. * testsuite/ver_test_1.sh: New file. * testsuite/Makefile.am (check_SCRIPTS): Add ver_test_1.sh. (check_DATA): Add ver_test_1.syms. (ver_test_1.syms): New target. * testsuite/Makefile.in: Rebuild.
Diffstat (limited to 'gold/symtab.cc')
-rw-r--r--gold/symtab.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/gold/symtab.cc b/gold/symtab.cc
index 5408385..dcbb46e 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -648,7 +648,8 @@ Symbol_table::resolve(Sized_symbol<size>* to, const Sized_symbol<size>* from)
this->gc_mark_dyn_syms(to);
}
-// Record that a symbol is forced to be local by a version script.
+// Record that a symbol is forced to be local by a version script or
+// by visibility.
void
Symbol_table::force_local(Symbol* sym)
@@ -962,6 +963,15 @@ Symbol_table::add_from_object(Object* object,
this->tls_commons_.push_back(ret);
}
+ // If we're not doing a relocatable link, then any symbol with
+ // hidden or internal visibility is local.
+ if ((ret->visibility() == elfcpp::STV_HIDDEN
+ || ret->visibility() == elfcpp::STV_INTERNAL)
+ && (ret->binding() == elfcpp::STB_GLOBAL
+ || ret->binding() == elfcpp::STB_WEAK)
+ && !parameters->options().relocatable())
+ this->force_local(ret);
+
if (def)
ret->set_is_default();
return ret;
@@ -1179,7 +1189,7 @@ Symbol_table::add_from_pluginobj(
def, *sym, st_shndx, true, st_shndx);
if (local)
- this->force_local(res);
+ this->force_local(res);
return res;
}