From 6639d37af3d5c9e6853f4e86115a701920550c6d Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Fri, 17 Feb 2012 11:23:44 +0000 Subject: [PATCH] support 16 sect-diffs for mach-o bfd: * mach-o-i386.c (i386_howto_table): Add support for 16 bit sect-diffs. (bfd_mach_o_i386_swap_reloc_in): Handle 16bit sect-diffs. (bfd_mach_o_i386_swap_reloc_out): Likewise. --- bfd/ChangeLog | 7 +++++ bfd/mach-o-i386.c | 76 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 61 insertions(+), 22 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b5b8a4b7f4..9447c637fd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2012-02-17 Iain Sandoe + + * mach-o-i386.c (i386_howto_table): Add support for 16 bit + sect-diffs. + (bfd_mach_o_i386_swap_reloc_in): Handle 16bit sect-diffs. + (bfd_mach_o_i386_swap_reloc_out): Likewise. + 2012-02-17 Tristan Gingold * reloc.c (BFD_RELOC_MACH_O_LOCAL_SECTDIFF): diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c index b681352dd0..e7688abfc7 100644 --- a/bfd/mach-o-i386.c +++ b/bfd/mach-o-i386.c @@ -97,6 +97,19 @@ static reloc_howto_type i386_howto_table[]= complain_overflow_bitfield, NULL, "PAIR_32", FALSE, 0xffffffff, 0xffffffff, FALSE), + /* 8 */ + HOWTO(BFD_RELOC_MACH_O_SECTDIFF, 0, 1, 16, FALSE, 0, + complain_overflow_bitfield, + NULL, "SECTDIFF_16", + FALSE, 0xffff, 0xffff, FALSE), + HOWTO(BFD_RELOC_MACH_O_LOCAL_SECTDIFF, 0, 1, 16, FALSE, 0, + complain_overflow_bitfield, + NULL, "LSECTDIFF_16", + FALSE, 0xffff, 0xffff, FALSE), + HOWTO(BFD_RELOC_MACH_O_PAIR, 0, 1, 16, FALSE, 0, + complain_overflow_bitfield, + NULL, "PAIR_16", + FALSE, 0xffff, 0xffff, FALSE), }; static bfd_boolean @@ -107,21 +120,43 @@ bfd_mach_o_i386_swap_reloc_in (arelent *res, bfd_mach_o_reloc_info *reloc) switch (reloc->r_type) { case BFD_MACH_O_GENERIC_RELOC_PAIR: - if (reloc->r_length != 2) - return FALSE; - res->howto = &i386_howto_table[7]; - res->address = res[-1].address; - return TRUE; + if (reloc->r_length == 2) + { + res->howto = &i386_howto_table[7]; + res->address = res[-1].address; + return TRUE; + } + else if (reloc->r_length == 1) + { + res->howto = &i386_howto_table[10]; + res->address = res[-1].address; + return TRUE; + } + return FALSE; case BFD_MACH_O_GENERIC_RELOC_SECTDIFF: - if (reloc->r_length != 2) - return FALSE; - res->howto = &i386_howto_table[5]; - return TRUE; + if (reloc->r_length == 2) + { + res->howto = &i386_howto_table[5]; + return TRUE; + } + else if (reloc->r_length == 1) + { + res->howto = &i386_howto_table[8]; + return TRUE; + } + return FALSE; case BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF: - if (reloc->r_length != 2) - return FALSE; - res->howto = &i386_howto_table[6]; - return TRUE; + if (reloc->r_length == 2) + { + res->howto = &i386_howto_table[6]; + return TRUE; + } + else if (reloc->r_length == 1) + { + res->howto = &i386_howto_table[9]; + return TRUE; + } + return FALSE; default: return FALSE; } @@ -188,29 +223,26 @@ bfd_mach_o_i386_swap_reloc_out (arelent *rel, bfd_mach_o_reloc_info *rinfo) rinfo->r_scattered = 1; rinfo->r_type = BFD_MACH_O_GENERIC_RELOC_SECTDIFF; rinfo->r_pcrel = 0; - rinfo->r_length = 2; + rinfo->r_length = rel->howto->size; rinfo->r_extern = 0; - rinfo->r_value = (*rel->sym_ptr_ptr)->value - + (*rel->sym_ptr_ptr)->section->vma; + rinfo->r_value = rel->addend; break; case BFD_RELOC_MACH_O_LOCAL_SECTDIFF: rinfo->r_scattered = 1; rinfo->r_type = BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF; rinfo->r_pcrel = 0; - rinfo->r_length = 2; + rinfo->r_length = rel->howto->size; rinfo->r_extern = 0; - rinfo->r_value = (*rel->sym_ptr_ptr)->value - + (*rel->sym_ptr_ptr)->section->vma; + rinfo->r_value = rel->addend; break; case BFD_RELOC_MACH_O_PAIR: rinfo->r_address = 0; rinfo->r_scattered = 1; rinfo->r_type = BFD_MACH_O_GENERIC_RELOC_PAIR; rinfo->r_pcrel = 0; - rinfo->r_length = 2; + rinfo->r_length = rel->howto->size; rinfo->r_extern = 0; - rinfo->r_value = (*rel->sym_ptr_ptr)->value - + (*rel->sym_ptr_ptr)->section->vma; + rinfo->r_value = rel->addend; break; default: return FALSE; -- 2.34.1