From 57698478b75319a962b899c3f8d3a03baa5eaab4 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 8 Jun 2022 09:49:09 +0930 Subject: Don't encode reloc.size I expect the encoded reloc.size field originally came from aout r_length ecoding, but somehow went wrong for 64-bit relocs (which should have been encoded as 3). Toss all that out, just use a byte size instead. The changes outside of reloc.c in this patch should make the code independent of how reloc.size is encoded. * reloc.c (struct reloc_howto_struct): Increase size field by one bit. Comment. (HOWTO_RSIZE): Don't encode size. (bfd_get_reloc_size): Adjust, and make it an inline function. (read_reloc, write_reloc): Adjust. * bfd-in2.h: Regenerate. * aout-ns32k.c: Include libbfd.h. (put_reloc): Don't use howto->size directly. Calculate r_length using bfd_log2 and bfd_get_reloc_size. * aoutx.h (swap_std_reloc_out): Likewise. (aout_link_reloc_link_order): Likewise. * i386lynx.c (swap_std_reloc_out * mach-o-i386.c (bfd_mach_o_i386_swap_reloc_out * pdp11.c (aout_link_reloc_link_order * coff-arm.c (coff_arm_reloc): Don't use howto->size directly, use bfd_get_reloc_size instead and adjust switch cases. * coff-i386.c (coff_i386_reloc): Similarly. * coff-x86_64.c (coff_amd64_reloc): Likewise. * cpu-ns32k.c (do_ns32k_reloc): Likewise. * elf32-arc.c (arc_do_relocation): Likewise. * elf32-arm.c (elf32_arm_final_link_relocate): Likewise. * elf32-bfin.c (bfin_bfd_reloc): Likewise. * elf32-cr16.c (cr16_elf_final_link_relocate): Likewise. * elf32-cris.c (cris_elf_pcrel_reloc): Likewise. * elf32-crx.c (crx_elf_final_link_relocate): Likewise. * elf32-csky.c (csky_elf_relocate_section): Likewise. * elf32-d10v.c (extract_rel_addend, insert_rel_addend): Likewise. * elf32-i386.c (elf_i386_relocate_section): Likewise. * elf32-m32r.c (m32r_elf_generic_reloc): Likewise. * elf32-nds32.c (nds32_elf_generic_reloc): Likewise. * syms.c (_bfd_stab_section_find_nearest_line): Likewise. * coff-rs6000.c (xcoff_ppc_relocate_section): Adjust howto.size. * coff64-rs6000.c (xcoff64_ppc_relocate_section): Likewise. --- bfd/cpu-ns32k.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'bfd/cpu-ns32k.c') diff --git a/bfd/cpu-ns32k.c b/bfd/cpu-ns32k.c index feffd48..17f06c2 100644 --- a/bfd/cpu-ns32k.c +++ b/bfd/cpu-ns32k.c @@ -508,9 +508,12 @@ do_ns32k_reloc (bfd * abfd, x = ( (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask)) location = (bfd_byte *) data + addr; - switch (howto->size) + switch (bfd_get_reloc_size (howto)) { case 0: + break; + + case 1: { bfd_vma x = get_data (location, 1); DOIT (x); @@ -518,7 +521,7 @@ do_ns32k_reloc (bfd * abfd, } break; - case 1: + case 2: if (relocation) { bfd_vma x = get_data (location, 2); @@ -526,7 +529,7 @@ do_ns32k_reloc (bfd * abfd, put_data ((bfd_vma) x, location, 2); } break; - case 2: + case 4: if (relocation) { bfd_vma x = get_data (location, 4); @@ -535,11 +538,7 @@ do_ns32k_reloc (bfd * abfd, } break; - case 3: - /* Do nothing. */ - break; - - case 4: + case 8: #ifdef BFD64 if (relocation) { -- cgit v1.1