diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 925310e792..c5e0a91ab7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2018-04-04 Maciej W. Rozycki + + * elf32-mips.c (mips_elf32_rtype_to_howto): Also return + unsuccessfully for placeholder howtos. + * elf64-mips.c (mips_elf64_rtype_to_howto): Likewise. + * elfn32-mips.c (mips_elf_n32_rtype_to_howto): Likewise. + 2018-03-29 Maciej W. Rozycki * elf32-mips.c (mips_info_to_howto_rel): Remove the calls to diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index c3c96a4d6a..87147b5c4f 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -2198,6 +2198,8 @@ mips_elf32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p ATTRIBUTE_UNUSED) { + reloc_howto_type *howto = NULL; + switch (r_type) { case R_MIPS_GNU_VTINHERIT: @@ -2216,17 +2218,18 @@ mips_elf32_rtype_to_howto (bfd *abfd, return &elf_mips_eh_howto; default: if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max) - return &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min]; + howto = &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min]; if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max) - return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min]; - if (r_type >= (unsigned int) R_MIPS_max) - { - _bfd_error_handler (_("%pB: unsupported relocation type %#x"), - abfd, r_type); - bfd_set_error (bfd_error_bad_value); - return NULL; - } - return &elf_mips_howto_table_rel[r_type]; + howto = &elf_mips16_howto_table_rel[r_type - R_MIPS16_min]; + if (r_type < R_MIPS_max) + howto = &elf_mips_howto_table_rel[r_type]; + if (howto != NULL && howto->name != NULL) + return howto; + + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return NULL; } } diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 9501613d25..115047f32c 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -3572,6 +3572,8 @@ bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, static reloc_howto_type * mips_elf64_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p) { + reloc_howto_type *howto = NULL; + switch (r_type) { case R_MIPS_GNU_VTINHERIT: @@ -3595,29 +3597,33 @@ mips_elf64_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p) if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max) { if (rela_p) - return µmips_elf64_howto_table_rela[r_type - R_MICROMIPS_min]; + howto + = µmips_elf64_howto_table_rela[r_type - R_MICROMIPS_min]; else - return µmips_elf64_howto_table_rel[r_type - R_MICROMIPS_min]; + howto + = µmips_elf64_howto_table_rel[r_type - R_MICROMIPS_min]; } if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max) { if (rela_p) - return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min]; + howto = &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min]; else - return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min]; + howto = &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min]; } - if (r_type >= R_MIPS_max) + if (r_type < R_MIPS_max) { - _bfd_error_handler (_("%pB: unsupported relocation type %#x"), - abfd, r_type); - bfd_set_error (bfd_error_bad_value); - return NULL; + if (rela_p) + howto = &mips_elf64_howto_table_rela[r_type]; + else + howto = &mips_elf64_howto_table_rel[r_type]; } - if (rela_p) - return &mips_elf64_howto_table_rela[r_type]; - else - return &mips_elf64_howto_table_rel[r_type]; - break; + if (howto != NULL && howto->name != NULL) + return howto; + + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return NULL; } } diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index 076bec165d..99c14e7f55 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -3402,6 +3402,8 @@ bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, static reloc_howto_type * mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p) { + reloc_howto_type *howto = NULL; + switch (r_type) { case R_MIPS_GNU_VTINHERIT: @@ -3425,29 +3427,31 @@ mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p) if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max) { if (rela_p) - return &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min]; + howto = &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min]; else - return &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min]; + howto = &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min]; } if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max) { if (rela_p) - return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min]; + howto = &elf_mips16_howto_table_rela[r_type - R_MIPS16_min]; else - return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min]; + howto = &elf_mips16_howto_table_rel[r_type - R_MIPS16_min]; } - if (r_type >= R_MIPS_max) + if (r_type < R_MIPS_max) { - _bfd_error_handler (_("%pB: unsupported relocation type %#x"), - abfd, r_type); - bfd_set_error (bfd_error_bad_value); - return NULL; + if (rela_p) + howto = &elf_mips_howto_table_rela[r_type]; + else + howto = &elf_mips_howto_table_rel[r_type]; } - if (rela_p) - return &elf_mips_howto_table_rela[r_type]; - else - return &elf_mips_howto_table_rel[r_type]; - break; + if (howto != NULL && howto->name != NULL) + return howto; + + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return NULL; } }