aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf-hppa.h
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@mips.com>2018-04-04 02:00:49 +0100
committerMaciej W. Rozycki <macro@mips.com>2018-04-04 02:00:49 +0100
commit8ee55178c22326c3624ad5872dc5382341ddcd2c (patch)
treeed5170a757ce1f4764ff17d5c321fadbef7b4b4d /bfd/elf-hppa.h
parent5d7c8b80485d75242e7c78e79b3ecb4c71abaee3 (diff)
downloadfsf-binutils-gdb-8ee55178c22326c3624ad5872dc5382341ddcd2c.zip
fsf-binutils-gdb-8ee55178c22326c3624ad5872dc5382341ddcd2c.tar.gz
fsf-binutils-gdb-8ee55178c22326c3624ad5872dc5382341ddcd2c.tar.bz2
PR binutils/22875: HPPA/ELF: Also fail with relocation placeholders
Do not consider R_PARISC_UNIMPLEMENTED placeholder relocation entries of the `elf_hppa_howto_table' table valid in `info_to_howto' HPPA handlers. Instead issue an unsupported relocation type error and return a NULL howto as with relocations whose number is R_PARISC_UNIMPLEMENTED or beyond. bfd/ * elf-hppa.h (elf_hppa_info_to_howto): Also return unsuccessfully for unimplemented relocations. (elf_hppa_info_to_howto_rel): Likewise.
Diffstat (limited to 'bfd/elf-hppa.h')
-rw-r--r--bfd/elf-hppa.h23
1 files changed, 18 insertions, 5 deletions
diff --git a/bfd/elf-hppa.h b/bfd/elf-hppa.h
index 59c0c4f..f23f788 100644
--- a/bfd/elf-hppa.h
+++ b/bfd/elf-hppa.h
@@ -1026,8 +1026,15 @@ elf_hppa_info_to_howto (bfd *abfd,
Elf_Internal_Rela *elf_reloc)
{
unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info);
+ unsigned int type = r_type;
+ reloc_howto_type *howto;
- if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
+ if (r_type < (unsigned int) R_PARISC_UNIMPLEMENTED)
+ {
+ howto = &elf_hppa_howto_table[r_type];
+ type = howto->type;
+ }
+ if (type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
{
/* xgettext:c-format */
_bfd_error_handler (_("%pB: unsupported relocation type %#x"),
@@ -1035,7 +1042,7 @@ elf_hppa_info_to_howto (bfd *abfd,
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
- bfd_reloc->howto = &elf_hppa_howto_table[r_type];
+ bfd_reloc->howto = howto;
return TRUE;
}
@@ -1047,8 +1054,15 @@ elf_hppa_info_to_howto_rel (bfd *abfd,
Elf_Internal_Rela *elf_reloc)
{
unsigned int r_type = ELF_R_TYPE (elf_reloc->r_info);
+ unsigned int type = r_type;
+ reloc_howto_type *howto;
- if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
+ if (r_type < (unsigned int) R_PARISC_UNIMPLEMENTED)
+ {
+ howto = &elf_hppa_howto_table[r_type];
+ type = howto->type;
+ }
+ if (type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
{
/* xgettext:c-format */
_bfd_error_handler (_("%pB: unsupported relocation type %#x"),
@@ -1056,8 +1070,7 @@ elf_hppa_info_to_howto_rel (bfd *abfd,
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
-
- bfd_reloc->howto = &elf_hppa_howto_table[r_type];
+ bfd_reloc->howto = howto;
return TRUE;
}