This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Improve "unrecognized relocation" error messages to add the suggestion that the linker might be out


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=47aeb64c10ec9c9f06d2d2f4451f417d63b023e1

commit 47aeb64c10ec9c9f06d2d2f4451f417d63b023e1
Author: Nick Clifton <nickc@redhat.com>
Date:   Mon Jul 24 11:27:33 2017 +0100

    Improve "unrecognized relocation" error messages to add the suggestion that the linker might be out of date.
    
    	PR 21803
    	* reloc.c (_bfd_unrecognized_reloc): New function.  Reports
    	an unrecognized reloc and sets the bfd_error value.
    	* libbfd.h: Regenerate.
    	* elf32-arm.c (elf32_arm_final_link_relocate): Use the new
    	function.
    	* elf32-i386.c (elf_i386_relocate_section): Likewise.
    	* elf32-tilepro.c (tilepro_elf_relocate_section): Likewise.
    	* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
    	* elfnn-aarch64.c (elfNN_aarch64_relocate_section): Likewise.
    	* elfxx-tilegx.c (tilegx_elf_relocate_section): Likewise.

Diff:
---
 bfd/ChangeLog       | 14 ++++++++++++++
 bfd/elf32-arm.c     |  7 +++++--
 bfd/elf32-i386.c    | 10 ++--------
 bfd/elf32-tilepro.c | 10 +---------
 bfd/elf64-x86-64.c  |  9 +--------
 bfd/elfnn-aarch64.c | 12 +++---------
 bfd/elfxx-tilegx.c  | 10 +---------
 bfd/libbfd.h        |  5 +++++
 bfd/reloc.c         | 43 +++++++++++++++++++++++++++++++++++++------
 9 files changed, 69 insertions(+), 51 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 66d8124..e3da4f5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,17 @@
+2017-07-24  Nick Clifton  <nickc@redhat.com>
+
+	PR 21803
+	* reloc.c (_bfd_unrecognized_reloc): New function.  Reports
+	an unrecognized reloc and sets the bfd_error value.
+	* libbfd.h: Regenerate.
+	* elf32-arm.c (elf32_arm_final_link_relocate): Use the new
+	function.
+	* elf32-i386.c (elf_i386_relocate_section): Likewise.
+	* elf32-tilepro.c (tilepro_elf_relocate_section): Likewise.
+	* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
+	* elfnn-aarch64.c (elfNN_aarch64_relocate_section): Likewise.
+	* elfxx-tilegx.c (tilegx_elf_relocate_section): Likewise.
+
 2017-07-23  Alan Modra  <amodra@gmail.com>
 
 	* elf64-ppc.c (ppc64_elf_size_stubs): Correct advance to
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index e8c346d..bad8540 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -9906,6 +9906,7 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
     return bfd_reloc_notsupported;
 
   BFD_ASSERT (is_arm_elf (input_bfd));
+  BFD_ASSERT (howto != NULL);
 
   /* Some relocation types map to different relocations depending on the
      target.  We pick the right one here.  */
@@ -12289,8 +12290,10 @@ elf32_arm_relocate_section (bfd *                  output_bfd,
 	  || r_type == R_ARM_GNU_VTINHERIT)
 	continue;
 
-      bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
-      howto = bfd_reloc.howto;
+      howto = bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
+
+      if (howto == NULL)
+	return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
 
       h = NULL;
       sym = NULL;
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 9d9c8ab..37099b7 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -3939,14 +3939,8 @@ elf_i386_relocate_section (bfd *output_bfd,
 	      >= R_386_ext - R_386_standard)
 	  && ((indx = r_type - R_386_tls_offset) - R_386_ext
 	      >= R_386_ext2 - R_386_ext))
-	{
-	  _bfd_error_handler
-	    /* xgettext:c-format */
-	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
-	     input_bfd, r_type, input_section);
-	  bfd_set_error (bfd_error_bad_value);
-	  return FALSE;
-	}
+	return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
+
       howto = elf_howto_table + indx;
 
       r_symndx = ELF32_R_SYM (rel->r_info);
diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c
index 976ce30..13b9bb1 100644
--- a/bfd/elf32-tilepro.c
+++ b/bfd/elf32-tilepro.c
@@ -2861,15 +2861,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 	continue;
 
       if ((unsigned int)r_type >= NELEMS(tilepro_elf_howto_table))
