summaryrefslogtreecommitdiff
path: root/gold/copy-relocs.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/copy-relocs.cc
parent15eb1bebe1525ba8baf1f56e9df791cff146a352 (diff)
downloadbinutils-gdb-6eeb0170bbb43ffb73e8f01b8b481adde8194c21.tar.gz
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/copy-relocs.cc')
-rw-r--r--gold/copy-relocs.cc16
1 files changed, 14 insertions, 2 deletions
diff --git a/gold/copy-relocs.cc b/gold/copy-relocs.cc
index 32288c8ee53..ce019c4265e 100644
--- a/gold/copy-relocs.cc
+++ b/gold/copy-relocs.cc
@@ -48,7 +48,7 @@ Copy_relocs<sh_type, size, big_endian>::copy_reloc(
Output_data_reloc<sh_type, true, size, big_endian>* reloc_section)
{
if (this->need_copy_reloc(sym, object, shndx))
- this->make_copy_reloc(symtab, layout, sym, reloc_section);
+ this->make_copy_reloc(symtab, layout, sym, object, reloc_section);
else
{
// We may not need a COPY relocation. Save this relocation to
@@ -111,11 +111,24 @@ Copy_relocs<sh_type, size, big_endian>::make_copy_reloc(
Symbol_table* symtab,
Layout* layout,
Sized_symbol<size>* sym,
+ Sized_relobj_file<size, big_endian>* object,
Output_data_reloc<sh_type, true, size, big_endian>* reloc_section)
{
// We should not be here if -z nocopyreloc is given.
gold_assert(parameters->options().copyreloc());
+ gold_assert(sym->is_from_dynobj());
+
+ // The symbol must not have protected visibility.
+ if (sym->is_protected())
+ {
+ gold_error(_("%s: cannot make copy relocation for "
+ "protected symbol '%s', defined in %s"),
+ object->name().c_str(),
+ sym->name(),
+ sym->object()->name().c_str());
+ }
+
typename elfcpp::Elf_types<size>::Elf_WXword symsize = sym->symsize();
// There is no defined way to determine the required alignment of
@@ -124,7 +137,6 @@ Copy_relocs<sh_type, size, big_endian>::make_copy_reloc(
// is defined; presumably we do not require an alignment larger than
// that. Then we reduce that alignment if the symbol is not aligned
// within the section.
- gold_assert(sym->is_from_dynobj());
bool is_ordinary;
unsigned int shndx = sym->shndx(&is_ordinary);
gold_assert(is_ordinary);