diff options
author | Nick Clifton <nickc@redhat.com> | 2000-02-28 18:56:11 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2000-02-28 18:56:11 +0000 |
commit | 8da5fb4a493b9b8b213abd9f661244deeb110d1c (patch) | |
tree | c2fe6274edcc0de609c9e20c4aac24bea55bb184 /bfd/coff-arm.c | |
parent | a5df16016e76e9b6c6f3cbf5813c1a4dd61b4ac1 (diff) | |
download | gdb-8da5fb4a493b9b8b213abd9f661244deeb110d1c.tar.gz |
Add WinCE support.
Diffstat (limited to 'bfd/coff-arm.c')
-rw-r--r-- | bfd/coff-arm.c | 213 |
1 files changed, 144 insertions, 69 deletions
diff --git a/bfd/coff-arm.c b/bfd/coff-arm.c index b778017358b..f0a109e7197 100644 --- a/bfd/coff-arm.c +++ b/bfd/coff-arm.c @@ -1,5 +1,5 @@ /* BFD back-end for ARM COFF files. - Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999 + Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. Written by Cygnus Support. @@ -199,8 +199,7 @@ coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd, #endif /* These most certainly belong somewhere else. Just had to get rid of - the manifest constants in the code. */ - + the manifest constants in the code. */ #define ARM_8 0 #define ARM_16 1 #define ARM_32 2 @@ -217,9 +216,127 @@ coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd, #define ARM_THUMB12 13 #define ARM_THUMB23 14 +#ifdef ARM_WINCE +#undef ARM_32 +#undef ARM_RVA32 +#undef ARM_26 +#undef ARM_THUMB12 +#undef ARM_26D + +#define ARM_32 1 +#define ARM_RVA32 2 +#define ARM_26 3 +#define ARM_THUMB12 4 +#define ARM_26D 5 +#define ARM_SECTION 14 +#define ARM_SECREL 15 +#endif + static reloc_howto_type aoutarm_std_reloc_howto[] = { /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */ +#ifdef ARM_WINCE + EMPTY_HOWTO (-1), + HOWTO (ARM_32, + 0, + 2, + 32, + false, + 0, + complain_overflow_bitfield, + coff_arm_reloc, + "ARM_32", + true, + 0xffffffff, + 0xffffffff, + PCRELOFFSET), + HOWTO (ARM_RVA32, + 0, + 2, + 32, + false, + 0, + complain_overflow_bitfield, + coff_arm_reloc, + "ARM_RVA32", + true, + 0xffffffff, + 0xffffffff, + PCRELOFFSET), + HOWTO (ARM_26, + 2, + 2, + 24, + true, + 0, + complain_overflow_signed, + aoutarm_fix_pcrel_26 , + "ARM_26", + false, + 0x00ffffff, + 0x00ffffff, + PCRELOFFSET), + HOWTO (ARM_THUMB12, + 1, + 1, + 11, + true, + 0, + complain_overflow_signed, + coff_thumb_pcrel_12 , + "ARM_THUMB12", + false, + 0x000007ff, + 0x000007ff, + PCRELOFFSET), + HOWTO (ARM_26D, + 2, + 2, + 24, + false, + 0, + complain_overflow_dont, + aoutarm_fix_pcrel_26_done, + "ARM_26D", + true, + 0x00ffffff, + 0x0, + false), + EMPTY_HOWTO (-1), + EMPTY_HOWTO (-1), + EMPTY_HOWTO (-1), + EMPTY_HOWTO (-1), + EMPTY_HOWTO (-1), + EMPTY_HOWTO (-1), + EMPTY_HOWTO (-1), + EMPTY_HOWTO (-1), + HOWTO (ARM_SECTION, + 0, + 1, + 16, + false, + 0, + complain_overflow_bitfield, + coff_arm_reloc, + "ARM_16", + true, + 0x0000ffff, + 0x0000ffff, + PCRELOFFSET), + HOWTO (ARM_SECREL, + 0, + 2, + 32, + false, + 0, + complain_overflow_bitfield, + coff_arm_reloc, + "ARM_32", + true, + 0xffffffff, + 0xffffffff, + PCRELOFFSET), +#else /* not ARM_WINCE */ HOWTO(ARM_8, /* type */ 0, /* rightshift */ 0, /* size */ @@ -403,7 +520,8 @@ static reloc_howto_type aoutarm_std_reloc_howto[] = false, 0x07ff07ff, 0x07ff07ff, - PCRELOFFSET), + PCRELOFFSET) +#endif /* not ARM_WINCE */ }; #define NUM_RELOCS NUM_ELEM (aoutarm_std_reloc_howto) @@ -446,7 +564,7 @@ coff_arm_rtype_to_howto (abfd, sec, rel, h, sym, addendp) howto = aoutarm_std_reloc_howto + rel->r_type; if (rel->r_type == ARM_RVA32) - *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase; + *addendp -= pe_data (sec->output_section->owner)->pe_opthdr.ImageBase; return howto; } @@ -719,6 +837,12 @@ coff_arm_reloc_type_lookup (abfd, code) switch (code) { +#ifdef ARM_WINCE + ASTD (BFD_RELOC_32, ARM_32); + ASTD (BFD_RELOC_RVA, ARM_RVA32); + ASTD (BFD_RELOC_ARM_PCREL_BRANCH, ARM_26); + ASTD (BFD_RELOC_THUMB_PCREL_BRANCH12, ARM_THUMB12); +#else ASTD (BFD_RELOC_8, ARM_8); ASTD (BFD_RELOC_16, ARM_16); ASTD (BFD_RELOC_32, ARM_32); @@ -730,6 +854,7 @@ coff_arm_reloc_type_lookup (abfd, code) ASTD (BFD_RELOC_THUMB_PCREL_BRANCH9, ARM_THUMB9); ASTD (BFD_RELOC_THUMB_PCREL_BRANCH12, ARM_THUMB12); ASTD (BFD_RELOC_THUMB_PCREL_BRANCH23, ARM_THUMB23); +#endif default: return (CONST struct reloc_howto_struct *) 0; } } @@ -1106,6 +1231,13 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section, howto = &fake_arm26_reloc; } +#ifdef ARM_WINCE + /* MS ARM-CE makes the reloc relative to the opcode's pc, not + the next opcode's pc, so is off by one. */ + if (howto->pc_relative && !info->relocateable) + addend -= 8; +#endif + /* If we are doing a relocateable link, then we can just ignore a PC relative reloc that is pcrel_offset. It will already have the correct value. If this is not a relocateable link, @@ -1248,6 +1380,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section, } } +#ifndef ARM_WINCE /* Note: We used to check for ARM_THUMB9 and ARM_THUMB12 */ else if (howto->type == ARM_THUMB23) { @@ -1376,6 +1509,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section, done = 1; } } +#endif } /* If the relocation type and destination symbol does not @@ -1416,6 +1550,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section, #if 1 /* THUMBEXTENSION */ if (done) rstat = bfd_reloc_ok; +#ifndef ARM_WINCE /* Only perform this fix during the final link, not a relocatable link. nickc@cygnus.com */ else if (! info->relocateable && howto->type == ARM_THUMB23) @@ -1530,6 +1665,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section, rstat = overflow ? bfd_reloc_overflow : bfd_reloc_ok; } } +#endif else #endif /* THUMBEXTENSION */ rstat = _bfd_final_link_relocate (howto, input_bfd, input_section, @@ -1918,6 +2054,7 @@ bfd_arm_process_before_allocation (abfd, info, support_old_code) if (symndx == -1) continue; + /* If the index is outside of the range of our table, something has gone wrong. */ if (symndx >= obj_conv_table_size (abfd)) { _bfd_error_handler (_("%s: illegal symbol index in reloc: %d"), @@ -1943,6 +2080,7 @@ bfd_arm_process_before_allocation (abfd, info, support_old_code) record_arm_to_thumb_glue (info, h); break; +#ifndef ARM_WINCE case ARM_THUMB23: /* This one is a call from thumb code. We used to look for ARM_THUMB9 and ARM_THUMB12 as well. We need to look @@ -1963,6 +2101,7 @@ bfd_arm_process_before_allocation (abfd, info, support_old_code) ; } break; +#endif default: break; @@ -2379,70 +2518,6 @@ coff_arm_final_link_postscript (abfd, pfinfo) return true; } -#if 0 -#define coff_SWAP_sym_in arm_bfd_coff_swap_sym_in - -static void coff_swap_sym_in PARAMS ((bfd *, PTR, PTR)); - -/* Sepcial version of symbol swapper, used to grab a bfd - onto which the glue sections can be attached. */ -static void -arm_bfd_coff_swap_sym_in (abfd, ext1, in1) - bfd * abfd; - PTR ext1; - PTR in1; -{ - flagword flags; - register asection * s; - - /* Do the normal swap in. */ - coff_swap_sym_in (abfd, ext1, in1); - - if (bfd_of_glue_owner != NULL) /* we already have a toc, so go home */ - return; - - /* Save the bfd for later allocation. */ - bfd_of_glue_owner = abfd; - - s = bfd_get_section_by_name (bfd_of_glue_owner , - ARM2THUMB_GLUE_SECTION_NAME); - - if (s == NULL) - { - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ; - - s = bfd_make_section (bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME); - - if (s == NULL - || !bfd_set_section_flags (bfd_of_glue_owner, s, flags) - || !bfd_set_section_alignment (bfd_of_glue_owner, s, 2)) - { - /* FIXME: set appropriate bfd error */ - abort(); - } - } - - s = bfd_get_section_by_name (bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME); - - if (s == NULL) - { - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ; - - s = bfd_make_section (bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME); - - if (s == NULL - || !bfd_set_section_flags (bfd_of_glue_owner, s, flags) - || !bfd_set_section_alignment (bfd_of_glue_owner, s, 2)) - { - /* FIXME: set appropriate bfd error krk@cygnus.com */ - abort(); - } - } - - return; -} -#endif - #include "coffcode.h" #ifndef TARGET_LITTLE_SYM |