diff options
author | Nick Clifton <nickc@redhat.com> | 2017-07-24 11:27:33 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2017-07-24 11:27:33 +0100 |
commit | 47aeb64c10ec9c9f06d2d2f4451f417d63b023e1 (patch) | |
tree | b29b88b2fe25f814ad01225d316dd28688ca4ca1 /bfd | |
parent | 645b28002711eba22e8a4df3733a01206ab7d36d (diff) | |
download | gdb-47aeb64c10ec9c9f06d2d2f4451f417d63b023e1.zip gdb-47aeb64c10ec9c9f06d2d2f4451f417d63b023e1.tar.gz gdb-47aeb64c10ec9c9f06d2d2f4451f417d63b023e1.tar.bz2 |
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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 14 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 7 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 10 | ||||
-rw-r--r-- | bfd/elf32-tilepro.c | 10 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 9 | ||||
-rw-r--r-- | bfd/elfnn-aarch64.c | 12 | ||||
-rw-r--r-- | bfd/elfxx-tilegx.c | 10 | ||||
-rw-r--r-- | bfd/libbfd.h | 5 | ||||
-rw-r--r-- | 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; +} |