X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Fmach-o-i386.c;h=af8a6f3b9417576ed72ef20c08a8190f9914fa63;hb=9b8b325a1f4cdaf235e7d803849dde6ededec865;hp=b681352dd0a7c55133db2ec399a62046e29470fe;hpb=e1e81ed3c319f765df8a755a6b901df650a4e4a0;p=binutils-gdb.git diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c index b681352dd0a..af8a6f3b941 100644 --- a/bfd/mach-o-i386.c +++ b/bfd/mach-o-i386.c @@ -1,6 +1,5 @@ /* Intel i386 Mach-O support for BFD. - Copyright 2009 - Free Software Foundation, Inc. + Copyright (C) 2009-2015 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -97,6 +96,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 +119,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; } @@ -176,7 +210,8 @@ bfd_mach_o_i386_swap_reloc_out (arelent *rel, bfd_mach_o_reloc_info *rinfo) if ((*rel->sym_ptr_ptr)->flags & BSF_SECTION_SYM) { rinfo->r_extern = 0; - rinfo->r_value = (*rel->sym_ptr_ptr)->section->target_index; + rinfo->r_value = + (*rel->sym_ptr_ptr)->section->output_section->target_index; } else { @@ -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; @@ -335,7 +367,7 @@ static const mach_o_section_name_xlat import_section_names_xlat[] = { { ".picsymbol_stub3", "__jump_table", SEC_CODE | SEC_LOAD, BFD_MACH_O_S_SYMBOL_STUBS, - BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS + BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS | BFD_MACH_O_S_SELF_MODIFYING_CODE, 6}, { ".non_lazy_symbol_pointer_x86", "__pointers", @@ -359,12 +391,13 @@ const mach_o_segment_name_xlat mach_o_i386_segsec_names_xlat[] = #define bfd_mach_o_tgt_seg_table mach_o_i386_segsec_names_xlat #define bfd_mach_o_section_type_valid_for_tgt NULL -#define bfd_mach_o_bfd_reloc_type_lookup bfd_mach_o_i386_bfd_reloc_type_lookup +#define bfd_mach_o_bfd_reloc_type_lookup bfd_mach_o_i386_bfd_reloc_type_lookup #define bfd_mach_o_bfd_reloc_name_lookup bfd_mach_o_i386_bfd_reloc_name_lookup -#define TARGET_NAME mach_o_i386_vec +#define TARGET_NAME i386_mach_o_vec #define TARGET_STRING "mach-o-i386" #define TARGET_ARCHITECTURE bfd_arch_i386 +#define TARGET_PAGESIZE 4096 #define TARGET_BIG_ENDIAN 0 #define TARGET_ARCHIVE 0 #define TARGET_PRIORITY 0