[binutils-gdb/binutils-2_42-branch] hppa: Fix handling of relocations that apply to data
John David Anglin
danglin@sourceware.org
Sun Jul 14 11:25:31 GMT 2024
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=92cc764e58fac1c0c5c9e5c7a7547fbd9e7dcfd4
commit 92cc764e58fac1c0c5c9e5c7a7547fbd9e7dcfd4
Author: John David Anglin <danglin@gcc.gnu.org>
Date: Sun Jul 14 07:22:13 2024 -0400
hppa: Fix handling of relocations that apply to data
Commit d125f9675372b1ae01ceb1893c06ccb27bc7bf22 introduced a bug
in handling relocations for data. The R_PARISC_DIR32 relocation
operates on 32-bit data and not instructions. The HOWTO table
needs to be used to determine the format of relocations that apply
to data. The R_PARISC_SEGBASE relocation is another special case
as it only changes segment base.
This was noticed in Debian cmor package build.
2024-07-14 John David Anglin <danglin@gcc.gnu.org>
bfd/ChangeLog:
* elf32-hppa.c (final_link_relocate): Use HOWTO table to
determine reload format for relocations that apply to data.
Diff:
---
bfd/elf32-hppa.c | 88 ++++++++++++++++++++++++++++++++------------------------
1 file changed, 51 insertions(+), 37 deletions(-)
diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index 99ec7890465..c2a7ad98209 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -3432,48 +3432,62 @@ final_link_relocate (asection *input_section,
break;
}
- r_format = bfd_hppa_insn2fmt (input_bfd, insn);
- switch (r_format)
+ switch (r_type)
{
- case 10:
- case -10:
- if (val & 7)
- {
- _bfd_error_handler
- /* xgettext:c-format */
- (_("%pB(%pA+%#" PRIx64 "): displacement %#x for insn %#x "
- "is not a multiple of 8 (gp %#x)"),
- input_bfd,
- input_section,
- (uint64_t) offset,
- val,
- insn,
- (unsigned int) elf_gp (input_section->output_section->owner));
- bfd_set_error (bfd_error_bad_value);
- return bfd_reloc_notsupported;
- }
+ case R_PARISC_DIR32:
+ case R_PARISC_SECREL32:
+ case R_PARISC_SEGBASE:
+ case R_PARISC_SEGREL32:
+ case R_PARISC_PLABEL32:
+ /* These relocations apply to data. */
+ r_format = howto->bitsize;
break;
- case -11:
- case -16:
- if (val & 3)
+ default:
+ r_format = bfd_hppa_insn2fmt (input_bfd, insn);
+ switch (r_format)
{
- _bfd_error_handler
- /* xgettext:c-format */
- (_("%pB(%pA+%#" PRIx64 "): displacement %#x for insn %#x "
- "is not a multiple of 4 (gp %#x)"),
- input_bfd,
- input_section,
- (uint64_t) offset,
- val,
- insn,
- (unsigned int) elf_gp (input_section->output_section->owner));
- bfd_set_error (bfd_error_bad_value);
- return bfd_reloc_notsupported;
- }
- break;
+ case 10:
+ case -10:
+ if (val & 7)
+ {
+ _bfd_error_handler
+ /* xgettext:c-format */
+ (_("%pB(%pA+%#" PRIx64 "): displacement %#x for insn %#x "
+ "is not a multiple of 8 (gp %#x)"),
+ input_bfd,
+ input_section,
+ (uint64_t) offset,
+ val,
+ insn,
+ (unsigned int) elf_gp (input_section->output_section->owner));
+ bfd_set_error (bfd_error_bad_value);
+ return bfd_reloc_notsupported;
+ }
+ break;
- default:
+ case -11:
+ case -16:
+ if (val & 3)
+ {
+ _bfd_error_handler
+ /* xgettext:c-format */
+ (_("%pB(%pA+%#" PRIx64 "): displacement %#x for insn %#x "
+ "is not a multiple of 4 (gp %#x)"),
+ input_bfd,
+ input_section,
+ (uint64_t) offset,
+ val,
+ insn,
+ (unsigned int) elf_gp (input_section->output_section->owner));
+ bfd_set_error (bfd_error_bad_value);
+ return bfd_reloc_notsupported;
+ }
+ break;
+
+ default:
+ break;
+ }
break;
}
insn = hppa_rebuild_insn (insn, val, r_format);
More information about the Binutils-cvs
mailing list