]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gold/target-reloc.h
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / gold / target-reloc.h
index f52e42f62e038b354cfb52e9b12c08381d5d3c6b..0eeb7a38d8ef52d2722068a1ed31a4f3a20a86c2 100644 (file)
@@ -1,6 +1,6 @@
 // target-reloc.h -- target specific relocation support  -*- C++ -*-
 
-// Copyright (C) 2006-2018 Free Software Foundation, Inc.
+// Copyright (C) 2006-2022 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -120,7 +120,7 @@ enum Comdat_behavior
   CB_UNDETERMINED,   // Not yet determined -- need to look at section name.
   CB_PRETEND,        // Attempt to map to the corresponding kept section.
   CB_IGNORE,         // Ignore the relocation.
-  CB_WARNING         // Print a warning.
+  CB_ERROR           // Print an error.
 };
 
 class Default_comdat_behavior
@@ -136,9 +136,10 @@ class Default_comdat_behavior
     if (Layout::is_debug_info_section(name))
       return CB_PRETEND;
     if (strcmp(name, ".eh_frame") == 0
+       || is_prefix_of (".gnu.build.attributes", name)
        || strcmp(name, ".gcc_except_table") == 0)
       return CB_IGNORE;
-    return CB_WARNING;
+    return CB_ERROR;
   }
 };
 
@@ -224,6 +225,52 @@ issue_undefined_symbol_error(const Symbol* sym)
   return true;
 }
 
+template<int size, bool big_endian>
+inline void
+issue_discarded_error(
+  const Relocate_info<size, big_endian>* relinfo,
+  size_t shndx,
+  section_offset_type offset,
+  unsigned int r_sym,
+  const Symbol* gsym)
+{
+  Sized_relobj_file<size, big_endian>* object = relinfo->object;
+
+  if (gsym == NULL)
+    {
+      gold_error_at_location(
+         relinfo, shndx, offset,
+         _("relocation refers to local symbol \"%s\" [%u], "
+           "which is defined in a discarded section"),
+         object->get_symbol_name(r_sym), r_sym);
+    }
+  else
+    {
+      gold_error_at_location(
+         relinfo, shndx, offset,
+         _("relocation refers to global symbol \"%s\", "
+           "which is defined in a discarded section"),
+         gsym->demangled_name().c_str());
+    }
+
+  bool is_ordinary;
+  typename elfcpp::Elf_types<size>::Elf_Addr value;
+  unsigned int orig_shndx = object->symbol_section_and_value(r_sym, &value,
+                                                            &is_ordinary);
+  if (orig_shndx != elfcpp::SHN_UNDEF)
+    {
+      unsigned int key_symndx = 0;
+      Relobj* kept_obj = object->find_kept_section_object(orig_shndx,
+                                                         &key_symndx);
+      if (key_symndx != 0)
+       gold_info(_("  section group signature: \"%s\""),
+                 object->get_symbol_name(key_symndx));
+      if (kept_obj != NULL)
+       gold_info(_("  prevailing definition is from %s"),
+                 kept_obj->name().c_str());
+    }
+}
+
 // This function implements the generic part of relocation processing.
 // The template parameter Relocate must be a class type which provides
 // a single function, relocate(), which implements the machine
@@ -305,6 +352,7 @@ relocate_section(
       const Symbol_value<size> *psymval;
       bool is_defined_in_discarded_section;
       unsigned int shndx;
+      const Symbol* gsym = NULL;
       if (r_sym < local_count
          && (reloc_symbol_changes == NULL
              || (*reloc_symbol_changes)[i] == NULL))
@@ -327,7 +375,6 @@ relocate_section(
        }
       else
        {
-         const Symbol* gsym;
          if (reloc_symbol_changes != NULL
              && (*reloc_symbol_changes)[i] != NULL)
            gsym = (*reloc_symbol_changes)[i];
@@ -360,11 +407,11 @@ relocate_section(
       Symbol_value<size> symval2;
       if (is_defined_in_discarded_section)
        {
+         std::string name = object->section_name(relinfo->data_shndx);
+
          if (comdat_behavior == CB_UNDETERMINED)
-           {
-             std::string name = object->section_name(relinfo->data_shndx);
              comdat_behavior = relocate_comdat_behavior.get(name.c_str());
-           }
+
          if (comdat_behavior == CB_PRETEND)
            {
              // FIXME: This case does not work for global symbols.
@@ -374,7 +421,7 @@ relocate_section(
              // script.
              bool found;
              typename elfcpp::Elf_types<size>::Elf_Addr value =
-               object->map_to_kept_section(shndx, &found);
+                 object->map_to_kept_section(shndx, name, &found);
              if (found)
                symval2.set_output_value(value + psymval->input_value());
              else
@@ -382,10 +429,8 @@ relocate_section(
            }
          else
            {
-             if (comdat_behavior == CB_WARNING)
-               gold_warning_at_location(relinfo, i, offset,
-                                        _("relocation refers to discarded "
-                                          "section"));
+             if (comdat_behavior == CB_ERROR)
+               issue_discarded_error(relinfo, i, offset, r_sym, gsym);
              symval2.set_output_value(0);
            }
          symval2.set_no_output_symtab_entry();