summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2017-07-24 11:27:33 +0100
committerNick Clifton <nickc@redhat.com>2017-07-24 11:27:33 +0100
commit47aeb64c10ec9c9f06d2d2f4451f417d63b023e1 (patch)
treeb29b88b2fe25f814ad01225d316dd28688ca4ca1
parent645b28002711eba22e8a4df3733a01206ab7d36d (diff)
downloadbinutils-gdb-47aeb64c10ec9c9f06d2d2f4451f417d63b023e1.tar.gz
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.
-rw-r--r--bfd/ChangeLog14
-rw-r--r--bfd/elf32-arm.c7
-rw-r--r--bfd/elf32-i386.c10
-rw-r--r--bfd/elf32-tilepro.c10
-rw-r--r--bfd/elf64-x86-64.c9
-rw-r--r--bfd/elfnn-aarch64.c12
-rw-r--r--bfd/elfxx-tilegx.c10
-rw-r--r--bfd/libbfd.h5
-rw-r--r--bfd/reloc.c43
9 files changed, 69 insertions, 51 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 66d812468ec..e3da4f508db 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 e8c346d869e..bad8540c6fd 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 9d9c8abcc32..37099b75574 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 976ce300757..13b9bb14997 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 a13af126cac..448599eb9b3 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 be2f89cfc30..0d8332e69ce 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 50543b9bac5..390d0899caf 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 17acda5c3a6..196e1f014ba 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 8512261c66d..97a17f51477 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;
+}