From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25221 invoked by alias); 12 Jun 2009 22:31:16 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 25168 invoked by uid 9674); 12 Jun 2009 22:31:16 -0000 Date: Fri, 12 Jun 2009 22:31:00 -0000 Message-ID: <20090612223116.25153.qmail@sourceware.org> From: jkratoch@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] archer-jankratochvil-type-refcount: Merge commit 'origin/master' into archer-jankratochvil-type-refcount X-Git-Refname: refs/heads/archer-jankratochvil-type-refcount X-Git-Reftype: branch X-Git-Oldrev: d6581ecbcc8edd7dadfb44093baba0d996f14aea X-Git-Newrev: 5ab462f150488aee69b94ca1755daef0c8d8007e X-SW-Source: 2009-q2/txt/msg00113.txt.bz2 List-Id: The branch, archer-jankratochvil-type-refcount has been updated via 5ab462f150488aee69b94ca1755daef0c8d8007e (commit) via 4dbe3c7a9fcacfc9810c912b813a7a07d0ff92e7 (commit) via 81ebf370fe37f61ac55bd3ff64d66901b83696cd (commit) via a898a7b200a3a31a35be65ac4f68413d7b579ecb (commit) via c4ad487cb16d25add8ac9c0d38367ca5ed3a8794 (commit) via 670f24233bbc15fb62dee9c2267c0f22cd03fa71 (commit) via 4688c31093f8962806654ccd6cd187f76449ded2 (commit) via 6414d6c855497a8c05f9e4935a311f10e4ee81f9 (commit) via 0f3afabfe95cacbf8b1d7db284de829a96094024 (commit) via b582291f6c898df361ee26a5113840cd0f4044cf (commit) via 394c61d68264eac8322c7b0cbfc093cf8443b354 (commit) via cfdd89a769cd42d58a977fb0bfe40889bb8b24a1 (commit) via 1b9ca31e68bae8bc9703c0a98b8f7157324cd385 (commit) via be645e778f859b9b996db0183fc9deb170674089 (commit) via ced391d639e9bbb85e780151564a6c4e3b446f5e (commit) via d196776a2091735a10f1b213109ba71dd9b38e38 (commit) via cfbc53184b215a037f70aad8a49b87c7ae12dba0 (commit) via a4170828dee49f1d714b927d8d58d752f718b8ec (commit) via 259b8197d9883301ed0e36eb7e87f84f08235900 (commit) via 8da72197d2fed63f540484293da013c0d2a02336 (commit) via fba47fc03c10e74afaa069c1f7504f63726ebf0e (commit) via 7384699a5c819053f57177435ee075901c6b27ac (commit) via 86a6fd26ded3abdd8477fadac88c2f0d8fbd103d (commit) via 82c47ca870a245321b4e0d5be676e869c6478cdb (commit) via 27305e21926948d6b1ed549d6755521dcb898936 (commit) via 2565059a0d631e781bb78bb5d293156e18918e31 (commit) via af3f233a276344d8c817a6d998b88f90f4631e08 (commit) via a28e0e5db7cd184b4e4af290df6e7289fd20049f (commit) via 335f903bd2270007d89537d49ed1e19240d0d336 (commit) from d6581ecbcc8edd7dadfb44093baba0d996f14aea (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 5ab462f150488aee69b94ca1755daef0c8d8007e Merge: d6581ecbcc8edd7dadfb44093baba0d996f14aea 4dbe3c7a9fcacfc9810c912b813a7a07d0ff92e7 Author: Jan Kratochvil Date: Sat Jun 13 00:31:06 2009 +0200 Merge commit 'origin/master' into archer-jankratochvil-type-refcount ----------------------------------------------------------------------- Summary of changes: bfd/ChangeLog | 144 +++++++++++++ bfd/bfd-in2.h | 12 + bfd/bfdio.c | 30 +++ bfd/cache.c | 34 +++- bfd/elf32-arm.c | 13 +- bfd/elf32-moxie.c | 21 ++- bfd/libbfd.h | 7 + bfd/mach-o-i386.c | 164 +++++++++++++++- bfd/mach-o-target.c | 17 ++- bfd/mach-o.c | 508 ++++++++++++++++++++++++++++++++-------------- bfd/mach-o.h | 167 +++++++++++++-- bfd/opncls.c | 79 ++++---- bfd/reloc.c | 16 ++ bfd/version.h | 2 +- gdb/ChangeLog | 106 ++++++++++ gdb/NEWS | 5 + gdb/breakpoint.c | 101 +++++----- gdb/darwin-nat.c | 4 +- gdb/doc/ChangeLog | 5 + gdb/doc/gdb.texinfo | 30 +++ gdb/dwarf2read.c | 5 + gdb/eval.c | 10 +- gdb/exec.c | 21 -- gdb/exec.h | 10 +- gdb/i386-nto-tdep.c | 136 +++++++++--- gdb/inferior.c | 30 +++- gdb/inferior.h | 2 + gdb/infrun.c | 84 +++++++-- gdb/nto-tdep.c | 34 --- gdb/nto-tdep.h | 11 - gdb/symtab.c | 2 - gdb/varobj.c | 2 +- gdb/version.in | 2 +- include/elf/ChangeLog | 4 + include/elf/moxie.h | 1 + include/opcode/ChangeLog | 5 + include/opcode/moxie.h | 8 +- opcodes/ChangeLog | 7 + opcodes/moxie-dis.c | 9 +- opcodes/moxie-opc.c | 49 +++-- sim/moxie/ChangeLog | 5 + sim/moxie/interp.c | 220 +++++++++----------- 42 files changed, 1573 insertions(+), 549 deletions(-) First 500 lines of diff: diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 296493b..7f1ce47 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,147 @@ +2009-06-10 Philip Blundell + + * elf32-arm.c (elf32_arm_fix_exidx_coverage): Avoid crash if + elf_sec->this_hdr == NULL. + +2009-06-12 Tristan Gingold + + * reloc.c: Add BFD_RELOC_MACH_O_SECTDIFF and BFD_RELOC_MACH_O_PAIR. + * bfd-in2.h: Regenerated. + * libbfd.h: Regenerated. + + * mach-o.c (FILE_ALIGN): New macro. + (bfd_mach_o_canonicalize_symtab): Adjust for bfd_mach_o_asymbol. + (bfd_mach_o_print_symbol): Ditto. + (bfd_mach_o_scan_write_thread): Adjust type of variable offset. + (bfd_mach_o_get_reloc_upper_bound): New function. + (bfd_mach_o_canonicalize_reloc): Ditto. + (bfd_mach_o_scan_write_relocs): Ditto. + (bfd_mach_o_scan_write_section_32): Remove offset argument. + (bfd_mach_o_scan_write_section_64): Ditto. + (bfd_mach_o_scan_write_segment_32): Write relocs. Fix size of data + written for load command. Do not compute section file offset. + (bfd_mach_o_scan_write_segment_64): Ditto. + (bfd_mach_o_scan_write_symtab): Compute file offset first. + Adjust for bfd_mach_o_asymbol. Move code to convert from BFD to + Mach-O to ... + (bfd_mach_o_mangle_symbols): ... this new function. + (bfd_mach_o_write_contents): Be sure to habe load commands built. + Call bfd_mach_o_mangle_symbols. + (bfd_mach_o_build_commands): Adjust for filelen field. + Use FILE_ALIGN macro. Clear section file offset if section is empty. + Do not set symtab file offset anymore here. + (bfd_mach_o_make_empty_symbol): Allocate a bfd_mach_o_asymbol. + (bfd_mach_o_make_bfd_section): Set SEC_RELOC if has reloc. + Set reloc_count and rel_filepos section fields. + (bfd_mach_o_scan_read_section_32): Type of argument offset is now + unsigned int. + (bfd_mach_o_scan_read_section_64): Ditto. + (bfd_mach_o_scan_read_section): Ditto. + (bfd_mach_o_scan_read_symtab_symbol): Typr of argument s is now + bfd_mach_o_asymbol. Use unsigned int for file offset type. + (bfd_mach_o_scan_read_symtab_symbol): Adjust for bfd_mach_o_asymbol. + Handle weak-ref symbols. + (bfd_mach_o_scan_read_symtab_symbols): Adjust for bfd_mach_o_asymbol. + (bfd_mach_o_scan_read_dysymtab_symbol): Ditto. + (bfd_mach_o_scan): Remove assignment to removed field. + (bfd_mach_o_mkobject_init): Ditto. + (bfd_mach_o_bfd_print_private_bfd_data): Adjust printf formatter. + (bfd_mach_o_bfd_reloc_type_lookup): New macro. + (bfd_mach_o_bfd_reloc_name_lookup): Ditto. + (bfd_mach_o_swap_reloc_in): Ditto. + (bfd_mach_o_swap_reloc_out): Ditto. + + * mach-o.h (BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY) + (BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY) + (BFD_MACH_O_REFERENCE_FLAG_DEFINED) + (BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED) + (BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY) + (BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY) + (BFD_MACH_O_REFERENCED_DYNAMICALLY, BFD_MACH_O_N_DESC_DISCARDED) + (BFD_MACH_O_N_NO_DEAD_STRIP, BFD_MACH_O_N_WEAK_REF) + (BFD_MACH_O_N_WEAK_DEF): New macros. + Add comments. + (bfd_mach_o_section_type): Add new enumeration values. + (BFD_MACH_O_S_SELF_MODIFYING_CODE) + (BFD_MACH_O_S_ATTR_LIVE_SUPPORT) + (BFD_MACH_O_S_ATTR_NO_DEAD_STRIP) + (BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS, BFD_MACH_O_S_ATTR_NO_TOC): New + macros. + (BFD_MACH_O_GENERIC_RELOC_VANILLA) + (BFD_MACH_O_GENERIC_RELOC_PAIR) + (BFD_MACH_O_GENERIC_RELOC_SECTDIFF) + (BFD_MACH_O_GENERIC_RELOC_PB_LA_PTR) + (BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF): Ditto. + (BFD_MACH_O_RELENT_SIZE): Ditto. + (BFD_MACH_O_R_PCREL, BFD_MACH_O_GET_R_LENGTH) + (BFD_MACH_O_R_EXTERN, BFD_MACH_O_GET_R_TYPE) + (BFD_MACH_O_GET_R_SYMBOLNUM, BFD_MACH_O_SET_R_LENGTH) + (BFD_MACH_O_SET_R_TYPE, BFD_MACH_O_SET_R_SYMBOLNUM): Ditto. + (BFD_MACH_O_SR_SCATTERED, BFD_MACH_O_SR_PCREL) + (BFD_MACH_O_GET_SR_LENGTH, BFD_MACH_O_GET_SR_TYPE) + (BFD_MACH_O_GET_SR_ADDRESS, BFD_MACH_O_SET_SR_LENGTH) + (BFD_MACH_O_SET_SR_TYPE, BFD_MACH_O_SET_SR_ADDRESS): Ditto. + (bfd_mach_o_reloc_info): New struct. + (bfd_mach_o_asymbol): New struct. + (bfd_mach_o_symtab_command): The symbols field is now of type + bfd_mach_o_asymbol. + (bfd_mach_o_load_command): The offset and len fields are now of type + unsigned int. + (mach_o_data_struct): Remove symbols, nsymbols and ibfd fields. + Add a filelen field. Add comments. + (bfd_mach_o_backend_data): New struct. + (bfd_mach_o_get_backend_data): New macro. + (bfd_mach_o_scan_read_symtab_symbol): Parameter symbol now of type + bfd_mach_o_asymbol. + (bfd_mach_o_scan_read_dysymtab_symbol): Ditto. + (bfd_mach_o_get_reloc_upper_bound): New prototype. + (bfd_mach_o_canonicalize_reloc): Ditto. + + * mach-o-target.c (bfd_mach_o_bfd_is_local_label_name): Remove + duplicated macro. Now defined to _bfd_generic_is_local_label. + (TARGET_NAME_BACKEND): New macro... + (TARGET_NAME_BACKEND): ... used to name a new variable. + (TARGET_NAME): Define relocs table using bfd_mach_o, reference + Mach-O backend data. + + * mach-o-i386.c (i386_howto_table): New variable. + (bfd_mach_o_i386_swap_reloc_in): New function. + (bfd_mach_o_i386_swap_reloc_out): Ditto. + (bfd_mach_o_i386_bfd_reloc_type_lookup): Ditto. + (bfd_mach_o_i386_bfd_reloc_name_lookup): Ditto. + (bfd_mach_o_swap_reloc_in, bfd_mach_o_swap_reloc_out): New macros. + (bfd_mach_o_bfd_reloc_type_lookup) + (bfd_mach_o_bfd_reloc_name_lookup): Ditto. + +2009-06-11 Eric Paris + Nick Clifton + + * opncls.c (_maybe_make_executable): New function. Gives execute + permission to an executable bfd that was opened for writing + provided that it is a regular file. Replaces common code found in... + (bfd_close): here and ... + (bfd_close_all_done): here. + +2009-06-11 Anthony Green + + * reloc.c: Add BFD_RELOC_MOXIE_10_PCREL. + * bfd-in2.h: Rebuilt. + * libbfd.h: Rebuilt. + * elf32-moxie.c (moxie_elf_howto_table): Add R_MOXIE_PCREL10 + relocation support. + (moxie_reloc_map): Ditto. + Clean up copyright notice. + +2009-06-10 Paul Pluzhnikov + + * bfd-in2.h: bfd_mmap prototype. + * bfdio.c (bfd_mmap): New function. + * libbfd.h (bfd_iovec): Add bmmap. + * cache.c (cache_bmmap): New function. + (cache_iovec): Initialize bmmap member. + * opencls.c (opncls_bmmap): New function. + (opncls_iovec): Initialize bmmap member. + 2009-06-09 Tristan Gingold * mach-o.h (bfd_mach_o_symtab_command): Remove stabs_segment diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 004affe..9b98f8c 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -463,6 +463,7 @@ extern int bfd_seek (bfd *, file_ptr, int); extern file_ptr bfd_tell (bfd *); extern int bfd_flush (bfd *); extern int bfd_stat (bfd *, struct stat *); +extern void *bfd_mmap (bfd *, void *, bfd_size_type, int, int, file_ptr); /* Deprecated old routines. */ #if __GNUC__ @@ -2736,6 +2737,10 @@ to compensate for the borrow when the low bits are added. */ BFD_RELOC_MIPS_JUMP_SLOT, +/* Moxie ELF relocations. */ + BFD_RELOC_MOXIE_10_PCREL, + + /* Fujitsu Frv Relocations. */ BFD_RELOC_FRV_LABEL16, BFD_RELOC_FRV_LABEL24, @@ -4494,6 +4499,13 @@ BFD_RELOC_XTENSA_ASM_EXPAND. */ BFD_RELOC_LM32_GLOB_DAT, BFD_RELOC_LM32_JMP_SLOT, BFD_RELOC_LM32_RELATIVE, + +/* Difference between two section addreses. Must be followed by a +BFD_RELOC_MACH_O_PAIR. */ + BFD_RELOC_MACH_O_SECTDIFF, + +/* Mach-O generic relocations. */ + BFD_RELOC_MACH_O_PAIR, BFD_RELOC_UNUSED }; typedef enum bfd_reloc_code_real bfd_reloc_code_real_type; reloc_howto_type *bfd_reloc_type_lookup diff --git a/bfd/bfdio.c b/bfd/bfdio.c index 16bbf03..9b85338 100644 --- a/bfd/bfdio.c +++ b/bfd/bfdio.c @@ -158,6 +158,8 @@ DESCRIPTION . int (*bclose) (struct bfd *abfd); . int (*bflush) (struct bfd *abfd); . int (*bstat) (struct bfd *abfd, struct stat *sb); +. void* (*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len, +. int prot, int flags, file_ptr offset); .}; */ @@ -511,3 +513,31 @@ bfd_get_size (bfd *abfd) return buf.st_size; } + + +/* +FUNCTION + bfd_mmap + +SYNOPSIS + void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len, + int prot, int flags, file_ptr offset); + +DESCRIPTION + Return mmap()ed region of the file, if possible and implemented. + +*/ + +void * +bfd_mmap (bfd *abfd, void *addr, bfd_size_type len, + int prot, int flags, file_ptr offset) +{ + void *ret = (void *)-1; + if ((abfd->flags & BFD_IN_MEMORY) != 0) + return ret; + + if (abfd->iovec == NULL) + return ret; + + return abfd->iovec->bmmap (abfd, addr, len, prot, flags, offset); +} diff --git a/bfd/cache.c b/bfd/cache.c index 50674e8..c6873a9 100644 --- a/bfd/cache.c +++ b/bfd/cache.c @@ -46,6 +46,10 @@ SUBSECTION #include "libbfd.h" #include "libiberty.h" +#ifdef HAVE_MMAP +#include +#endif + /* In some cases we can optimize cache operation when reopening files. For instance, a flush is entirely unnecessary if the file is already closed, so a flush would use CACHE_NO_OPEN. Similarly, a seek using @@ -388,10 +392,38 @@ cache_bstat (struct bfd *abfd, struct stat *sb) return sts; } +static void * +cache_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED, + void *addr ATTRIBUTE_UNUSED, + bfd_size_type len ATTRIBUTE_UNUSED, + int prot ATTRIBUTE_UNUSED, + int flags ATTRIBUTE_UNUSED, + file_ptr offset ATTRIBUTE_UNUSED) +{ + void *ret = (void *) -1; + + if ((abfd->flags & BFD_IN_MEMORY) != 0) + abort (); +#ifdef HAVE_MMAP + else + { + FILE *f = bfd_cache_lookup (abfd, CACHE_NO_SEEK_ERROR); + if (f == NULL) + return ret; + + ret = mmap (addr, len, prot, flags, fileno (f), offset); + if (ret == (void *) -1) + bfd_set_error (bfd_error_system_call); + } +#endif + + return ret; +} + static const struct bfd_iovec cache_iovec = { &cache_bread, &cache_bwrite, &cache_btell, &cache_bseek, - &cache_bclose, &cache_bflush, &cache_bstat + &cache_bclose, &cache_bflush, &cache_bstat, &cache_bmmap }; /* diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 2a2d461..df4be8b 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -3175,11 +3175,12 @@ arm_type_of_stub (struct bfd_link_info *info, /* We have an extra 2-bytes reach because of the mode change (bit 24 (H) of BLX encoding). */ - if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2) - || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET) - || ((r_type == R_ARM_CALL) && !globals->use_blx) - || (r_type == R_ARM_JUMP24) - || (r_type == R_ARM_PLT32)) + if ((branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2) + || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET) + || ((r_type == R_ARM_CALL) && !globals->use_blx) + || (r_type == R_ARM_JUMP24) + || (r_type == R_ARM_PLT32)) + && !use_plt) { stub_type = (info->shared | globals->pic_veneer) /* PIC stubs. */ @@ -8960,7 +8961,7 @@ elf32_arm_fix_exidx_coverage (asection **text_section_order, struct bfd_elf_section_data *elf_sec = elf_section_data (sec); Elf_Internal_Shdr *hdr = &elf_sec->this_hdr; - if (hdr->sh_type != SHT_ARM_EXIDX) + if (!hdr || hdr->sh_type != SHT_ARM_EXIDX) continue; if (elf_sec->linked_to) diff --git a/bfd/elf32-moxie.c b/bfd/elf32-moxie.c index e3f01d2..23a16ff 100644 --- a/bfd/elf32-moxie.c +++ b/bfd/elf32-moxie.c @@ -1,5 +1,4 @@ /* moxie-specific support for 32-bit ELF. - Copyright 2008 Anthony Green. Copyright 2009 Free Software Foundation, Inc. Copied from elf32-fr30.c which is.. @@ -62,6 +61,21 @@ static reloc_howto_type moxie_elf_howto_table [] = 0x00000000, /* src_mask */ 0xffffffff, /* dst_mask */ FALSE), /* pcrel_offset */ + + /* A 10 bit PC-relative relocation. */ + HOWTO (R_MOXIE_PCREL10, /* type. */ + 1, /* rightshift. */ + 1, /* size (0 = byte, 1 = short, 2 = long). */ + 10, /* bitsize. */ + TRUE, /* pc_relative. */ + 0, /* bitpos. */ + complain_overflow_signed, /* complain_on_overflow. */ + bfd_elf_generic_reloc, /* special_function. */ + "R_MOXIE_PCREL10", /* name. */ + FALSE, /* partial_inplace. */ + 0, /* src_mask. */ + 0x000003FF, /* dst_mask. */ + TRUE), /* pcrel_offset. */ }; /* Map BFD reloc types to MOXIE ELF reloc types. */ @@ -74,8 +88,9 @@ struct moxie_reloc_map static const struct moxie_reloc_map moxie_reloc_map [] = { - { BFD_RELOC_NONE, R_MOXIE_NONE }, - { BFD_RELOC_32, R_MOXIE_32 }, + { BFD_RELOC_NONE, R_MOXIE_NONE }, + { BFD_RELOC_32, R_MOXIE_32 }, + { BFD_RELOC_MOXIE_10_PCREL, R_MOXIE_PCREL10 }, }; static reloc_howto_type * diff --git a/bfd/libbfd.h b/bfd/libbfd.h index ea1a080..d0499e8 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -773,6 +773,9 @@ struct bfd_iovec int (*bclose) (struct bfd *abfd); int (*bflush) (struct bfd *abfd); int (*bstat) (struct bfd *abfd, struct stat *sb); + /* Just like mmap: (void*)-1 on failure, mmapped address on success. */ + void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len, + int prot, int flags, file_ptr offset); }; /* Extracted from bfdwin.c. */ struct _bfd_window_internal { @@ -1030,6 +1033,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_MIPS_COPY", "BFD_RELOC_MIPS_JUMP_SLOT", + "BFD_RELOC_MOXIE_10_PCREL", + "BFD_RELOC_FRV_LABEL16", "BFD_RELOC_FRV_LABEL24", "BFD_RELOC_FRV_LO16", @@ -2064,6 +2069,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_LM32_GLOB_DAT", "BFD_RELOC_LM32_JMP_SLOT", "BFD_RELOC_LM32_RELATIVE", + "BFD_RELOC_MACH_O_SECTDIFF", + "BFD_RELOC_MACH_O_PAIR", "@@overflow: BFD_RELOC_UNUSED@@", }; #endif diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c index 7d389f5..f600c01 100644 --- a/bfd/mach-o-i386.c +++ b/bfd/mach-o-i386.c @@ -60,9 +60,171 @@ bfd_mach_o_i386_mkobject (bfd *abfd) return TRUE; } +static reloc_howto_type i386_howto_table[]= +{ + HOWTO(BFD_RELOC_32, 0, 2, 32, FALSE, 0, + complain_overflow_bitfield, + NULL, "32", + FALSE, 0xffffffff, 0xffffffff, FALSE), + HOWTO(BFD_RELOC_16, 0, 1, 16, FALSE, 0, + complain_overflow_bitfield, + NULL, "16", + FALSE, 0xffff, 0xffff, FALSE), + HOWTO(BFD_RELOC_8, 0, 0, 8, FALSE, 0, + complain_overflow_bitfield, + NULL, "8", + FALSE, 0xff, 0xff, FALSE), + HOWTO(BFD_RELOC_32_PCREL, 0, 2, 32, TRUE, 0, + complain_overflow_bitfield, + NULL, "DISP32", + FALSE, 0xffffffff, 0xffffffff, TRUE), + HOWTO(BFD_RELOC_16_PCREL, 0, 1, 16, TRUE, 0, + complain_overflow_bitfield, + NULL, "DISP16", + FALSE, 0xffff, 0xffff, TRUE), + HOWTO(BFD_RELOC_MACH_O_SECTDIFF, 0, 2, 32, FALSE, 0, + complain_overflow_bitfield, + NULL, "SECTDIFF_32", + FALSE, 0xffffffff, 0xffffffff, FALSE), + HOWTO(BFD_RELOC_MACH_O_PAIR, 0, 2, 32, FALSE, 0, + complain_overflow_bitfield, + NULL, "PAIR_32", + FALSE, 0xffffffff, 0xffffffff, FALSE), +}; + +static bfd_boolean +bfd_mach_o_i386_swap_reloc_in (arelent *res, bfd_mach_o_reloc_info *reloc) +{ + if (reloc->r_scattered) + { + switch (reloc->r_type) + { + case BFD_MACH_O_GENERIC_RELOC_PAIR: + if (reloc->r_length != 2) + return FALSE; + res->howto = &i386_howto_table[3]; + res->address = res[-1].address; + return TRUE; + case BFD_MACH_O_GENERIC_RELOC_SECTDIFF: + case BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF: + if (reloc->r_length != 2) + return FALSE; + res->howto = &i386_howto_table[2]; + return TRUE; + default: + return FALSE; + } + } + else + { + switch (reloc->r_type) + { + case BFD_MACH_O_GENERIC_RELOC_VANILLA: + switch ((reloc->r_length << 1) | reloc->r_pcrel) + { + case 0: /* len = 0, pcrel = 0 */ + res->howto = &i386_howto_table[2]; + return TRUE; + case 2: /* len = 1, pcrel = 0 */ + res->howto = &i386_howto_table[1]; + return TRUE; + case 3: /* len = 1, pcrel = 1 */ + res->howto = &i386_howto_table[4]; + return TRUE; + case 4: /* len = 2, pcrel = 0 */ + res->howto = &i386_howto_table[0]; + return TRUE; + case 5: /* len = 2, pcrel = 1 */ + res->howto = &i386_howto_table[3]; + return TRUE; + default: + return FALSE; + } + break; + default: + return FALSE; + } + } +} + +static bfd_boolean +bfd_mach_o_i386_swap_reloc_out (arelent *rel, bfd_mach_o_reloc_info *rinfo) +{ + rinfo->r_address = rel->address; + switch (rel->howto->type) + { + case BFD_RELOC_32: + case BFD_RELOC_32_PCREL: + case BFD_RELOC_16: hooks/post-receive -- Repository for Project Archer.