Fix misreporting of omitted bytes for large remote packets
[deliverable/binutils-gdb.git] / gold / target-reloc.h
index bdf673d741e20fc395bfd9b7fd3cc8050a46e46e..f52e42f62e038b354cfb52e9b12c08381d5d3c6b 100644 (file)
@@ -1,6 +1,6 @@
 // target-reloc.h -- target specific relocation support  -*- C++ -*-
 
-// Copyright (C) 2006-2016 Free Software Foundation, Inc.
+// Copyright (C) 2006-2018 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -186,8 +186,10 @@ issue_undefined_symbol_error(const Symbol* sym)
   if (sym->is_weak_undefined())
     return false;
 
-  // We don't report symbols defined in discarded sections.
-  if (sym->is_defined_in_discarded_section())
+  // We don't report symbols defined in discarded sections,
+  // unless they're placeholder symbols that should have been
+  // provided by a plugin.
+  if (sym->is_defined_in_discarded_section() && !sym->is_placeholder())
     return false;
 
   // If the target defines this symbol, don't report it here.
@@ -753,6 +755,8 @@ relocate_relocs(
 
   unsigned char* pwrite = reloc_view;
 
+  const bool relocatable = parameters->options().relocatable();
+
   for (size_t i = 0; i < reloc_count; ++i, prelocs += reloc_size)
     {
       Relocatable_relocs::Reloc_strategy strategy = relinfo->rr->strategy(i);
@@ -855,7 +859,7 @@ relocate_relocs(
       // In an object file, r_offset is an offset within the section.
       // In an executable or dynamic object, generated by
       // --emit-relocs, r_offset is an absolute address.
-      if (!parameters->options().relocatable())
+      if (!relocatable)
        {
          new_offset += view_address;
          if (offset_in_output_section != invalid_address)
@@ -890,10 +894,17 @@ relocate_relocs(
            {
            case Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_RELA:
              {
-               typename elfcpp::Elf_types<size>::Elf_Swxword addend;
-               addend = Classify_reloc::get_r_addend(&reloc);
-               gold_assert(os != NULL);
-               addend = psymval->value(object, addend) - os->address();
+               typename elfcpp::Elf_types<size>::Elf_Swxword addend
+                   = Classify_reloc::get_r_addend(&reloc);
+               addend = psymval->value(object, addend);
+               // In a relocatable link, the symbol value is relative to
+               // the start of the output section. For a non-relocatable
+               // link, we need to adjust the addend.
+               if (!relocatable)
+                 {
+                   gold_assert(os != NULL);
+                   addend -= os->address();
+                 }
                Classify_reloc::put_r_addend(&reloc_write, addend);
              }
              break;
This page took 0.023817 seconds and 4 git commands to generate.