PR binutils/22875: MIPS/ELF: Also fail with relocation placeholders

Do not consider placeholder EMPTY_HOWTO relocation entries valid in
`rtype_to_howto' MIPS handlers.  Instead issue an unsupported relocation
type error and return a NULL howto as with relocations outside the three
ISA-specific min-max ranges.

	bfd/
	* 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.
This commit is contained in:
Maciej W. Rozycki
2018-04-04 02:00:48 +01:00
parent 270baac007
commit 7ed6f92aaf
4 changed files with 58 additions and 38 deletions

View File

@ -1,3 +1,10 @@
2018-04-04 Maciej W. Rozycki <macro@mips.com>
* 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 <macro@mips.com> 2018-03-29 Maciej W. Rozycki <macro@mips.com>
* elf32-mips.c (mips_info_to_howto_rel): Remove the calls to * elf32-mips.c (mips_info_to_howto_rel): Remove the calls to

View File

@ -2198,6 +2198,8 @@ mips_elf32_rtype_to_howto (bfd *abfd,
unsigned int r_type, unsigned int r_type,
bfd_boolean rela_p ATTRIBUTE_UNUSED) bfd_boolean rela_p ATTRIBUTE_UNUSED)
{ {
reloc_howto_type *howto = NULL;
switch (r_type) switch (r_type)
{ {
case R_MIPS_GNU_VTINHERIT: case R_MIPS_GNU_VTINHERIT:
@ -2216,17 +2218,18 @@ mips_elf32_rtype_to_howto (bfd *abfd,
return &elf_mips_eh_howto; return &elf_mips_eh_howto;
default: default:
if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max) 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) if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
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 >= (unsigned int) R_MIPS_max) if (r_type < R_MIPS_max)
{ howto = &elf_mips_howto_table_rel[r_type];
_bfd_error_handler (_("%pB: unsupported relocation type %#x"), if (howto != NULL && howto->name != NULL)
abfd, r_type); return howto;
bfd_set_error (bfd_error_bad_value);
return NULL; _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
} abfd, r_type);
return &elf_mips_howto_table_rel[r_type]; bfd_set_error (bfd_error_bad_value);
return NULL;
} }
} }

View File

@ -3572,6 +3572,8 @@ bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
static reloc_howto_type * static reloc_howto_type *
mips_elf64_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p) mips_elf64_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
{ {
reloc_howto_type *howto = NULL;
switch (r_type) switch (r_type)
{ {
case R_MIPS_GNU_VTINHERIT: 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 (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
{ {
if (rela_p) if (rela_p)
return &micromips_elf64_howto_table_rela[r_type - R_MICROMIPS_min]; howto
= &micromips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
else else
return &micromips_elf64_howto_table_rel[r_type - R_MICROMIPS_min]; howto
= &micromips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
} }
if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max) if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
{ {
if (rela_p) 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 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"), if (rela_p)
abfd, r_type); howto = &mips_elf64_howto_table_rela[r_type];
bfd_set_error (bfd_error_bad_value); else
return NULL; howto = &mips_elf64_howto_table_rel[r_type];
} }
if (rela_p) if (howto != NULL && howto->name != NULL)
return &mips_elf64_howto_table_rela[r_type]; return howto;
else
return &mips_elf64_howto_table_rel[r_type]; _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
break; abfd, r_type);
bfd_set_error (bfd_error_bad_value);
return NULL;
} }
} }

View File

@ -3402,6 +3402,8 @@ bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
static reloc_howto_type * static reloc_howto_type *
mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p) mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
{ {
reloc_howto_type *howto = NULL;
switch (r_type) switch (r_type)
{ {
case R_MIPS_GNU_VTINHERIT: 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 (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
{ {
if (rela_p) 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 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 (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
{ {
if (rela_p) 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 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"), if (rela_p)
abfd, r_type); howto = &elf_mips_howto_table_rela[r_type];
bfd_set_error (bfd_error_bad_value); else
return NULL; howto = &elf_mips_howto_table_rel[r_type];
} }
if (rela_p) if (howto != NULL && howto->name != NULL)
return &elf_mips_howto_table_rela[r_type]; return howto;
else
return &elf_mips_howto_table_rel[r_type]; _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
break; abfd, r_type);
bfd_set_error (bfd_error_bad_value);
return NULL;
} }
} }