home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / D / GDB / GDB-4.13 / GDB-4 / gdb-4.13 / bfd / coff-m68k.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-20  |  5.6 KB  |  173 lines

  1. /* BFD back-end for Motorola 68000 COFF binaries.
  2.    Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
  3.    Written by Cygnus Support.
  4.  
  5. This file is part of BFD, the Binary File Descriptor library.
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.  
  21. #include "bfd.h"
  22. #include "sysdep.h"
  23. #include "libbfd.h"
  24. #include "obstack.h"
  25. #include "coff/m68k.h"
  26. #include "coff/internal.h"
  27. #include "libcoff.h"
  28.  
  29. #ifndef LYNX_SPECIAL_FN
  30. #define LYNX_SPECIAL_FN 0
  31. #endif
  32.  
  33. /* The page size is a guess based on ELF.  */
  34. #define COFF_PAGE_SIZE 0x2000
  35.  
  36. /* Clean up namespace.  */
  37. #define m68kcoff_howto_table    _bfd_m68kcoff_howto_table
  38. #define m68k_rtype2howto    _bfd_m68kcoff_rtype2howto
  39. #define m68k_howto2rtype    _bfd_m68kcoff_howto2rtype
  40.  
  41. #ifdef ONLY_DECLARE_RELOCS
  42. extern reloc_howto_type m68kcoff_howto_table[];
  43. #else
  44. reloc_howto_type m68kcoff_howto_table[] = 
  45. {
  46.   HOWTO(R_RELBYTE,           0,  0,      8,  false, 0, complain_overflow_bitfield, LYNX_SPECIAL_FN, "8",    true, 0x000000ff,0x000000ff, false),
  47.   HOWTO(R_RELWORD,           0,  1,     16, false, 0, complain_overflow_bitfield, LYNX_SPECIAL_FN, "16",    true, 0x0000ffff,0x0000ffff, false),
  48.   HOWTO(R_RELLONG,           0,  2,     32, false, 0, complain_overflow_bitfield, LYNX_SPECIAL_FN, "32",    true, 0xffffffff,0xffffffff, false),
  49.   HOWTO(R_PCRBYTE,           0,  0,     8,  true,  0, complain_overflow_signed, LYNX_SPECIAL_FN, "DISP8",    true, 0x000000ff,0x000000ff, false),
  50.   HOWTO(R_PCRWORD,           0,  1,     16, true,  0, complain_overflow_signed, LYNX_SPECIAL_FN, "DISP16",   true, 0x0000ffff,0x0000ffff, false),
  51.   HOWTO(R_PCRLONG,           0,  2,     32, true,  0, complain_overflow_signed, LYNX_SPECIAL_FN, "DISP32",   true, 0xffffffff,0xffffffff, false),
  52.   HOWTO(R_RELLONG_NEG,           0,  -2,     32, false, 0, complain_overflow_bitfield, LYNX_SPECIAL_FN, "-32",    true, 0xffffffff,0xffffffff, false),
  53. };
  54. #endif /* not ONLY_DECLARE_RELOCS */
  55.  
  56. #ifndef BADMAG
  57. #define BADMAG(x) M68KBADMAG(x)
  58. #endif
  59. #define M68 1        /* Customize coffcode.h */
  60.  
  61. /* Turn a howto into a reloc number */
  62.  
  63. #ifdef ONLY_DECLARE_RELOCS
  64. extern void m68k_rtype2howto PARAMS ((arelent *internal, int relocentry));
  65. extern int m68k_howto2rtype PARAMS ((CONST struct reloc_howto_struct *));
  66. #else
  67. void
  68. m68k_rtype2howto(internal, relocentry)
  69.      arelent *internal;
  70.      int relocentry;
  71. {
  72.   switch (relocentry) 
  73.   {
  74.    case R_RELBYTE:    internal->howto = m68kcoff_howto_table + 0; break;
  75.    case R_RELWORD:    internal->howto = m68kcoff_howto_table + 1; break;
  76.    case R_RELLONG:    internal->howto = m68kcoff_howto_table + 2; break;
  77.    case R_PCRBYTE:    internal->howto = m68kcoff_howto_table + 3; break;
  78.    case R_PCRWORD:    internal->howto = m68kcoff_howto_table + 4; break;
  79.    case R_PCRLONG:    internal->howto = m68kcoff_howto_table + 5; break;
  80.    case R_RELLONG_NEG:    internal->howto = m68kcoff_howto_table + 6; break;
  81.   }
  82. }
  83.  
  84. int 
  85. m68k_howto2rtype (internal)
  86.      CONST struct reloc_howto_struct *internal;
  87. {
  88.   if (internal->pc_relative) 
  89.   {
  90.     switch (internal->bitsize) 
  91.     {
  92.      case 32: return R_PCRLONG;
  93.      case 16: return R_PCRWORD;
  94.      case 8: return R_PCRBYTE;
  95.     }
  96.   }
  97.   else 
  98.   {
  99.     switch (internal->bitsize) 
  100.      {
  101.       case 32: return R_RELLONG;
  102.       case 16: return R_RELWORD;
  103.       case 8: return R_RELBYTE;
  104.      }
  105.   }
  106.   return R_RELLONG;    
  107. }
  108. #endif /* not ONLY_DECLARE_RELOCS */
  109.  
  110. #define RTYPE2HOWTO(internal, relocentry) \
  111.   m68k_rtype2howto(internal, (relocentry)->r_type)
  112.  
  113. #define SELECT_RELOC(external, internal) \
  114.   external.r_type = m68k_howto2rtype(internal);
  115.  
  116. #include "coffcode.h"
  117.  
  118. const bfd_target 
  119. #ifdef TARGET_SYM
  120.   TARGET_SYM =
  121. #else
  122.   m68kcoff_vec =
  123. #endif
  124. {
  125. #ifdef TARGET_NAME
  126.   TARGET_NAME,
  127. #else
  128.   "coff-m68k",            /* name */
  129. #endif
  130.   bfd_target_coff_flavour,
  131.   true,                /* data byte order is big */
  132.   true,                /* header byte order is big */
  133.  
  134.   (HAS_RELOC | EXEC_P |        /* object flags */
  135.    HAS_LINENO | HAS_DEBUG |
  136.    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
  137.  
  138.   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
  139. #ifdef NAMES_HAVE_UNDERSCORE
  140.   '_',
  141. #else
  142.   0,                /* leading underscore */
  143. #endif
  144.   '/',                /* ar_pad_char */
  145.   15,                /* ar_max_namelen */
  146.   1,                /* minimum section alignment */
  147.   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
  148.      bfd_getb32, bfd_getb_signed_32, bfd_putb32,
  149.      bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
  150.   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
  151.      bfd_getb32, bfd_getb_signed_32, bfd_putb32,
  152.      bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
  153.  
  154.  {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
  155.    bfd_generic_archive_p, _bfd_dummy_target},
  156.  {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
  157.    bfd_false},
  158.  {bfd_false, coff_write_object_contents, /* bfd_write_contents */
  159.    _bfd_write_archive_contents, bfd_false},
  160.  
  161.      BFD_JUMP_TABLE_GENERIC (coff),
  162.      BFD_JUMP_TABLE_COPY (coff),
  163.      BFD_JUMP_TABLE_CORE (_bfd_nocore),
  164.      BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
  165.      BFD_JUMP_TABLE_SYMBOLS (coff),
  166.      BFD_JUMP_TABLE_RELOCS (coff),
  167.      BFD_JUMP_TABLE_WRITE (coff),
  168.      BFD_JUMP_TABLE_LINK (coff),
  169.      BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
  170.  
  171.   COFF_SWAP_TABLE
  172.  };
  173.