Do not use linker script to place static relocation sections.
[deliverable/binutils-gdb.git] / gold / copy-relocs.cc
index 41b65631aad8f9f69c592c3519a9aa5c5c06d915..ce019c4265ea498fc0ea09120885a77716380cdd 100644 (file)
@@ -1,6 +1,6 @@
 // copy-relocs.cc -- handle COPY relocations for gold.
 
-// Copyright (C) 2006-2014 Free Software Foundation, Inc.
+// Copyright (C) 2006-2016 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -42,16 +42,19 @@ Copy_relocs<sh_type, size, big_endian>::copy_reloc(
     Sized_relobj_file<size, big_endian>* object,
     unsigned int shndx,
     Output_section* output_section,
-    const Reloc& rel,
+    unsigned int r_type,
+    typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
+    typename elfcpp::Elf_types<size>::Elf_Swxword r_addend,
     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
       // possibly be emitted later.
-      this->save(sym, object, shndx, output_section, rel);
+      this->save(sym, object, shndx, output_section,
+                r_type, r_offset, r_addend);
     }
 }
 
@@ -108,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
@@ -121,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);
@@ -176,14 +191,13 @@ Copy_relocs<sh_type, size, big_endian>::save(
     Sized_relobj_file<size, big_endian>* object,
     unsigned int shndx,
     Output_section* output_section,
-    const Reloc& rel)
+    unsigned int r_type,
+    typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
+    typename elfcpp::Elf_types<size>::Elf_Swxword r_addend)
 {
-  unsigned int reloc_type = elfcpp::elf_r_type<size>(rel.get_r_info());
-  typename elfcpp::Elf_types<size>::Elf_Addr addend =
-    Reloc_types<sh_type, size, big_endian>::get_reloc_addend_noerror(&rel);
-  this->entries_.push_back(Copy_reloc_entry(sym, reloc_type, object, shndx,
-                                           output_section, rel.get_r_offset(),
-                                           addend));
+  this->entries_.push_back(Copy_reloc_entry(sym, r_type, object, shndx,
+                                           output_section, r_offset,
+                                           r_addend));
 }
 
 // Emit any saved relocs.
This page took 0.025296 seconds and 4 git commands to generate.