mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-23 19:50:13 +08:00
PR binutils/22875: i860/ELF: Report unsupported relocation types
Complement commit f3185997ac09 ("PR 22875: Stop strip corrupting unknown relocs"), <https://sourceware.org/ml/binutils/2018-02/msg00445.html>, and also set the `bfd_error_bad_value' error and report an unsupported relocation type if a howto lookup fails with the i860 backend, fixing a confusing `no error' error message and removing a binutils test failure: failed with: <.../binutils/strip-new: tmpdir/bintest.o: no error>, expected: <.* bad value> .../binutils/strip-new: tmpdir/bintest.o: no error FAIL: binutils-all/strip-13 with the `i860-stardent-elf' target. bfd/ * elf32-i860.c (lookup_howto): Add `abfd' parameter. Set the `bfd_error_bad_value' error and call `_bfd_error_handler' on a howto lookup failure. (elf32_i860_reloc_type_lookup): Adjust `lookup_howto' call accordingly. (elf32_i860_info_to_howto_rela): Likewise. (elf32_i860_relocate_splitn): Likewise. (elf32_i860_relocate_pc16): Likewise. (elf32_i860_relocate_pc26): Likewise. (elf32_i860_relocate_section): Likewise.
This commit is contained in:
@ -1,3 +1,16 @@
|
|||||||
|
2018-04-04 Maciej W. Rozycki <macro@mips.com>
|
||||||
|
|
||||||
|
* elf32-i860.c (lookup_howto): Add `abfd' parameter. Set the
|
||||||
|
`bfd_error_bad_value' error and call `_bfd_error_handler' on a
|
||||||
|
howto lookup failure.
|
||||||
|
(elf32_i860_reloc_type_lookup): Adjust `lookup_howto' call
|
||||||
|
accordingly.
|
||||||
|
(elf32_i860_info_to_howto_rela): Likewise.
|
||||||
|
(elf32_i860_relocate_splitn): Likewise.
|
||||||
|
(elf32_i860_relocate_pc16): Likewise.
|
||||||
|
(elf32_i860_relocate_pc26): Likewise.
|
||||||
|
(elf32_i860_relocate_section): Likewise.
|
||||||
|
|
||||||
2018-04-04 Maciej W. Rozycki <macro@mips.com>
|
2018-04-04 Maciej W. Rozycki <macro@mips.com>
|
||||||
|
|
||||||
* elf32-visium.c (visium_info_to_howto_rela): Correct the range
|
* elf32-visium.c (visium_info_to_howto_rela): Correct the range
|
||||||
|
@ -745,12 +745,13 @@ static reloc_howto_type elf32_i860_howto_table [] =
|
|||||||
static unsigned char elf_code_to_howto_index[R_860_max + 1];
|
static unsigned char elf_code_to_howto_index[R_860_max + 1];
|
||||||
|
|
||||||
static reloc_howto_type *
|
static reloc_howto_type *
|
||||||
lookup_howto (unsigned int rtype)
|
lookup_howto (bfd *abfd, unsigned int rtype)
|
||||||
{
|
{
|
||||||
static int initialized = 0;
|
static int initialized = 0;
|
||||||
int i;
|
int i;
|
||||||
int howto_tbl_size = (int) (sizeof (elf32_i860_howto_table)
|
int howto_tbl_size = (int) (sizeof (elf32_i860_howto_table)
|
||||||
/ sizeof (elf32_i860_howto_table[0]));
|
/ sizeof (elf32_i860_howto_table[0]));
|
||||||
|
reloc_howto_type *howto = NULL;
|
||||||
|
|
||||||
if (! initialized)
|
if (! initialized)
|
||||||
{
|
{
|
||||||
@ -761,18 +762,24 @@ lookup_howto (unsigned int rtype)
|
|||||||
elf_code_to_howto_index[elf32_i860_howto_table[i].type] = i;
|
elf_code_to_howto_index[elf32_i860_howto_table[i].type] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtype > R_860_max)
|
if (rtype < R_860_max)
|
||||||
return NULL;
|
{
|
||||||
i = elf_code_to_howto_index[rtype];
|
i = elf_code_to_howto_index[rtype];
|
||||||
if (i >= howto_tbl_size)
|
if (i < howto_tbl_size)
|
||||||
return NULL;
|
howto = elf32_i860_howto_table + i;
|
||||||
return elf32_i860_howto_table + i;
|
}
|
||||||
|
if (howto == NULL)
|
||||||
|
{
|
||||||
|
_bfd_error_handler (_("%pB: unsupported relocation type %#x"),
|
||||||
|
abfd, rtype);
|
||||||
|
bfd_set_error (bfd_error_bad_value);
|
||||||
|
}
|
||||||
|
return howto;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given a BFD reloc, return the matching HOWTO structure. */
|
/* Given a BFD reloc, return the matching HOWTO structure. */
|
||||||
static reloc_howto_type *
|
static reloc_howto_type *
|
||||||
elf32_i860_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
elf32_i860_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
|
||||||
bfd_reloc_code_real_type code)
|
|
||||||
{
|
{
|
||||||
unsigned int rtype;
|
unsigned int rtype;
|
||||||
|
|
||||||
@ -883,7 +890,7 @@ elf32_i860_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
|||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return lookup_howto (rtype);
|
return lookup_howto (abfd, rtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
static reloc_howto_type *
|
static reloc_howto_type *
|
||||||
@ -906,12 +913,12 @@ elf32_i860_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
|||||||
/* Given a ELF reloc, return the matching HOWTO structure. */
|
/* Given a ELF reloc, return the matching HOWTO structure. */
|
||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
elf32_i860_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
|
elf32_i860_info_to_howto_rela (bfd *abfd,
|
||||||
arelent *bfd_reloc,
|
arelent *bfd_reloc,
|
||||||
Elf_Internal_Rela *elf_reloc)
|
Elf_Internal_Rela *elf_reloc)
|
||||||
{
|
{
|
||||||
bfd_reloc->howto
|
bfd_reloc->howto
|
||||||
= lookup_howto ((unsigned) ELF32_R_TYPE (elf_reloc->r_info));
|
= lookup_howto (abfd, (unsigned) ELF32_R_TYPE (elf_reloc->r_info));
|
||||||
return bfd_reloc->howto != NULL;
|
return bfd_reloc->howto != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -925,7 +932,7 @@ elf32_i860_relocate_splitn (bfd *input_bfd,
|
|||||||
{
|
{
|
||||||
bfd_vma insn;
|
bfd_vma insn;
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
||||||
howto = lookup_howto ((unsigned) ELF32_R_TYPE (rello->r_info));
|
howto = lookup_howto (input_bfd, (unsigned) ELF32_R_TYPE (rello->r_info));
|
||||||
insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
|
insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
|
||||||
|
|
||||||
/* Relocate. */
|
/* Relocate. */
|
||||||
@ -951,7 +958,7 @@ elf32_i860_relocate_pc16 (bfd *input_bfd,
|
|||||||
{
|
{
|
||||||
bfd_vma insn;
|
bfd_vma insn;
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
||||||
howto = lookup_howto ((unsigned) ELF32_R_TYPE (rello->r_info));
|
howto = lookup_howto (input_bfd, (unsigned) ELF32_R_TYPE (rello->r_info));
|
||||||
insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
|
insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
|
||||||
|
|
||||||
/* Adjust for PC-relative relocation. */
|
/* Adjust for PC-relative relocation. */
|
||||||
@ -983,7 +990,7 @@ elf32_i860_relocate_pc26 (bfd *input_bfd,
|
|||||||
{
|
{
|
||||||
bfd_vma insn;
|
bfd_vma insn;
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
||||||
howto = lookup_howto ((unsigned) ELF32_R_TYPE (rello->r_info));
|
howto = lookup_howto (input_bfd, (unsigned) ELF32_R_TYPE (rello->r_info));
|
||||||
insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
|
insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
|
||||||
|
|
||||||
/* Adjust for PC-relative relocation. */
|
/* Adjust for PC-relative relocation. */
|
||||||
@ -1104,7 +1111,7 @@ elf32_i860_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|||||||
r_type = ELF32_R_TYPE (rel->r_info);
|
r_type = ELF32_R_TYPE (rel->r_info);
|
||||||
r_symndx = ELF32_R_SYM (rel->r_info);
|
r_symndx = ELF32_R_SYM (rel->r_info);
|
||||||
|
|
||||||
howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info));
|
howto = lookup_howto (input_bfd, (unsigned) ELF32_R_TYPE (rel->r_info));
|
||||||
h = NULL;
|
h = NULL;
|
||||||
sym = NULL;
|
sym = NULL;
|
||||||
sec = NULL;
|
sec = NULL;
|
||||||
|
Reference in New Issue
Block a user