-	{
-          /* Not clear if we need to check here, but just be paranoid. */
-	  _bfd_error_handler
-	    /* xgettext:c-format */
-	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
-	     input_bfd, r_type, input_section);
-	  bfd_set_error (bfd_error_bad_value);
-	  return FALSE;
-	}
+	return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
 
       howto = tilepro_elf_howto_table + r_type;
 
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index a13af12..448599e 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -4314,14 +4314,7 @@ elf_x86_64_relocate_section (bfd *output_bfd,
 	}
 
       if (r_type >= (int) R_X86_64_standard)
-	{
-	  _bfd_error_handler
-	    /* xgettext:c-format */
-	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
-	     input_bfd, r_type, input_section);
-	  bfd_set_error (bfd_error_bad_value);
-	  return FALSE;
-	}
+	return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
 
       if (r_type != (int) R_X86_64_32
 	  || ABI_64_P (output_bfd))
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index be2f89c..0d8332e 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -6072,17 +6072,11 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
       r_symndx = ELFNN_R_SYM (rel->r_info);
       r_type = ELFNN_R_TYPE (rel->r_info);
 
-      bfd_reloc.howto = elfNN_aarch64_howto_from_type (r_type);
-      howto = bfd_reloc.howto;
+      howto = bfd_reloc.howto = elfNN_aarch64_howto_from_type (r_type);
 
       if (howto == NULL)
-	{
-	  /* xgettext:c-format */
-	  _bfd_error_handler
-	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
-	     input_bfd, r_type, input_section);
-	  return FALSE;
-	}
+	return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
+
       bfd_r_type = elfNN_aarch64_bfd_reloc_from_howto (howto);
 
       h = NULL;
diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c
index 50543b9..390d089 100644
--- a/bfd/elfxx-tilegx.c
+++ b/bfd/elfxx-tilegx.c
@@ -3160,15 +3160,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
 	continue;
 
       if ((unsigned int)r_type >= ARRAY_SIZE (tilegx_elf_howto_table))
-	{
-          /* Not clear if we need to check here, but just be paranoid. */
-	  _bfd_error_handler
-	    /* xgettext:c-format */
-	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
-	     input_bfd, r_type, input_section);
-	  bfd_set_error (bfd_error_bad_value);
-	  return FALSE;
-	}
+	return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
 
       howto = tilegx_elf_howto_table + r_type;
 
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index 17acda5..196e1f0 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -3219,6 +3219,11 @@ void _bfd_generic_set_reloc
     arelent **relptr,
     unsigned int count);
 
+bfd_boolean _bfd_unrecognized_reloc
+   (bfd * abfd,
+    sec_ptr section,
+    unsigned int r_type);
+
 /* Extracted from archures.c.  */
 extern const bfd_arch_info_type bfd_default_arch_struct;
 const bfd_arch_info_type *bfd_default_compatible
diff --git a/bfd/reloc.c b/bfd/reloc.c
index 8512261..97a17f5 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -50,6 +50,7 @@ SECTION
 #include "bfd.h"
 #include "bfdlink.h"
 #include "libbfd.h"
+#include "bfdver.h"
 /*
 DOCDD
 INODE
@@ -8281,13 +8282,43 @@ DESCRIPTION
 	Installs a new set of internal relocations in SECTION.
 */
 
-
-void _bfd_generic_set_reloc
-  (bfd *abfd ATTRIBUTE_UNUSED,
-   sec_ptr section,
-   arelent **relptr,
-   unsigned int count)
+void
+_bfd_generic_set_reloc (bfd *abfd ATTRIBUTE_UNUSED,
+			sec_ptr section,
+			arelent **relptr,
+			unsigned int count)
 {
   section->orelocation = relptr;
   section->reloc_count = count;
 }
+
+/*
+INTERNAL_FUNCTION
+	_bfd_unrecognized_reloc
+
+SYNOPSIS
+	bfd_boolean _bfd_unrecognized_reloc
+	  (bfd * abfd,
+	   sec_ptr section,
+	   unsigned int r_type);
+
+DESCRIPTION
+	Reports an unrecognized reloc.
+	Written as a function in order to reduce code duplication.
+	Returns FALSE so that it can be called from a return statement.
+*/
+
+bfd_boolean
+_bfd_unrecognized_reloc (bfd * abfd, sec_ptr section, unsigned int r_type)
+{
+   /* xgettext:c-format */
+  _bfd_error_handler (_("%B: unrecognized relocation (%#x) in section `%A'"),
+		      abfd, r_type, section);
+
+  /* PR 21803: Suggest the most likely cause of this error.  */
+  _bfd_error_handler (_("Is this version of the linker - %s - out of date ?"),
+		      BFD_VERSION_STRING);
+
+  bfd_set_error (bfd_error_bad_value);
+  return FALSE;
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]