mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-05 23:26:51 +08:00
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:
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 µmips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
|
howto
|
||||||
|
= µmips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
|
||||||
else
|
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 (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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user