diff options
author | iains <iains> | 2012-02-17 11:23:43 +0000 |
---|---|---|
committer | iains <iains> | 2012-02-17 11:23:43 +0000 |
commit | 29c4be2d9344b923f6df7adc4d63f431e3eed760 (patch) | |
tree | 84e015dde5a42bc82ca961273aac8df75f3bbc07 /bfd/mach-o-i386.c | |
parent | 9030c11c2d78450dab13fef750a8c2605e8f0ea4 (diff) | |
download | binutils-redhat-29c4be2d9344b923f6df7adc4d63f431e3eed760.tar.gz |
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.
Diffstat (limited to 'bfd/mach-o-i386.c')
-rw-r--r-- | bfd/mach-o-i386.c | 76 |
1 files changed, 54 insertions, 22 deletions
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; |