home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 4: GNU Archives / Linux Cubed Series 4 - GNU Archives.iso / gnu / binutils.7 / binutils / binutils-2.7 / bfd / oasys.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-04  |  38.1 KB  |  1,534 lines

  1. /* BFD back-end for oasys objects.
  2.    Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
  3.    Written by Steve Chamberlain of Cygnus Support, <sac@cygnus.com>.
  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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  20.  
  21. #define UNDERSCORE_HACK 1
  22. #include "bfd.h"
  23. #include "sysdep.h"
  24. #include <ctype.h>
  25. #include "libbfd.h"
  26. #include "oasys.h"
  27. #include "liboasys.h"
  28.  
  29. /* XXX - FIXME.  offsetof belongs in the system-specific files in
  30.    ../include/sys. */
  31. /* Define offsetof for those systems which lack it */
  32.  
  33. #ifndef offsetof
  34. #define offsetof(type, identifier) (size_t) &(((type *) 0)->identifier)
  35. #endif
  36.  
  37. static boolean oasys_read_record PARAMS ((bfd *,
  38.                       oasys_record_union_type *));
  39. static boolean oasys_write_sections PARAMS ((bfd *));
  40. static boolean oasys_write_record PARAMS ((bfd *,
  41.                        oasys_record_enum_type,
  42.                        oasys_record_union_type *,
  43.                        size_t));
  44. static boolean oasys_write_syms PARAMS ((bfd *));
  45. static boolean oasys_write_header PARAMS ((bfd *));
  46. static boolean oasys_write_end PARAMS ((bfd *));
  47. static boolean oasys_write_data PARAMS ((bfd *));
  48.  
  49. /* Read in all the section data and relocation stuff too */
  50. PROTO (static boolean, oasys_slurp_section_data, (bfd * CONST abfd));
  51.  
  52. static boolean
  53. oasys_read_record (abfd, record)
  54.      bfd *abfd;
  55.      oasys_record_union_type *record;
  56. {
  57.   if (bfd_read ((PTR) record, 1, sizeof (record->header), abfd)
  58.       != sizeof (record->header))
  59.     return false;
  60.  
  61.   if ((size_t) record->header.length <= (size_t) sizeof (record->header))
  62.     return true;
  63.   if (bfd_read ((PTR) (((char *) record) + sizeof (record->header)),
  64.         1, record->header.length - sizeof (record->header),
  65.         abfd)
  66.       != record->header.length - sizeof (record->header))
  67.     return false;
  68.   return true;
  69. }
  70. static size_t
  71. oasys_string_length (record)
  72.      oasys_record_union_type *record;
  73. {
  74.   return record->header.length
  75.     - ((char *) record->symbol.name - (char *) record);
  76. }
  77.  
  78. /*****************************************************************************/
  79.  
  80. /*
  81.  
  82. Slurp the symbol table by reading in all the records at the start file
  83. till we get to the first section record.
  84.  
  85. We'll sort the symbolss into  two lists, defined and undefined. The
  86. undefined symbols will be placed into the table according to their
  87. refno.
  88.  
  89. We do this by placing all undefined symbols at the front of the table
  90. moving in, and the defined symbols at the end of the table moving back.
  91.  
  92. */
  93.  
  94. static boolean
  95. oasys_slurp_symbol_table (abfd)
  96.      bfd *CONST abfd;
  97. {
  98.   oasys_record_union_type record;
  99.   oasys_data_type *data = OASYS_DATA (abfd);
  100.   boolean loop = true;
  101.   asymbol *dest_defined;
  102.   asymbol *dest;
  103.   char *string_ptr;
  104.  
  105.  
  106.   if (data->symbols != (asymbol *) NULL)
  107.     {
  108.       return true;
  109.     }
  110.   /* Buy enough memory for all the symbols and all the names */
  111.   data->symbols =
  112.     (asymbol *) bfd_alloc (abfd, sizeof (asymbol) * abfd->symcount);
  113. #ifdef UNDERSCORE_HACK
  114.   /* buy 1 more char for each symbol to keep the underscore in*/
  115.   data->strings = bfd_alloc (abfd, data->symbol_string_length +
  116.                  abfd->symcount);
  117. #else
  118.   data->strings = bfd_alloc (abfd, data->symbol_string_length);
  119. #endif
  120.   if (!data->symbols || !data->strings)
  121.     return false;
  122.  
  123.   dest_defined = data->symbols + abfd->symcount - 1;
  124.  
  125.   string_ptr = data->strings;
  126.   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
  127.     return false;
  128.   while (loop)
  129.     {
  130.  
  131.       if (! oasys_read_record (abfd, &record))
  132.     return false;
  133.       switch (record.header.type)
  134.     {
  135.     case oasys_record_is_header_enum:
  136.       break;
  137.     case oasys_record_is_local_enum:
  138.     case oasys_record_is_symbol_enum:
  139.       {
  140.         int flag = record.header.type == (int) oasys_record_is_local_enum ?
  141.         (BSF_LOCAL) : (BSF_GLOBAL | BSF_EXPORT);
  142.  
  143.  
  144.         size_t length = oasys_string_length (&record);
  145.         switch (record.symbol.relb & RELOCATION_TYPE_BITS)
  146.           {
  147.           case RELOCATION_TYPE_ABS:
  148.         dest = dest_defined--;
  149.         dest->section = bfd_abs_section_ptr;
  150.         dest->flags = 0;
  151.  
  152.         break;
  153.           case RELOCATION_TYPE_REL:
  154.         dest = dest_defined--;
  155.         dest->section =
  156.           OASYS_DATA (abfd)->sections[record.symbol.relb &
  157.                           RELOCATION_SECT_BITS];
  158.         if (record.header.type == (int) oasys_record_is_local_enum)
  159.           {
  160.             dest->flags = BSF_LOCAL;
  161.             if (dest->section == (asection *) (~0))
  162.               {
  163.             /* It seems that sometimes internal symbols are tied up, but
  164.                still get output, even though there is no
  165.                section */
  166.             dest->section = 0;
  167.               }
  168.           }
  169.         else
  170.           {
  171.  
  172.             dest->flags = flag;
  173.           }
  174.         break;
  175.           case RELOCATION_TYPE_UND:
  176.         dest = data->symbols + bfd_h_get_16 (abfd, record.symbol.refno);
  177.         dest->section = bfd_und_section_ptr;
  178.         break;
  179.           case RELOCATION_TYPE_COM:
  180.         dest = dest_defined--;
  181.         dest->name = string_ptr;
  182.         dest->the_bfd = abfd;
  183.  
  184.         dest->section = bfd_com_section_ptr;
  185.  
  186.         break;
  187.           default:
  188.         dest = dest_defined--;
  189.         BFD_ASSERT (0);
  190.         break;
  191.           }
  192.         dest->name = string_ptr;
  193.         dest->the_bfd = abfd;
  194.         dest->udata.p = (PTR) NULL;
  195.         dest->value = bfd_h_get_32 (abfd, record.symbol.value);
  196.  
  197. #ifdef UNDERSCORE_HACK
  198.         if (record.symbol.name[0] != '_')
  199.           {
  200.         string_ptr[0] = '_';
  201.         string_ptr++;
  202.           }
  203. #endif
  204.         memcpy (string_ptr, record.symbol.name, length);
  205.  
  206.  
  207.         string_ptr[length] = 0;
  208.         string_ptr += length + 1;
  209.       }
  210.       break;
  211.     default:
  212.       loop = false;
  213.     }
  214.     }
  215.   return true;
  216. }
  217.  
  218. static long
  219. oasys_get_symtab_upper_bound (abfd)
  220.      bfd *CONST abfd;
  221. {
  222.   if (! oasys_slurp_symbol_table (abfd))
  223.     return -1;
  224.  
  225.   return (abfd->symcount + 1) * (sizeof (oasys_symbol_type *));
  226. }
  227.  
  228. /*
  229. */
  230.  
  231. extern const bfd_target oasys_vec;
  232.  
  233. long
  234. oasys_get_symtab (abfd, location)
  235.      bfd *abfd;
  236.      asymbol **location;
  237. {
  238.   asymbol *symbase;
  239.   unsigned int counter;
  240.   if (oasys_slurp_symbol_table (abfd) == false)
  241.     {
  242.       return -1;
  243.     }
  244.   symbase = OASYS_DATA (abfd)->symbols;
  245.   for (counter = 0; counter < abfd->symcount; counter++)
  246.     {
  247.       *(location++) = symbase++;
  248.     }
  249.   *location = 0;
  250.   return abfd->symcount;
  251. }
  252.  
  253. /***********************************************************************
  254. *  archive stuff
  255. */
  256.  
  257. static const bfd_target *
  258. oasys_archive_p (abfd)
  259.      bfd *abfd;
  260. {
  261.   oasys_archive_header_type header;
  262.   oasys_extarchive_header_type header_ext;
  263.   unsigned int i;
  264.   file_ptr filepos;
  265.  
  266.   if (bfd_seek (abfd, (file_ptr) 0, false) != 0
  267.       || (bfd_read ((PTR) & header_ext, 1, sizeof (header_ext), abfd)
  268.       != sizeof (header_ext)))
  269.     {
  270.       if (bfd_get_error () != bfd_error_system_call)
  271.     bfd_set_error (bfd_error_wrong_format);
  272.       return NULL;
  273.     }
  274.  
  275.   header.version = bfd_h_get_32 (abfd, header_ext.version);
  276.   header.mod_count = bfd_h_get_32 (abfd, header_ext.mod_count);
  277.   header.mod_tbl_offset = bfd_h_get_32 (abfd, header_ext.mod_tbl_offset);
  278.   header.sym_tbl_size = bfd_h_get_32 (abfd, header_ext.sym_tbl_size);
  279.   header.sym_count = bfd_h_get_32 (abfd, header_ext.sym_count);
  280.   header.sym_tbl_offset = bfd_h_get_32 (abfd, header_ext.sym_tbl_offset);
  281.   header.xref_count = bfd_h_get_32 (abfd, header_ext.xref_count);
  282.   header.xref_lst_offset = bfd_h_get_32 (abfd, header_ext.xref_lst_offset);
  283.  
  284.   /*
  285.     There isn't a magic number in an Oasys archive, so the best we
  286.     can do to verify reasnableness is to make sure that the values in
  287.     the header are too weird
  288.     */
  289.  
  290.   if (header.version > 10000 ||
  291.       header.mod_count > 10000 ||
  292.       header.sym_count > 100000 ||
  293.       header.xref_count > 100000)
  294.     return (const bfd_target *) NULL;
  295.  
  296.   /*
  297.     That all worked, let's buy the space for the header and read in
  298.     the headers.
  299.     */
  300.   {
  301.     oasys_ar_data_type *ar =
  302.     (oasys_ar_data_type *) bfd_alloc (abfd, sizeof (oasys_ar_data_type));
  303.  
  304.     oasys_module_info_type *module =
  305.     (oasys_module_info_type *)
  306.     bfd_alloc (abfd, sizeof (oasys_module_info_type) * header.mod_count);
  307.     oasys_module_table_type record;
  308.  
  309.     if (!ar || !module)
  310.       return NULL;
  311.  
  312.     abfd->tdata.oasys_ar_data = ar;
  313.     ar->module = module;
  314.     ar->module_count = header.mod_count;
  315.  
  316.     filepos = header.mod_tbl_offset;
  317.     for (i = 0; i < header.mod_count; i++)
  318.       {
  319.     if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
  320.       return NULL;
  321.  
  322.     /* There are two ways of specifying the archive header */
  323.  
  324.     if (0)
  325.       {
  326.         oasys_extmodule_table_type_a_type record_ext;
  327.         if (bfd_read ((PTR) & record_ext, 1, sizeof (record_ext), abfd)
  328.         != sizeof (record_ext))
  329.           return NULL;
  330.  
  331.         record.mod_size = bfd_h_get_32 (abfd, record_ext.mod_size);
  332.         record.file_offset = bfd_h_get_32 (abfd, record_ext.file_offset);
  333.  
  334.         record.dep_count = bfd_h_get_32 (abfd, record_ext.dep_count);
  335.         record.depee_count = bfd_h_get_32 (abfd, record_ext.depee_count);
  336.         record.sect_count = bfd_h_get_32 (abfd, record_ext.sect_count);
  337.  
  338.         module[i].name = bfd_alloc (abfd, 33);
  339.         if (!module[i].name)
  340.           return NULL;
  341.  
  342.         memcpy (module[i].name, record_ext.mod_name, 33);
  343.         filepos +=
  344.           sizeof (record_ext) +
  345.           record.dep_count * 4 +
  346.           record.depee_count * 4 +
  347.           record.sect_count * 8 + 187;
  348.       }
  349.     else
  350.       {
  351.         oasys_extmodule_table_type_b_type record_ext;
  352.         if (bfd_read ((PTR) & record_ext, 1, sizeof (record_ext), abfd)
  353.         != sizeof (record_ext))
  354.           return NULL;
  355.  
  356.         record.mod_size = bfd_h_get_32 (abfd, record_ext.mod_size);
  357.         record.file_offset = bfd_h_get_32 (abfd, record_ext.file_offset);
  358.  
  359.         record.dep_count = bfd_h_get_32 (abfd, record_ext.dep_count);
  360.         record.depee_count = bfd_h_get_32 (abfd, record_ext.depee_count);
  361.         record.sect_count = bfd_h_get_32 (abfd, record_ext.sect_count);
  362.         record.module_name_size = bfd_h_get_32 (abfd, record_ext.mod_name_length);
  363.  
  364.         module[i].name = bfd_alloc (abfd, record.module_name_size + 1);
  365.         if (!module[i].name)
  366.           return NULL;
  367.         if (bfd_read ((PTR) module[i].name, 1, record.module_name_size,
  368.               abfd)
  369.         != record.module_name_size)
  370.           return NULL;
  371.         module[i].name[record.module_name_size] = 0;
  372.         filepos +=
  373.           sizeof (record_ext) +
  374.           record.dep_count * 4 +
  375.           record.module_name_size + 1;
  376.  
  377.       }
  378.  
  379.  
  380.     module[i].size = record.mod_size;
  381.     module[i].pos = record.file_offset;
  382.     module[i].abfd = 0;
  383.       }
  384.  
  385.   }
  386.   return abfd->xvec;
  387. }
  388.  
  389. static boolean
  390. oasys_mkobject (abfd)
  391.      bfd *abfd;
  392. {
  393.  
  394.   abfd->tdata.oasys_obj_data = (oasys_data_type *) bfd_alloc (abfd, sizeof (oasys_data_type));
  395.   return abfd->tdata.oasys_obj_data ? true : false;
  396. }
  397.  
  398. #define MAX_SECS 16
  399. static const bfd_target *
  400. oasys_object_p (abfd)
  401.      bfd *abfd;
  402. {
  403.   oasys_data_type *oasys;
  404.   oasys_data_type *save = OASYS_DATA (abfd);
  405.   boolean loop = true;
  406.   boolean had_usefull = false;
  407.  
  408.   abfd->tdata.oasys_obj_data = 0;
  409.   oasys_mkobject (abfd);
  410.   oasys = OASYS_DATA (abfd);
  411.   memset ((PTR) oasys->sections, 0xff, sizeof (oasys->sections));
  412.  
  413.   /* Point to the start of the file */
  414.   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
  415.     goto fail;
  416.   oasys->symbol_string_length = 0;
  417.   /* Inspect the records, but only keep the section info -
  418.      remember the size of the symbols
  419.      */
  420.   oasys->first_data_record = 0;
  421.   while (loop)
  422.     {
  423.       oasys_record_union_type record;
  424.       if (! oasys_read_record (abfd, &record))
  425.     goto fail;
  426.       if ((size_t) record.header.length < (size_t) sizeof (record.header))
  427.     goto fail;
  428.  
  429.  
  430.       switch ((oasys_record_enum_type) (record.header.type))
  431.     {
  432.     case oasys_record_is_header_enum:
  433.       had_usefull = true;
  434.       break;
  435.     case oasys_record_is_symbol_enum:
  436.     case oasys_record_is_local_enum:
  437.       /* Count symbols and remember their size for a future malloc   */
  438.       abfd->symcount++;
  439.       oasys->symbol_string_length += 1 + oasys_string_length (&record);
  440.       had_usefull = true;
  441.       break;
  442.     case oasys_record_is_section_enum:
  443.       {
  444.         asection *s;
  445.         char *buffer;
  446.         unsigned int section_number;
  447.         if (record.section.header.length != sizeof (record.section))
  448.           {
  449.         goto fail;
  450.           }
  451.         buffer = bfd_alloc (abfd, 3);
  452.         if (!buffer)
  453.           goto fail;
  454.         section_number = record.section.relb & RELOCATION_SECT_BITS;
  455.         sprintf (buffer, "%u", section_number);
  456.         s = bfd_make_section (abfd, buffer);
  457.         oasys->sections[section_number] = s;
  458.         switch (record.section.relb & RELOCATION_TYPE_BITS)
  459.           {
  460.           case RELOCATION_TYPE_ABS:
  461.           case RELOCATION_TYPE_REL:
  462.         break;
  463.           case RELOCATION_TYPE_UND:
  464.           case RELOCATION_TYPE_COM:
  465.         BFD_FAIL ();
  466.           }
  467.  
  468.         s->_raw_size = bfd_h_get_32 (abfd, record.section.value);
  469.         s->vma = bfd_h_get_32 (abfd, record.section.vma);
  470.         s->flags = 0;
  471.         had_usefull = true;
  472.       }
  473.       break;
  474.     case oasys_record_is_data_enum:
  475.       oasys->first_data_record = bfd_tell (abfd) - record.header.length;
  476.     case oasys_record_is_debug_enum:
  477.     case oasys_record_is_module_enum:
  478.     case oasys_record_is_named_section_enum:
  479.     case oasys_record_is_end_enum:
  480.       if (had_usefull == false)
  481.         goto fail;
  482.       loop = false;
  483.       break;
  484.     default:
  485.       goto fail;
  486.     }
  487.     }
  488.   oasys->symbols = (asymbol *) NULL;
  489.   /*
  490.     Oasys support several architectures, but I can't see a simple way
  491.     to discover which one is in a particular file - we'll guess
  492.     */
  493.   bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0);
  494.   if (abfd->symcount != 0)
  495.     {
  496.       abfd->flags |= HAS_SYMS;
  497.     }
  498.  
  499.   /*
  500.     We don't know if a section has data until we've read it..
  501.     */
  502.  
  503.   oasys_slurp_section_data (abfd);
  504.  
  505.  
  506.   return abfd->xvec;
  507.  
  508. fail:
  509.   (void) bfd_release (abfd, oasys);
  510.   abfd->tdata.oasys_obj_data = save;
  511.   return (const bfd_target *) NULL;
  512. }
  513.  
  514.  
  515. static void
  516. oasys_get_symbol_info (ignore_abfd, symbol, ret)
  517.      bfd *ignore_abfd;
  518.      asymbol *symbol;
  519.      symbol_info *ret;
  520. {
  521.   bfd_symbol_info (symbol, ret);
  522.   if (!symbol->section)
  523.     ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A';
  524. }
  525.  
  526. static void
  527. oasys_print_symbol (ignore_abfd, afile, symbol, how)
  528.      bfd *ignore_abfd;
  529.      PTR afile;
  530.      asymbol *symbol;
  531.      bfd_print_symbol_type how;
  532. {
  533.   FILE *file = (FILE *) afile;
  534.  
  535.   switch (how)
  536.     {
  537.     case bfd_print_symbol_name:
  538.     case bfd_print_symbol_more:
  539.       fprintf (file, "%s", symbol->name);
  540.       break;
  541.     case bfd_print_symbol_all:
  542.       {
  543.     CONST char *section_name = symbol->section == (asection *) NULL ?
  544.     (CONST char *) "*abs" : symbol->section->name;
  545.  
  546.     bfd_print_symbol_vandf ((PTR) file, symbol);
  547.  
  548.     fprintf (file, " %-5s %s",
  549.          section_name,
  550.          symbol->name);
  551.       }
  552.       break;
  553.     }
  554. }
  555. /*
  556.  The howto table is build using the top two bits of a reloc byte to
  557.  index into it. The bits are PCREL,WORD/LONG
  558. */
  559. static reloc_howto_type howto_table[] =
  560. {
  561.  
  562.   HOWTO (0, 0, 1, 16, false, 0, complain_overflow_bitfield, 0, "abs16", true, 0x0000ffff, 0x0000ffff, false),
  563.   HOWTO (0, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, "abs32", true, 0xffffffff, 0xffffffff, false),
  564.   HOWTO (0, 0, 1, 16, true, 0, complain_overflow_signed, 0, "pcrel16", true, 0x0000ffff, 0x0000ffff, false),
  565.   HOWTO (0, 0, 2, 32, true, 0, complain_overflow_signed, 0, "pcrel32", true, 0xffffffff, 0xffffffff, false)
  566. };
  567.  
  568. /* Read in all the section data and relocation stuff too */
  569. static boolean
  570. oasys_slurp_section_data (abfd)
  571.      bfd *CONST abfd;
  572. {
  573.   oasys_record_union_type record;
  574.   oasys_data_type *data = OASYS_DATA (abfd);
  575.   boolean loop = true;
  576.  
  577.   oasys_per_section_type *per;
  578.  
  579.   asection *s;
  580.  
  581.   /* See if the data has been slurped already .. */
  582.   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
  583.     {
  584.       per = oasys_per_section (s);
  585.       if (per->initialized == true)
  586.     return true;
  587.     }
  588.  
  589.   if (data->first_data_record == 0)
  590.     return true;
  591.  
  592.   if (bfd_seek (abfd, data->first_data_record, SEEK_SET) != 0)
  593.     return false;
  594.   while (loop)
  595.     {
  596.       if (! oasys_read_record (abfd, &record))
  597.     return false;
  598.       switch (record.header.type)
  599.     {
  600.     case oasys_record_is_header_enum:
  601.       break;
  602.     case oasys_record_is_data_enum:
  603.       {
  604.  
  605.         bfd_byte *src = record.data.data;
  606.         bfd_byte *end_src = ((bfd_byte *) & record) + record.header.length;
  607.         bfd_byte *dst_ptr;
  608.         bfd_byte *dst_base_ptr;
  609.         unsigned int relbit;
  610.         unsigned int count;
  611.         asection *section =
  612.         data->sections[record.data.relb & RELOCATION_SECT_BITS];
  613.         bfd_vma dst_offset;
  614.  
  615.         per = oasys_per_section (section);
  616.  
  617.         if (per->initialized == false)
  618.           {
  619.         per->data = (bfd_byte *) bfd_zalloc (abfd, section->_raw_size);
  620.         if (!per->data)
  621.           return false;
  622.         per->reloc_tail_ptr = (oasys_reloc_type **) & (section->relocation);
  623.         per->had_vma = false;
  624.         per->initialized = true;
  625.         section->reloc_count = 0;
  626.         section->flags = SEC_ALLOC;
  627.           }
  628.  
  629.         dst_offset = bfd_h_get_32 (abfd, record.data.addr);
  630.         if (per->had_vma == false)
  631.           {
  632.         /* Take the first vma we see as the base */
  633.         section->vma = dst_offset;
  634.         per->had_vma = true;
  635.           }
  636.  
  637.         dst_offset -= section->vma;
  638.  
  639.         dst_base_ptr = oasys_per_section (section)->data;
  640.         dst_ptr = oasys_per_section (section)->data +
  641.           dst_offset;
  642.  
  643.         if (src < end_src)
  644.           {
  645.         section->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
  646.           }
  647.         while (src < end_src)
  648.           {
  649.         unsigned char mod_byte = *src++;
  650.         size_t gap = end_src - src;
  651.  
  652.         count = 8;
  653.         if (mod_byte == 0 && gap >= 8)
  654.           {
  655.             dst_ptr[0] = src[0];
  656.             dst_ptr[1] = src[1];
  657.             dst_ptr[2] = src[2];
  658.             dst_ptr[3] = src[3];
  659.             dst_ptr[4] = src[4];
  660.             dst_ptr[5] = src[5];
  661.             dst_ptr[6] = src[6];
  662.             dst_ptr[7] = src[7];
  663.             dst_ptr += 8;
  664.             src += 8;
  665.           }
  666.         else
  667.           {
  668.             for (relbit = 1; count-- != 0 && src < end_src; relbit <<= 1)
  669.               {
  670.             if (relbit & mod_byte)
  671.               {
  672.                 unsigned char reloc = *src;
  673.                 /* This item needs to be relocated */
  674.                 switch (reloc & RELOCATION_TYPE_BITS)
  675.                   {
  676.                   case RELOCATION_TYPE_ABS:
  677.  
  678.                 break;
  679.  
  680.                   case RELOCATION_TYPE_REL:
  681.                 {
  682.                   /* Relocate the item relative to the section */
  683.                   oasys_reloc_type *r =
  684.                   (oasys_reloc_type *)
  685.                   bfd_alloc (abfd,
  686.                          sizeof (oasys_reloc_type));
  687.                   if (!r)
  688.                     return false;
  689.                   *(per->reloc_tail_ptr) = r;
  690.                   per->reloc_tail_ptr = &r->next;
  691.                   r->next = (oasys_reloc_type *) NULL;
  692.                   /* Reference to undefined symbol */
  693.                   src++;
  694.                   /* There is no symbol */
  695.                   r->symbol = 0;
  696.                   /* Work out the howto */
  697.                   abort ();
  698. #if 0
  699.                   r->relent.section =
  700.                     data->sections[reloc &
  701.                            RELOCATION_SECT_BITS];
  702.  
  703.                   r->relent.addend = -
  704.                     r->relent.section->vma;
  705. #endif
  706.                   r->relent.address = dst_ptr - dst_base_ptr;
  707.                   r->relent.howto = &howto_table[reloc >> 6];
  708.                   r->relent.sym_ptr_ptr = (asymbol **) NULL;
  709.                   section->reloc_count++;
  710.  
  711.                   /* Fake up the data to look like it's got the -ve pc in it, this makes
  712.                        it much easier to convert into other formats. This is done by
  713.                        hitting the addend.
  714.                        */
  715.                   if (r->relent.howto->pc_relative == true)
  716.                     {
  717.                       r->relent.addend -= dst_ptr - dst_base_ptr;
  718.                     }
  719.  
  720.  
  721.                 }
  722.                 break;
  723.  
  724.  
  725.                   case RELOCATION_TYPE_UND:
  726.                 {
  727.                   oasys_reloc_type *r =
  728.                   (oasys_reloc_type *)
  729.                   bfd_alloc (abfd,
  730.                          sizeof (oasys_reloc_type));
  731.                   if (!r)
  732.                     return false;
  733.                   *(per->reloc_tail_ptr) = r;
  734.                   per->reloc_tail_ptr = &r->next;
  735.                   r->next = (oasys_reloc_type *) NULL;
  736.                   /* Reference to undefined symbol */
  737.                   src++;
  738.                   /* Get symbol number */
  739.                   r->symbol = (src[0] << 8) | src[1];
  740.                   /* Work out the howto */
  741.                   abort ();
  742.  
  743. #if 0
  744.                   r->relent.section = (asection
  745.                                *) NULL;
  746. #endif
  747.                   r->relent.addend = 0;
  748.                   r->relent.address = dst_ptr - dst_base_ptr;
  749.                   r->relent.howto = &howto_table[reloc >> 6];
  750.                   r->relent.sym_ptr_ptr = (asymbol **) NULL;
  751.                   section->reloc_count++;
  752.  
  753.                   src += 2;
  754.                   /* Fake up the data to look like it's got the -ve pc in it, this makes
  755.                        it much easier to convert into other formats. This is done by
  756.                        hitting the addend.
  757.                        */
  758.                   if (r->relent.howto->pc_relative == true)
  759.                     {
  760.                       r->relent.addend -= dst_ptr - dst_base_ptr;
  761.                     }
  762.  
  763.  
  764.  
  765.                 }
  766.                 break;
  767.                   case RELOCATION_TYPE_COM:
  768.                 BFD_FAIL ();
  769.                   }
  770.               }
  771.             *dst_ptr++ = *src++;
  772.               }
  773.           }
  774.           }
  775.       }
  776.       break;
  777.     case oasys_record_is_local_enum:
  778.     case oasys_record_is_symbol_enum:
  779.     case oasys_record_is_section_enum:
  780.       break;
  781.     default:
  782.       loop = false;
  783.     }
  784.     }
  785.  
  786.   return true;
  787.  
  788. }
  789.  
  790. static boolean
  791. oasys_new_section_hook (abfd, newsect)
  792.      bfd *abfd;
  793.      asection *newsect;
  794. {
  795.   newsect->used_by_bfd = (PTR)
  796.     bfd_alloc (abfd, sizeof (oasys_per_section_type));
  797.   if (!newsect->used_by_bfd)
  798.     return false;
  799.   oasys_per_section (newsect)->data = (bfd_byte *) NULL;
  800.   oasys_per_section (newsect)->section = newsect;
  801.   oasys_per_section (newsect)->offset = 0;
  802.   oasys_per_section (newsect)->initialized = false;
  803.   newsect->alignment_power = 1;
  804.   /* Turn the section string into an index */
  805.  
  806.   sscanf (newsect->name, "%u", &newsect->target_index);
  807.  
  808.   return true;
  809. }
  810.  
  811.  
  812. static long
  813. oasys_get_reloc_upper_bound (abfd, asect)
  814.      bfd *abfd;
  815.      sec_ptr asect;
  816. {
  817.   if (! oasys_slurp_section_data (abfd))
  818.     return -1;
  819.   return (asect->reloc_count + 1) * sizeof (arelent *);
  820. }
  821.  
  822. static boolean
  823. oasys_get_section_contents (abfd, section, location, offset, count)
  824.      bfd *abfd;
  825.      sec_ptr section;
  826.      PTR location;
  827.      file_ptr offset;
  828.      bfd_size_type count;
  829. {
  830.   oasys_per_section_type *p = (oasys_per_section_type *) section->used_by_bfd;
  831.   oasys_slurp_section_data (abfd);
  832.   if (p->initialized == false)
  833.     {
  834.       (void) memset (location, 0, (int) count);
  835.     }
  836.   else
  837.     {
  838.       (void) memcpy (location, (PTR) (p->data + offset), (int) count);
  839.     }
  840.   return true;
  841. }
  842.  
  843.  
  844. long
  845. oasys_canonicalize_reloc (ignore_abfd, section, relptr, symbols)
  846.      bfd *ignore_abfd;
  847.      sec_ptr section;
  848.      arelent **relptr;
  849.      asymbol **symbols;
  850. {
  851.   unsigned int reloc_count = 0;
  852.   oasys_reloc_type *src = (oasys_reloc_type *) (section->relocation);
  853.   while (src != (oasys_reloc_type *) NULL)
  854.     {
  855.       abort ();
  856.  
  857. #if 0
  858.       if (src->relent.section == (asection *) NULL)
  859.     {
  860.       src->relent.sym_ptr_ptr = symbols + src->symbol;
  861.     }
  862. #endif
  863.  
  864.       *relptr++ = &src->relent;
  865.       src = src->next;
  866.       reloc_count++;
  867.     }
  868.   *relptr = (arelent *) NULL;
  869.   return section->reloc_count = reloc_count;
  870. }
  871.  
  872.  
  873.  
  874.  
  875. /* Writing */
  876.  
  877.  
  878. /* Calculate the checksum and write one record */
  879. static boolean
  880. oasys_write_record (abfd, type, record, size)
  881.      bfd *abfd;
  882.      oasys_record_enum_type type;
  883.      oasys_record_union_type *record;
  884.      size_t size;
  885. {
  886.   int checksum;
  887.   size_t i;
  888.   unsigned char *ptr;
  889.  
  890.   record->header.length = size;
  891.   record->header.type = (int) type;
  892.   record->header.check_sum = 0;
  893.   record->header.fill = 0;
  894.   ptr = (unsigned char *) &record->pad[0];
  895.   checksum = 0;
  896.   for (i = 0; i < size; i++)
  897.     {
  898.       checksum += *ptr++;
  899.     }
  900.   record->header.check_sum = 0xff & (-checksum);
  901.   if (bfd_write ((PTR) record, 1, size, abfd) != size)
  902.     return false;
  903.   return true;
  904. }
  905.  
  906.  
  907. /* Write out all the symbols */
  908. static boolean
  909. oasys_write_syms (abfd)
  910.      bfd *abfd;
  911. {
  912.   unsigned int count;
  913.   asymbol **generic = bfd_get_outsymbols (abfd);
  914.   unsigned int index = 0;
  915.   for (count = 0; count < bfd_get_symcount (abfd); count++)
  916.     {
  917.  
  918.       oasys_symbol_record_type symbol;
  919.       asymbol *CONST g = generic[count];
  920.  
  921.       CONST char *src = g->name;
  922.       char *dst = symbol.name;
  923.       unsigned int l = 0;
  924.  
  925.       if (bfd_is_com_section (g->section))
  926.     {
  927.       symbol.relb = RELOCATION_TYPE_COM;
  928.       bfd_h_put_16 (abfd, index, symbol.refno);
  929.       index++;
  930.     }
  931.       else if (bfd_is_abs_section (g->section))
  932.     {
  933.       symbol.relb = RELOCATION_TYPE_ABS;
  934.       bfd_h_put_16 (abfd, 0, symbol.refno);
  935.  
  936.     }
  937.       else if (bfd_is_und_section (g->section))
  938.     {
  939.       symbol.relb = RELOCATION_TYPE_UND;
  940.       bfd_h_put_16 (abfd, index, symbol.refno);
  941.       /* Overload the value field with the output index number */
  942.       index++;
  943.     }
  944.       else if (g->flags & BSF_DEBUGGING)
  945.     {
  946.       /* throw it away */
  947.       continue;
  948.     }
  949.       else
  950.     {
  951.       if (g->section == (asection *) NULL)
  952.         {
  953.           /* Sometime, the oasys tools give out a symbol with illegal
  954.        bits in it, we'll output it in the same broken way */
  955.  
  956.           symbol.relb = RELOCATION_TYPE_REL | 0;
  957.         }
  958.       else
  959.         {
  960.           symbol.relb = RELOCATION_TYPE_REL | g->section->output_section->target_index;
  961.         }
  962.       bfd_h_put_16 (abfd, 0, symbol.refno);
  963.     }
  964. #ifdef UNDERSCORE_HACK
  965.       if (src[l] == '_')
  966.     dst[l++] = '.';
  967. #endif
  968.       while (src[l])
  969.     {
  970.       dst[l] = src[l];
  971.       l++;
  972.     }
  973.  
  974.       bfd_h_put_32 (abfd, g->value, symbol.value);
  975.  
  976.  
  977.       if (g->flags & BSF_LOCAL)
  978.     {
  979.       if (! oasys_write_record (abfd,
  980.                     oasys_record_is_local_enum,
  981.                     (oasys_record_union_type *) & symbol,
  982.                     offsetof (oasys_symbol_record_type,
  983.                           name[0]) + l))
  984.         return false;
  985.     }
  986.       else
  987.     {
  988.       if (! oasys_write_record (abfd,
  989.                     oasys_record_is_symbol_enum,
  990.                     (oasys_record_union_type *) & symbol,
  991.                     offsetof (oasys_symbol_record_type,
  992.                           name[0]) + l))
  993.         return false;
  994.     }
  995.       g->value = index - 1;
  996.     }
  997.  
  998.   return true;
  999. }
  1000.  
  1001.  
  1002.  /* Write a section header for each section */
  1003. static boolean
  1004. oasys_write_sections (abfd)
  1005.      bfd *abfd;
  1006. {
  1007.   asection *s;
  1008.   static oasys_section_record_type out;
  1009.  
  1010.   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
  1011.     {
  1012.       if (!isdigit (s->name[0]))
  1013.     {
  1014.       (*_bfd_error_handler)
  1015.         ("%s: can not represent section `%s' in oasys",
  1016.          bfd_get_filename (abfd), s->name);
  1017.       bfd_set_error (bfd_error_nonrepresentable_section);
  1018.       return false;
  1019.     }
  1020.       out.relb = RELOCATION_TYPE_REL | s->target_index;
  1021.       bfd_h_put_32 (abfd, s->_cooked_size, out.value);
  1022.       bfd_h_put_32 (abfd, s->vma, out.vma);
  1023.  
  1024.       if (! oasys_write_record (abfd,
  1025.                 oasys_record_is_section_enum,
  1026.                 (oasys_record_union_type *) & out,
  1027.                 sizeof (out)))
  1028.     return false;
  1029.     }
  1030.   return true;
  1031. }
  1032.  
  1033. static boolean
  1034. oasys_write_header (abfd)
  1035.      bfd *abfd;
  1036. {
  1037.   /* Create and write the header */
  1038.   oasys_header_record_type r;
  1039.   size_t length = strlen (abfd->filename);
  1040.   if (length > (size_t) sizeof (r.module_name))
  1041.     {
  1042.       length = sizeof (r.module_name);
  1043.     }
  1044.  
  1045.   (void) memcpy (r.module_name,
  1046.          abfd->filename,
  1047.          length);
  1048.   (void) memset (r.module_name + length,
  1049.          ' ',
  1050.          sizeof (r.module_name) - length);
  1051.  
  1052.   r.version_number = OASYS_VERSION_NUMBER;
  1053.   r.rev_number = OASYS_REV_NUMBER;
  1054.   if (! oasys_write_record (abfd,
  1055.                 oasys_record_is_header_enum,
  1056.                 (oasys_record_union_type *) & r,
  1057.                 offsetof (oasys_header_record_type,
  1058.                       description[0])))
  1059.     return false;
  1060.  
  1061.   return true;
  1062. }
  1063.  
  1064. static boolean
  1065. oasys_write_end (abfd)
  1066.      bfd *abfd;
  1067. {
  1068.   oasys_end_record_type end;
  1069.   unsigned char null = 0;
  1070.   end.relb = RELOCATION_TYPE_ABS;
  1071.   bfd_h_put_32 (abfd, abfd->start_address, end.entry);
  1072.   bfd_h_put_16 (abfd, 0, end.fill);
  1073.   end.zero = 0;
  1074.   if (! oasys_write_record (abfd,
  1075.                 oasys_record_is_end_enum,
  1076.                 (oasys_record_union_type *) & end,
  1077.                 sizeof (end)))
  1078.     return false;
  1079.   if (bfd_write ((PTR) & null, 1, 1, abfd) != 1)
  1080.     return false;
  1081.   return true;
  1082. }
  1083.  
  1084. static int
  1085. comp (ap, bp)
  1086.      CONST PTR ap;
  1087.      CONST PTR bp;
  1088. {
  1089.   arelent *a = *((arelent **) ap);
  1090.   arelent *b = *((arelent **) bp);
  1091.   return a->address - b->address;
  1092. }
  1093.  
  1094. /*
  1095.  Writing data..
  1096.  
  1097. */
  1098. static boolean
  1099. oasys_write_data (abfd)
  1100.      bfd *abfd;
  1101. {
  1102.   asection *s;
  1103.   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
  1104.     {
  1105.       if (s->flags & SEC_LOAD)
  1106.     {
  1107.       bfd_byte *raw_data = oasys_per_section (s)->data;
  1108.       oasys_data_record_type processed_data;
  1109.       bfd_size_type current_byte_index = 0;
  1110.       unsigned int relocs_to_go = s->reloc_count;
  1111.       arelent **p = s->orelocation;
  1112.       if (s->reloc_count != 0)
  1113.         {
  1114. /* Sort the reloc records so it's easy to insert the relocs into the
  1115.        data */
  1116.  
  1117.           qsort (s->orelocation,
  1118.              s->reloc_count,
  1119.              sizeof (arelent **),
  1120.              comp);
  1121.         }
  1122.       current_byte_index = 0;
  1123.       processed_data.relb = s->target_index | RELOCATION_TYPE_REL;
  1124.  
  1125.       while (current_byte_index < s->_cooked_size)
  1126.         {
  1127.           /* Scan forwards by eight bytes or however much is left and see if
  1128.            there are any relocations going on */
  1129.           bfd_byte *mod = &processed_data.data[0];
  1130.           bfd_byte *dst = &processed_data.data[1];
  1131.  
  1132.           unsigned int i = 0;
  1133.           *mod = 0;
  1134.  
  1135.  
  1136.           bfd_h_put_32 (abfd, s->vma + current_byte_index,
  1137.                 processed_data.addr);
  1138.  
  1139.           /* Don't start a relocation unless you're sure you can finish it
  1140.             within the same data record.  The worst case relocation is a
  1141.             4-byte relocatable value which is split across two modification
  1142.             bytes (1 relocation byte + 2 symbol reference bytes + 2 data +
  1143.             1 modification byte + 2 data = 8 bytes total).  That's where
  1144.             the magic number 8 comes from.
  1145.          */
  1146.           while (current_byte_index < s->_raw_size && dst <=
  1147.              &processed_data.data[sizeof (processed_data.data) - 8])
  1148.         {
  1149.  
  1150.  
  1151.           if (relocs_to_go != 0)
  1152.             {
  1153.               arelent *r = *p;
  1154.               reloc_howto_type *const how = r->howto;
  1155.               /* There is a relocation, is it for this byte ? */
  1156.               if (r->address == current_byte_index)
  1157.             {
  1158.               unsigned char rel_byte;
  1159.  
  1160.               p++;
  1161.               relocs_to_go--;
  1162.  
  1163.               *mod |= (1 << i);
  1164.               if (how->pc_relative)
  1165.                 {
  1166.                   rel_byte = RELOCATION_PCREL_BIT;
  1167.  
  1168.                   /* Also patch the raw data so that it doesn't have
  1169.              the -ve stuff any more */
  1170.                   if (how->size != 2)
  1171.                 {
  1172.                   bfd_put_16 (abfd,
  1173.                           bfd_get_16 (abfd, raw_data) +
  1174.                           current_byte_index, raw_data);
  1175.                 }
  1176.  
  1177.                   else
  1178.                 {
  1179.                   bfd_put_32 (abfd,
  1180.                           bfd_get_32 (abfd, raw_data) +
  1181.                           current_byte_index, raw_data);
  1182.                 }
  1183.                 }
  1184.               else
  1185.                 {
  1186.                   rel_byte = 0;
  1187.                 }
  1188.               if (how->size == 2)
  1189.                 {
  1190.                   rel_byte |= RELOCATION_32BIT_BIT;
  1191.                 }
  1192.  
  1193.               /* Is this a section relative relocation, or a symbol
  1194.                relative relocation ? */
  1195.               abort ();
  1196.  
  1197. #if 0
  1198.               if (r->section != (asection *) NULL)
  1199.                 {
  1200.                   /* The relent has a section attached, so it must be section
  1201.                  relative */
  1202.                   rel_byte |= RELOCATION_TYPE_REL;
  1203.                   rel_byte |= r->section->output_section->target_index;
  1204.                   *dst++ = rel_byte;
  1205.                 }
  1206.               else
  1207. #endif
  1208.                 {
  1209.                   asymbol *p = *(r->sym_ptr_ptr);
  1210.  
  1211.                   /* If this symbol has a section attached, then it
  1212.                  has already been resolved.  Change from a symbol
  1213.                  ref to a section ref */
  1214.                   if (p->section != (asection *) NULL)
  1215.                 {
  1216.                   rel_byte |= RELOCATION_TYPE_REL;
  1217.                   rel_byte |=
  1218.                     p->section->output_section->target_index;
  1219.                   *dst++ = rel_byte;
  1220.                 }
  1221.                   else
  1222.                 {
  1223.                   rel_byte |= RELOCATION_TYPE_UND;
  1224.                   *dst++ = rel_byte;
  1225.                   /* Next two bytes are a symbol index - we can get
  1226.                    this from the symbol value which has been zapped
  1227.                    into the symbol index in the table when the
  1228.                    symbol table was written
  1229.                    */
  1230.                   *dst++ = p->value >> 8;
  1231.                   *dst++ = p->value;
  1232.                 }
  1233.                 }
  1234. #define ADVANCE { if (++i >= 8) { i = 0; mod = dst++; *mod = 0; } current_byte_index++; }
  1235.               /* relocations never occur from an unloadable section,
  1236.                so we can assume that raw_data is not NULL
  1237.              */
  1238.               *dst++ = *raw_data++;
  1239.               ADVANCE
  1240.                 * dst++ = *raw_data++;
  1241.               ADVANCE
  1242.                 if (how->size == 2)
  1243.                 {
  1244.                   *dst++ = *raw_data++;
  1245.                   ADVANCE
  1246.                 * dst++ = *raw_data++;
  1247.                   ADVANCE
  1248.                 }
  1249.               continue;
  1250.             }
  1251.             }
  1252.           /* If this is coming from an unloadable section then copy
  1253.            zeros */
  1254.           if (raw_data == NULL)
  1255.             {
  1256.               *dst++ = 0;
  1257.             }
  1258.           else
  1259.             {
  1260.               *dst++ = *raw_data++;
  1261.             }
  1262.           ADVANCE
  1263.         }
  1264.  
  1265.           /* Don't write a useless null modification byte */
  1266.           if (dst == mod + 1)
  1267.         {
  1268.           --dst;
  1269.         }
  1270.  
  1271.           if (! oasys_write_record (abfd,
  1272.                     oasys_record_is_data_enum,
  1273.                     ((oasys_record_union_type *)
  1274.                      & processed_data),
  1275.                     dst - (bfd_byte *) & processed_data))
  1276.         return false;
  1277.         }
  1278.     }
  1279.     }
  1280.  
  1281.   return true;
  1282. }
  1283.  
  1284. static boolean
  1285. oasys_write_object_contents (abfd)
  1286.      bfd *abfd;
  1287. {
  1288.   if (! oasys_write_header (abfd))
  1289.     return false;
  1290.   if (! oasys_write_syms (abfd))
  1291.     return false;
  1292.   if (! oasys_write_sections (abfd))
  1293.     return false;
  1294.   if (! oasys_write_data (abfd))
  1295.     return false;
  1296.   if (! oasys_write_end (abfd))
  1297.     return false;
  1298.   return true;
  1299. }
  1300.  
  1301.  
  1302.  
  1303.  
  1304. /** exec and core file sections */
  1305.  
  1306. /* set section contents is complicated with OASYS since the format is
  1307. * not a byte image, but a record stream.
  1308. */
  1309. static boolean
  1310. oasys_set_section_contents (abfd, section, location, offset, count)
  1311.      bfd *abfd;
  1312.      sec_ptr section;
  1313.      PTR location;
  1314.      file_ptr offset;
  1315.      bfd_size_type count;
  1316. {
  1317.   if (count != 0)
  1318.     {
  1319.       if (oasys_per_section (section)->data == (bfd_byte *) NULL)
  1320.     {
  1321.       oasys_per_section (section)->data =
  1322.         (bfd_byte *) (bfd_alloc (abfd, section->_cooked_size));
  1323.       if (!oasys_per_section (section)->data)
  1324.         return false;
  1325.     }
  1326.       (void) memcpy ((PTR) (oasys_per_section (section)->data + offset),
  1327.              location,
  1328.              (size_t) count);
  1329.     }
  1330.   return true;
  1331. }
  1332.  
  1333.  
  1334.  
  1335. /* Native-level interface to symbols. */
  1336.  
  1337. /* We read the symbols into a buffer, which is discarded when this
  1338. function exits.  We read the strings into a buffer large enough to
  1339. hold them all plus all the cached symbol entries. */
  1340.  
  1341. static asymbol *
  1342. oasys_make_empty_symbol (abfd)
  1343.      bfd *abfd;
  1344. {
  1345.  
  1346.   oasys_symbol_type *new =
  1347.   (oasys_symbol_type *) bfd_zalloc (abfd, sizeof (oasys_symbol_type));
  1348.   if (!new)
  1349.     return NULL;
  1350.   new->symbol.the_bfd = abfd;
  1351.   return &new->symbol;
  1352. }
  1353.  
  1354.  
  1355.  
  1356.  
  1357. /* User should have checked the file flags; perhaps we should return
  1358. BFD_NO_MORE_SYMBOLS if there are none? */
  1359.  
  1360. static bfd *
  1361. oasys_openr_next_archived_file (arch, prev)
  1362.      bfd *arch;
  1363.      bfd *prev;
  1364. {
  1365.   oasys_ar_data_type *ar = OASYS_AR_DATA (arch);
  1366.   oasys_module_info_type *p;
  1367.   /* take the next one from the arch state, or reset */
  1368.   if (prev == (bfd *) NULL)
  1369.     {
  1370.       /* Reset the index - the first two entries are bogus*/
  1371.       ar->module_index = 0;
  1372.     }
  1373.  
  1374.   p = ar->module + ar->module_index;
  1375.   ar->module_index++;
  1376.  
  1377.   if (ar->module_index <= ar->module_count)
  1378.     {
  1379.       if (p->abfd == (bfd *) NULL)
  1380.     {
  1381.       p->abfd = _bfd_create_empty_archive_element_shell (arch);
  1382.       p->abfd->origin = p->pos;
  1383.       p->abfd->filename = p->name;
  1384.  
  1385.       /* Fixup a pointer to this element for the member */
  1386.       p->abfd->arelt_data = (PTR) p;
  1387.     }
  1388.       return p->abfd;
  1389.     }
  1390.   else
  1391.     {
  1392.       bfd_set_error (bfd_error_no_more_archived_files);
  1393.       return (bfd *) NULL;
  1394.     }
  1395. }
  1396.  
  1397. static boolean
  1398. oasys_find_nearest_line (abfd,
  1399.              section,
  1400.              symbols,
  1401.              offset,
  1402.              filename_ptr,
  1403.              functionname_ptr,
  1404.              line_ptr)
  1405.      bfd *abfd;
  1406.      asection *section;
  1407.      asymbol **symbols;
  1408.      bfd_vma offset;
  1409.      char **filename_ptr;
  1410.      char **functionname_ptr;
  1411.      unsigned int *line_ptr;
  1412. {
  1413.   return false;
  1414.  
  1415. }
  1416.  
  1417. static int
  1418. oasys_generic_stat_arch_elt (abfd, buf)
  1419.      bfd *abfd;
  1420.      struct stat *buf;
  1421. {
  1422.   oasys_module_info_type *mod = (oasys_module_info_type *) abfd->arelt_data;
  1423.   if (mod == (oasys_module_info_type *) NULL)
  1424.     {
  1425.       bfd_set_error (bfd_error_invalid_operation);
  1426.       return -1;
  1427.     }
  1428.   else
  1429.     {
  1430.       buf->st_size = mod->size;
  1431.       buf->st_mode = 0666;
  1432.       return 0;
  1433.     }
  1434. }
  1435.  
  1436. static int
  1437. oasys_sizeof_headers (abfd, exec)
  1438.      bfd *abfd;
  1439.      boolean exec;
  1440. {
  1441.   return 0;
  1442. }
  1443.  
  1444. #define    oasys_close_and_cleanup _bfd_generic_close_and_cleanup
  1445. #define oasys_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
  1446.  
  1447. #define oasys_slurp_armap bfd_true
  1448. #define oasys_slurp_extended_name_table bfd_true
  1449. #define oasys_construct_extended_name_table \
  1450.   ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \
  1451.    bfd_true)
  1452. #define oasys_truncate_arname bfd_dont_truncate_arname
  1453. #define oasys_write_armap \
  1454.   ((boolean (*) \
  1455.     PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \
  1456.    bfd_true)
  1457. #define oasys_read_ar_hdr bfd_nullvoidptr
  1458. #define oasys_get_elt_at_index _bfd_generic_get_elt_at_index
  1459. #define oasys_update_armap_timestamp bfd_true
  1460.  
  1461. #define oasys_bfd_is_local_label bfd_generic_is_local_label
  1462. #define oasys_get_lineno _bfd_nosymbols_get_lineno
  1463. #define oasys_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
  1464. #define oasys_read_minisymbols _bfd_generic_read_minisymbols
  1465. #define oasys_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
  1466.  
  1467. #define oasys_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
  1468.  
  1469. #define oasys_set_arch_mach bfd_default_set_arch_mach
  1470.  
  1471. #define oasys_get_section_contents_in_window \
  1472.   _bfd_generic_get_section_contents_in_window
  1473.  
  1474. #define oasys_bfd_get_relocated_section_contents \
  1475.   bfd_generic_get_relocated_section_contents
  1476. #define oasys_bfd_relax_section bfd_generic_relax_section
  1477. #define oasys_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
  1478. #define oasys_bfd_link_add_symbols _bfd_generic_link_add_symbols
  1479. #define oasys_bfd_final_link _bfd_generic_final_link
  1480. #define oasys_bfd_link_split_section _bfd_generic_link_split_section
  1481.  
  1482. /*SUPPRESS 460 */
  1483. const bfd_target oasys_vec =
  1484. {
  1485.   "oasys",            /* name */
  1486.   bfd_target_oasys_flavour,
  1487.   BFD_ENDIAN_BIG,        /* target byte order */
  1488.   BFD_ENDIAN_BIG,        /* target headers byte order */
  1489.   (HAS_RELOC | EXEC_P |        /* object flags */
  1490.    HAS_LINENO | HAS_DEBUG |
  1491.    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
  1492.   (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
  1493.    | SEC_ALLOC | SEC_LOAD | SEC_RELOC),    /* section flags */
  1494.   0,                /* leading underscore */
  1495.   ' ',                /* ar_pad_char */
  1496.   16,                /* ar_max_namelen */
  1497.   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
  1498.   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
  1499.   bfd_getb16, bfd_getb_signed_16, bfd_putb16,    /* data */
  1500.   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
  1501.   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
  1502.   bfd_getb16, bfd_getb_signed_16, bfd_putb16,    /* hdrs */
  1503.  
  1504.   {_bfd_dummy_target,
  1505.    oasys_object_p,        /* bfd_check_format */
  1506.    oasys_archive_p,
  1507.    _bfd_dummy_target,
  1508.   },
  1509.   {                /* bfd_set_format */
  1510.     bfd_false,
  1511.     oasys_mkobject,
  1512.     _bfd_generic_mkarchive,
  1513.     bfd_false
  1514.   },
  1515.   {                /* bfd_write_contents */
  1516.     bfd_false,
  1517.     oasys_write_object_contents,
  1518.     _bfd_write_archive_contents,
  1519.     bfd_false,
  1520.   },
  1521.  
  1522.   BFD_JUMP_TABLE_GENERIC (oasys),
  1523.   BFD_JUMP_TABLE_COPY (_bfd_generic),
  1524.   BFD_JUMP_TABLE_CORE (_bfd_nocore),
  1525.   BFD_JUMP_TABLE_ARCHIVE (oasys),
  1526.   BFD_JUMP_TABLE_SYMBOLS (oasys),
  1527.   BFD_JUMP_TABLE_RELOCS (oasys),
  1528.   BFD_JUMP_TABLE_WRITE (oasys),
  1529.   BFD_JUMP_TABLE_LINK (oasys),
  1530.   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
  1531.  
  1532.   (PTR) 0
  1533. };
  1534.