X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fcoff-z80.c;h=05008cd502737fb4d3255666219169a1f5f7b190;hb=8729a6f6a5148fb4dcb280a95dc0bdc35f02b96e;hp=f39413f6e9c7c04d48c5e1d4e90f7f6e7ef76187;hpb=44da2da10b10bc7e70095c3dc8737278c9a65149;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff-z80.c b/bfd/coff-z80.c index f39413f6e9..05008cd502 100644 --- a/bfd/coff-z80.c +++ b/bfd/coff-z80.c @@ -1,12 +1,12 @@ /* BFD back-end for Zilog Z80 COFF binaries. - Copyright 2005 Free Software Foundation, Inc. + Copyright 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Contributed by Arnold Metselaar This file is part of BFD, the Binary File Descriptor library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -19,8 +19,8 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "libbfd.h" #include "bfdlink.h" #include "coff/z80.h" @@ -30,10 +30,15 @@ #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 0 static reloc_howto_type r_imm32 = -HOWTO (R_IMM32, 0, 1, 32, FALSE, 0, +HOWTO (R_IMM32, 0, 2, 32, FALSE, 0, complain_overflow_dont, 0, "r_imm32", TRUE, 0xffffffff, 0xffffffff, FALSE); +static reloc_howto_type r_imm24 = +HOWTO (R_IMM24, 0, 1, 24, FALSE, 0, + complain_overflow_dont, 0, "r_imm24", TRUE, 0x00ffffff, 0x00ffffff, + FALSE); + static reloc_howto_type r_imm16 = HOWTO (R_IMM16, 0, 1, 16, FALSE, 0, complain_overflow_dont, 0, "r_imm16", TRUE, 0x0000ffff, 0x0000ffff, @@ -84,6 +89,9 @@ rtype2howto (arelent *internal, struct internal_reloc *dst) case R_IMM16: internal->howto = &r_imm16; break; + case R_IMM24: + internal->howto = &r_imm24; + break; case R_IMM32: internal->howto = &r_imm32; break; @@ -106,6 +114,7 @@ coff_z80_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, { case BFD_RELOC_8: return & r_imm8; case BFD_RELOC_16: return & r_imm16; + case BFD_RELOC_24: return & r_imm24; case BFD_RELOC_32: return & r_imm32; case BFD_RELOC_8_PCREL: return & r_jr; case BFD_RELOC_Z80_DISP8: return & r_off8; @@ -114,6 +123,26 @@ coff_z80_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, } } +static reloc_howto_type * +coff_z80_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, + const char *r_name) +{ + if (strcasecmp (r_imm8.name, r_name) == 0) + return &r_imm8; + if (strcasecmp (r_imm16.name, r_name) == 0) + return &r_imm16; + if (strcasecmp (r_imm24.name, r_name) == 0) + return &r_imm24; + if (strcasecmp (r_imm32.name, r_name) == 0) + return &r_imm32; + if (strcasecmp (r_jr.name, r_name) == 0) + return &r_jr; + if (strcasecmp (r_off8.name, r_name) == 0) + return &r_off8; + + return NULL; +} + /* Perform any necessary magic to the addend in a reloc entry. */ #define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \ @@ -173,7 +202,7 @@ extra_case (bfd *in_abfd, break; case R_IMM8: - val = bfd_get_16 ( in_abfd, data+*src_ptr) + val = bfd_get_8 ( in_abfd, data+*src_ptr) + bfd_coff_reloc16_get_value (reloc, link_info, input_section); bfd_put_8 (in_abfd, val, data + *dst_ptr); (*dst_ptr) += 1; @@ -188,6 +217,16 @@ extra_case (bfd *in_abfd, (*src_ptr) += 2; break; + case R_IMM24: + val = bfd_get_16 ( in_abfd, data+*src_ptr) + + (bfd_get_8 ( in_abfd, data+*src_ptr+2) << 16) + + bfd_coff_reloc16_get_value (reloc, link_info, input_section); + bfd_put_16 (in_abfd, val, data + *dst_ptr); + bfd_put_8 (in_abfd, val >> 16, data + *dst_ptr+2); + (*dst_ptr) += 3; + (*src_ptr) += 3; + break; + case R_IMM32: val = bfd_get_32 ( in_abfd, data+*src_ptr) + bfd_coff_reloc16_get_value (reloc, link_info, input_section); @@ -229,6 +268,11 @@ extra_case (bfd *in_abfd, #define coff_reloc16_extra_cases extra_case #define coff_bfd_reloc_type_lookup coff_z80_reloc_type_lookup +#define coff_bfd_reloc_name_lookup coff_z80_reloc_name_lookup + +#ifndef bfd_pe_print_pdata +#define bfd_pe_print_pdata NULL +#endif #include "coffcode.h" @@ -239,6 +283,7 @@ extra_case (bfd *in_abfd, #undef coff_bfd_relax_section #define coff_bfd_relax_section bfd_coff_reloc16_relax_section -CREATE_LITTLE_COFF_TARGET_VEC (z80coff_vec, "coff-z80", 0, 0, '\0', NULL, +CREATE_LITTLE_COFF_TARGET_VEC (z80coff_vec, "coff-z80", 0, + SEC_CODE | SEC_DATA, '\0', NULL, COFF_SWAP_TABLE)