aboutsummaryrefslogtreecommitdiff
path: root/gold/symtab.cc
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@gmail.com>2016-05-19 14:58:18 -0700
committerCary Coutant <ccoutant@gmail.com>2016-05-19 15:05:03 -0700
commit6eeb0170bbb43ffb73e8f01b8b481adde8194c21 (patch)
treed01fc9c0add92397bb2af0b2bb308b2cb3d7ab57 /gold/symtab.cc
parent15eb1bebe1525ba8baf1f56e9df791cff146a352 (diff)
downloadfsf-binutils-gdb-6eeb0170bbb43ffb73e8f01b8b481adde8194c21.zip
fsf-binutils-gdb-6eeb0170bbb43ffb73e8f01b8b481adde8194c21.tar.gz
fsf-binutils-gdb-6eeb0170bbb43ffb73e8f01b8b481adde8194c21.tar.bz2
Don't allow COPY relocations for protected symbols.
gold/ PR gold/19823 * copy-relocs.cc (Copy_relocs::make_copy_reloc): Add object parameter; check for protected symbol. * copy-relocs.h (Copy_relocs::make_copy_reloc): Add object parameter. * mips.cc (Mips_copy_relocs): Adjust call to make_copy_reloc. * symtab.cc (Symbol::init_fields): Initialize is_protected_. (Symbol_table::add_from_dynobj): Mark protected symbols. * symtab.h (Symbol::is_protected): New method. (Symbol::set_is_protected): New method. (Symbol::is_protected_): New data member. * testsuite/Makefile.am (copy_test_protected): New test. * testsuite/Makefile.in: Regenerate. * testsuite/copy_test.cc (main): Add legal reference to protected symbol. * testsuite/copy_test_v1.cc (main): Likewise. * testsuite/copy_test_2.cc (ip): Add protected symbol. * testsuite/copy_test_protected.cc: New test source file. * testsuite/copy_test_protected.sh: New test script.
Diffstat (limited to 'gold/symtab.cc')
-rw-r--r--gold/symtab.cc8
1 files changed, 8 insertions, 0 deletions
diff --git a/gold/symtab.cc b/gold/symtab.cc
index a7edbb1..5ce5c31 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -80,6 +80,7 @@ Symbol::init_fields(const char* name, const char* version,
this->undef_binding_set_ = false;
this->undef_binding_weak_ = false;
this->is_predefined_ = false;
+ this->is_protected_ = false;
}
// Return the demangled version of the symbol's name, but only
@@ -1610,6 +1611,13 @@ Symbol_table::add_from_dynobj(
&& res->object() == dynobj)
object_symbols.push_back(res);
+ // If the symbol has protected visibility in the dynobj,
+ // mark it as such if it was not overridden.
+ if (res->source() == Symbol::FROM_OBJECT
+ && res->object() == dynobj
+ && sym.get_st_visibility() == elfcpp::STV_PROTECTED)
+ res->set_is_protected();
+
if (sympointers != NULL)
(*sympointers)[i] = res;
}