From dfa85db14c5e64530200b166044fa7f01f61bd28 Mon Sep 17 00:00:00 2001 From: Gunther Nikl Date: Wed, 29 Apr 2020 14:42:41 +0100 Subject: [PATCH] bfd: Fix 64-bit relocation handling for a.out * aoutx.h (swap_std_reloc_out): Special case 64 bit relocations. (aout_link_reloc_link_order): Likewise. Make r_length an unsigned. --- bfd/ChangeLog | 5 +++++ bfd/aoutx.h | 14 +++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 054aa32745b..31e8526da9f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2020-04-29 Gunther Nikl + + * aoutx.h (swap_std_reloc_out): Special case 64 bit relocations. + (aout_link_reloc_link_order): Likewise. Make r_length an unsigned. + 2020-04-28 Alan Modra * vms-alpha.c (_bfd_vms_slurp_etir): Correct divide by zero check. diff --git a/bfd/aoutx.h b/bfd/aoutx.h index 41ced3dc72a..d5457461ab0 100644 --- a/bfd/aoutx.h +++ b/bfd/aoutx.h @@ -1945,7 +1945,12 @@ NAME (aout, swap_std_reloc_out) (bfd *abfd, PUT_WORD (abfd, g->address, natptr->r_address); BFD_ASSERT (g->howto != NULL); - r_length = g->howto->size ; /* Size as a power of two. */ + + if (bfd_get_reloc_size (g->howto) != 8) + r_length = g->howto->size; /* Size as a power of two. */ + else + r_length = 3; + r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */ /* XXX This relies on relocs coming from a.out files. */ r_baserel = (g->howto->type & 8) != 0; @@ -3803,13 +3808,16 @@ aout_link_reloc_link_order (struct aout_final_link_info *flaginfo, int r_baserel; int r_jmptable; int r_relative; - int r_length; + unsigned int r_length; r_pcrel = (int) howto->pc_relative; r_baserel = (howto->type & 8) != 0; r_jmptable = (howto->type & 16) != 0; r_relative = (howto->type & 32) != 0; - r_length = howto->size; + if (bfd_get_reloc_size (howto) != 8) + r_length = howto->size; /* Size as a power of two. */ + else + r_length = 3; PUT_WORD (flaginfo->output_bfd, p->offset, srel.r_address); if (bfd_header_big_endian (flaginfo->output_bfd)) -- 2.30.2