Make all callers of malloc or realloc (including via obstacks)
[deliverable/binutils-gdb.git] / bfd / oasys.c
index 7484d3f6361c33c2d5bd6abae3a061898469ca19..adad8bf33e0faf4977dc5a64e4c8e77f34cdb927 100644 (file)
@@ -1,35 +1,43 @@
-/* bfd backend for oasys objects.
-   Written by Steve Chamberlain of Cygnus Support <steve@cygnus.com> */
+/* BFD back-end for oasys objects.
+   Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+   Written by Steve Chamberlain of Cygnus Support, <sac@cygnus.com>.
 
-/* Copyright (C) 1990, 1991 Free Software Foundation, Inc.
+This file is part of BFD, the Binary File Descriptor library.
 
-This file is part of BFD, the Binary File Diddler.
-
-BFD is free software; you can redistribute it and/or modify
+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 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-BFD is distributed in the hope that it will be useful,
+This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with BFD; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
-
-/* $Id$ */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #define UNDERSCORE_HACK 1
-#define offsetof(type, identifier) (size_t) &(((type *) 0)->identifier) 
-#include <ansidecl.h>
-
-#include "sysdep.h"
 #include "bfd.h"
+#include "sysdep.h"
 #include "libbfd.h"
 #include "oasys.h"
 #include "liboasys.h"
+
+/* XXX - FIXME.  offsetof belongs in the system-specific files in
+   ../include/sys. */
+/* Define offsetof for those systems which lack it */
+
+#ifndef offsetof
+#define offsetof(type, identifier) (size_t) &(((type *) 0)->identifier) 
+#endif
+
+static boolean oasys_write_sections PARAMS ((bfd *));
+
+/* Read in all the section data and relocation stuff too */
+PROTO(static boolean,oasys_slurp_section_data,(bfd *CONST abfd));
+
 static void 
 DEFUN(oasys_read_record,(abfd, record),
       bfd *CONST abfd AND 
@@ -73,7 +81,7 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
     bfd * CONST abfd)
 {
   oasys_record_union_type record;
-  oasys_data_type *data = oasys_data(abfd);
+  oasys_data_type *data = OASYS_DATA(abfd);
   boolean loop = true;
   asymbol *dest_defined;
   asymbol *dest;
@@ -93,7 +101,11 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
 #else
   data->strings = bfd_alloc(abfd, data->symbol_string_length);
 #endif
-
+  if (!data->symbols || !data->strings)
+    {
+      bfd_error = no_memory;
+      return false;
+    }
 
   dest_defined = data->symbols + abfd->symcount -1;
 
@@ -108,7 +120,7 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
     case oasys_record_is_local_enum:
     case oasys_record_is_symbol_enum:
        {
-         int     flag = record.header.type == oasys_record_is_local_enum ?
+         int     flag = record.header.type == (int)oasys_record_is_local_enum ?
            (BSF_LOCAL) : (BSF_GLOBAL | BSF_EXPORT);
 
 
@@ -116,17 +128,24 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
          switch (record.symbol.relb & RELOCATION_TYPE_BITS) {
          case RELOCATION_TYPE_ABS:
            dest = dest_defined--;
-           dest->section = 0;
-           dest->flags = BSF_ABSOLUTE | flag;
+           dest->section = &bfd_abs_section;
+           dest->flags =  0;
+           
            break;
          case RELOCATION_TYPE_REL:
            dest = dest_defined--;
            dest->section =
-             oasys_data(abfd)->sections[record.symbol.relb &
+             OASYS_DATA(abfd)->sections[record.symbol.relb &
                                         RELOCATION_SECT_BITS];
-           if (record.header.type == oasys_record_is_local_enum) 
+           if (record.header.type == (int)oasys_record_is_local_enum) 
                {
                  dest->flags = BSF_LOCAL;
+                 if (dest->section ==(asection *)(~0)) {
+                   /* It seems that sometimes internal symbols are tied up, but
+                      still get output, even though there is no
+                      section */
+                   dest->section = 0;
+                 }
                }
            else {
 
@@ -134,23 +153,26 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
            }
            break;
          case RELOCATION_TYPE_UND:
-           dest = data->symbols + bfd_h_getshort(abfd, (bfd_byte *)&record.symbol.refno[0]);
-           dest->section = (asection *)NULL;
-           dest->flags = BSF_UNDEFINED;
+           dest = data->symbols + bfd_h_get_16(abfd, record.symbol.refno);
+           dest->section = &bfd_und_section;
            break;
          case RELOCATION_TYPE_COM:
            dest = dest_defined--;
            dest->name = string_ptr;
            dest->the_bfd = abfd;
 
-           dest->section = (asection *)NULL;
-           dest->flags = BSF_FORT_COMM;
+           dest->section = &bfd_com_section;
+
+           break;
+         default:
+           dest = dest_defined--;
+           BFD_ASSERT(0);
            break;
          }
          dest->name = string_ptr;
          dest->the_bfd = abfd;
          dest->udata = (PTR)NULL;
-         dest->value = bfd_h_getlong(abfd, &record.symbol.value[0]);
+         dest->value = bfd_h_get_32(abfd, record.symbol.value);
 
 #ifdef UNDERSCORE_HACK
          if (record.symbol.name[0] != '_') {
@@ -170,7 +192,6 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
     }
   }
   return true;
-
 }
 
 static unsigned int
@@ -197,7 +218,7 @@ DEFUN(oasys_get_symtab,(abfd, location),
   if (oasys_slurp_symbol_table(abfd) == false) {
     return 0;
   }
-  symbase = oasys_data(abfd)->symbols;
+  symbase = OASYS_DATA(abfd)->symbols;
   for (counter = 0; counter < abfd->symcount; counter++) {
     *(location++) = symbase++;
   }
@@ -208,34 +229,33 @@ DEFUN(oasys_get_symtab,(abfd, location),
 /***********************************************************************
 *  archive stuff 
 */
-#define swap(x) x = bfd_h_get_x(abfd, &x);
+
 static bfd_target *
 DEFUN(oasys_archive_p,(abfd),
       bfd *abfd)
 {
   oasys_archive_header_type header;
+  oasys_extarchive_header_type header_ext;
   unsigned int i;
-  
-  bfd_seek(abfd, (file_ptr) 0, false);
+  file_ptr filepos;  
 
-  
-  bfd_read((PTR)&header, 1, sizeof(header), abfd);
+  bfd_seek(abfd, (file_ptr) 0, false);
+  bfd_read((PTR)&header_ext, 1, sizeof(header_ext), abfd);
 
-  
-  swap(header.version);
-  swap(header.mod_count);
-  swap(header.mod_tbl_offset);
-  swap(header.sym_tbl_size);
-  swap(header.sym_count);
-  swap(header.sym_tbl_offset);
-  swap(header.xref_count);
-  swap(header.xref_lst_offset);
+  header.version = bfd_h_get_32(abfd, header_ext.version);
+  header.mod_count = bfd_h_get_32(abfd, header_ext.mod_count);
+  header.mod_tbl_offset = bfd_h_get_32(abfd, header_ext.mod_tbl_offset);
+  header.sym_tbl_size = bfd_h_get_32(abfd, header_ext.sym_tbl_size);
+  header.sym_count = bfd_h_get_32(abfd, header_ext.sym_count);
+  header.sym_tbl_offset = bfd_h_get_32(abfd, header_ext.sym_tbl_offset);
+  header.xref_count = bfd_h_get_32(abfd, header_ext.xref_count);
+  header.xref_lst_offset = bfd_h_get_32(abfd, header_ext.xref_lst_offset);
 
   /*
-     There isn't a magic number in an Oasys archive, so the best we
-     can do to verify reasnableness is to make sure that the values in
-     the header are too weird
-     */
+    There isn't a magic number in an Oasys archive, so the best we
+    can do to verify reasnableness is to make sure that the values in
+    the header are too weird
+    */
 
   if (header.version>10000 ||
       header.mod_count>10000 ||
@@ -243,42 +263,93 @@ DEFUN(oasys_archive_p,(abfd),
       header.xref_count > 100000) return (bfd_target *)NULL;
 
   /*
-     That all worked, lets buy the space for the header and read in
-     the headers.
-     */
-  {
-    oasys_ar_data_type *ar =
-      (oasys_ar_data_type*) bfd_alloc(abfd, sizeof(oasys_ar_data_type));
+    That all worked, let's buy the space for the header and read in
+    the headers.
+    */
+    {
+      oasys_ar_data_type *ar =
+       (oasys_ar_data_type*) bfd_alloc(abfd, sizeof(oasys_ar_data_type));
 
+      oasys_module_info_type *module = 
+       (oasys_module_info_type*)
+         bfd_alloc(abfd, sizeof(oasys_module_info_type) * header.mod_count);
+      oasys_module_table_type record;
 
-    oasys_module_info_type *module = 
-      (oasys_module_info_type*)
-       bfd_alloc(abfd, sizeof(oasys_module_info_type) * header.mod_count);
+      if (!ar || !module)
+       {
+         bfd_error = no_memory;
+         return NULL;
+       }
 
-    oasys_module_table_type record;
+      abfd->tdata.oasys_ar_data = ar;
+      ar->module = module;
+      ar->module_count = header.mod_count;
 
-    set_tdata(abfd, ar);
-    ar->module = module;
-    ar->module_count = header.mod_count;
+      filepos = header.mod_tbl_offset;
+      for (i = 0; i < header.mod_count; i++) {
+        bfd_seek(abfd, filepos, SEEK_SET);
 
-    bfd_seek(abfd , header.mod_tbl_offset, SEEK_SET);
-    for (i = 0; i < header.mod_count; i++) {
-      bfd_read((PTR)&record, 1, sizeof(record), abfd);
-      swap(record.mod_size);
-      swap(record.file_offset);
-      swap(record.mod_name_length);
-      module[i].name = bfd_alloc(abfd,record.mod_name_length+1);
+       /* There are two ways of specifying the archive header */
 
-      bfd_read(module[i].name, 1, record.mod_name_length +1, abfd);
-      /* SKip some stuff */
-      bfd_seek(abfd, record.dep_count * sizeof(int32_type),
-           SEEK_CUR);
+       if (0) {
+         oasys_extmodule_table_type_a_type record_ext;
+         bfd_read((PTR)&record_ext, 1, sizeof(record_ext), abfd);
+       
+         record.mod_size = bfd_h_get_32(abfd, record_ext.mod_size);
+         record.file_offset = bfd_h_get_32(abfd, record_ext.file_offset);
 
-      module[i].size = record.mod_size;
-      module[i].pos = record.file_offset;
-    }
+         record.dep_count = bfd_h_get_32(abfd, record_ext.dep_count);
+         record.depee_count = bfd_h_get_32(abfd, record_ext.depee_count);
+         record.sect_count = bfd_h_get_32(abfd, record_ext.sect_count);
+
+         module[i].name = bfd_alloc(abfd,33);
+         if (!module[i].name)
+           {
+             bfd_error = no_error;
+             return NULL;
+           }
+
+         memcpy(module[i].name, record_ext.mod_name, 33);
+         filepos +=
+           sizeof(record_ext) + 
+             record.dep_count * 4 +
+               record.depee_count * 4 +
+                 record.sect_count * 8 + 187;
+       }
+       else {
+         oasys_extmodule_table_type_b_type record_ext;
+         bfd_read((PTR)&record_ext, 1, sizeof(record_ext), abfd);
+       
+         record.mod_size = bfd_h_get_32(abfd, record_ext.mod_size);
+         record.file_offset = bfd_h_get_32(abfd, record_ext.file_offset);
+
+         record.dep_count = bfd_h_get_32(abfd, record_ext.dep_count);
+         record.depee_count = bfd_h_get_32(abfd, record_ext.depee_count);
+         record.sect_count = bfd_h_get_32(abfd, record_ext.sect_count);
+         record.module_name_size = bfd_h_get_32(abfd, record_ext.mod_name_length);
+
+         module[i].name = bfd_alloc(abfd,record.module_name_size + 1);
+         if (!module[i].name)
+           {
+             bfd_error = no_error;
+             return NULL;
+           }
+         bfd_read((PTR)module[i].name, 1, record.module_name_size, abfd);
+         module[i].name[record.module_name_size] = 0;
+         filepos +=
+           sizeof(record_ext) + 
+             record.dep_count * 4 +
+               record.module_name_size + 1;
+
+       }
+
+
+       module[i].size = record.mod_size;
+       module[i].pos = record.file_offset;
+       module[i].abfd = 0;
+      }
       
-  }
+    }
   return abfd->xvec;
 }
 
@@ -286,12 +357,9 @@ static boolean
 DEFUN(oasys_mkobject,(abfd),
       bfd *abfd)
 {
-  oasys_data_type *oasys;
 
-  set_tdata (abfd,
-    (oasys_data_type*)bfd_alloc(abfd, sizeof(oasys_data_type)));
-  oasys = oasys_data(abfd);
-  return true;
+  abfd->tdata.oasys_obj_data =    (oasys_data_type*)bfd_alloc(abfd, sizeof(oasys_data_type));
+  return abfd->tdata.oasys_obj_data ? true : false;
 }
 
 #define MAX_SECS 16
@@ -300,13 +368,13 @@ DEFUN(oasys_object_p,(abfd),
       bfd *abfd)
 {
   oasys_data_type *oasys;
-  oasys_data_type *save = oasys_data(abfd);
+  oasys_data_type *save = OASYS_DATA(abfd);
   boolean loop = true;
   boolean had_usefull = false;
 
-  set_tdata (abfd, 0);
+  abfd->tdata.oasys_obj_data = 0;
   oasys_mkobject(abfd);
-  oasys = oasys_data(abfd);
+  oasys = OASYS_DATA(abfd);
   memset((PTR)oasys->sections, 0xff, sizeof(oasys->sections));
     
   /* Point to the start of the file */
@@ -344,6 +412,11 @@ DEFUN(oasys_object_p,(abfd),
                goto fail;
              }
          buffer = bfd_alloc(abfd, 3);
+         if (!buffer)
+           {
+             bfd_error = no_memory;
+             goto fail;
+           }
          section_number= record.section.relb & RELOCATION_SECT_BITS;
          sprintf(buffer,"%u", section_number);
          s = bfd_make_section(abfd,buffer);
@@ -357,9 +430,9 @@ DEFUN(oasys_object_p,(abfd),
            BFD_FAIL();
          }
 
-         s->size  = bfd_h_getlong(abfd, & record.section.value[0]) ;
-         s->vma = bfd_h_getlong(abfd, &record.section.vma[0]);
-         s->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
+         s->_raw_size  = bfd_h_get_32(abfd, record.section.value);
+         s->vma = bfd_h_get_32(abfd, record.section.vma);
+         s->flags= 0;
          had_usefull = true;
        }
       break;
@@ -381,38 +454,56 @@ DEFUN(oasys_object_p,(abfd),
     Oasys support several architectures, but I can't see a simple way
     to discover which one is in a particular file - we'll guess 
     */
-  abfd->obj_arch = bfd_arch_m68k;
-  abfd->obj_machine =0;
+  bfd_default_set_arch_mach(abfd, bfd_arch_m68k, 0);
   if (abfd->symcount != 0) {
     abfd->flags |= HAS_SYMS;
   }
+
+  /* 
+    We don't know if a section has data until we've read it..
+    */
+
+  oasys_slurp_section_data(abfd);
+
+
   return abfd->xvec;
 
  fail:
   (void)  bfd_release(abfd, oasys);
-  oasys_data(abfd) = save;
+  abfd->tdata.oasys_obj_data = save;
   return (bfd_target *)NULL;
 }
 
 
+static void 
+DEFUN(oasys_get_symbol_info,(ignore_abfd, symbol, ret),
+      bfd *ignore_abfd AND
+      asymbol *symbol AND
+      symbol_info *ret)
+{
+  bfd_symbol_info (symbol, ret);
+  if (!symbol->section)
+    ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A';
+}
+
 static void 
 DEFUN(oasys_print_symbol,(ignore_abfd, afile, symbol, how),
       bfd *ignore_abfd AND
       PTR afile AND
       asymbol *symbol AND
-      bfd_print_symbol_enum_type how)
+      bfd_print_symbol_type how)
 {
   FILE *file = (FILE *)afile;
 
   switch (how) {
-  case bfd_print_symbol_name_enum:
-  case bfd_print_symbol_type_enum:
+  case bfd_print_symbol_name:
+  case bfd_print_symbol_more:
     fprintf(file,"%s", symbol->name);
     break;
-  case bfd_print_symbol_all_enum:
+  case bfd_print_symbol_all:
     {
-CONST      char *section_name = symbol->section == (asection *)NULL ?
-       "*abs" : symbol->section->name;
+      CONST char *section_name = symbol->section == (asection *)NULL ?
+       (CONST char *) "*abs" : symbol->section->name;
 
       bfd_print_symbol_vandf((PTR)file,symbol);
 
@@ -430,10 +521,10 @@ CONST      char *section_name = symbol->section == (asection *)NULL ?
 static reloc_howto_type howto_table[]= 
 {
 
-HOWTO(  0, 0,  1,   16, false,0,   true,true,0,"abs16",true,0x0000ffff, 0x0000ffff,false),
-HOWTO(  0, 0,  2,   32, false,0,   true,true,0,"abs32",true,0xffffffff, 0xffffffff,false),
-HOWTO(  0, 0,  1,   16, true,0,   true,true,0,"pcrel16",true,0x0000ffff, 0x0000ffff,false),
-HOWTO(  0, 0,  2,   32, true,0,   true,true,0,"pcrel32",true,0xffffffff, 0xffffffff,false)
+HOWTO(  0, 0,  1,   16, false,0,complain_overflow_bitfield,0,"abs16",true,0x0000ffff, 0x0000ffff,false),
+HOWTO(  0, 0,  2,   32, false,0,complain_overflow_bitfield,0,"abs32",true,0xffffffff, 0xffffffff,false),
+HOWTO(  0, 0,  1,   16, true,0,complain_overflow_signed,0,"pcrel16",true,0x0000ffff, 0x0000ffff,false),
+HOWTO(  0, 0,  2,   32, true,0,complain_overflow_signed,0,"pcrel32",true,0xffffffff, 0xffffffff,false)
 };
 
 /* Read in all the section data and relocation stuff too */
@@ -442,184 +533,218 @@ DEFUN(oasys_slurp_section_data,(abfd),
   bfd *CONST abfd)
 {
   oasys_record_union_type record;
-  oasys_data_type *data = oasys_data(abfd);
+  oasys_data_type *data = OASYS_DATA(abfd);
   boolean loop = true;
 
   oasys_per_section_type *per ;
 
   asection *s;
 
-  /* Buy enough memory for all the section data and relocations */
+  /* See if the data has been slurped already .. */
   for (s = abfd->sections; s != (asection *)NULL; s= s->next) {
     per =  oasys_per_section(s);
-    if (per->data != (bfd_byte*)NULL) return true;
-    per->data = (bfd_byte *) bfd_alloc(abfd, s->size);
-    per->reloc_tail_ptr = (oasys_reloc_type **)&(s->relocation);
-    per->had_vma = false;
-    s->reloc_count = 0;
+    if (per->initialized == true) 
+      return true;
   }
 
   if (data->first_data_record == 0)  return true;
+
   bfd_seek(abfd, data->first_data_record, SEEK_SET);
   while (loop) {
     oasys_read_record(abfd, &record);
-    switch (record.header.type) {
-    case oasys_record_is_header_enum:
-      break;
-    case oasys_record_is_data_enum:
+    switch (record.header.type) 
        {
+       case oasys_record_is_header_enum:
+         break;
+       case oasys_record_is_data_enum:
+           {
+
+             bfd_byte *src = record.data.data;
+             bfd_byte *end_src = ((bfd_byte *)&record) + record.header.length;
+             bfd_byte *dst_ptr;
+             bfd_byte *dst_base_ptr;
+             unsigned int relbit;
+             unsigned int count;
+             asection *  section =
+               data->sections[record.data.relb & RELOCATION_SECT_BITS];
+             bfd_vma dst_offset ;
+
+             per =  oasys_per_section(section);
+
+             if (per->initialized == false) 
+                 {
+                   per->data = (bfd_byte *) bfd_zalloc(abfd, section->_raw_size);
+                   if (!per->data)
+                     {
+                       bfd_error = no_memory;
+                       return false;
+                     }
+                   per->reloc_tail_ptr = (oasys_reloc_type **)&(section->relocation);
+                   per->had_vma = false;
+                   per->initialized = true;
+                   section->reloc_count = 0;
+                   section->flags = SEC_ALLOC;
+                 }
 
-         uint8e_type *src = record.data.data;
-         uint8e_type *end_src = ((uint8e_type *)&record) +
-           record.header.length;
-         unsigned int relbit;
-         bfd_byte *dst_ptr ;
-         bfd_byte *dst_base_ptr ;
-         unsigned int count;
-         asection *  section =
-           data->sections[record.data.relb & RELOCATION_SECT_BITS];
-         bfd_vma dst_offset ;
-         per =  oasys_per_section(section);
-         dst_offset = bfd_h_getlong(abfd, record.data.addr) ;
-         if (per->had_vma == false) {
-           /* Take the first vma we see as the base */
-
-           section->vma = dst_offset;
-           per->had_vma = true;
-         }
+             dst_offset = bfd_h_get_32(abfd, record.data.addr) ;
+             if (per->had_vma == false) {
+               /* Take the first vma we see as the base */
+               section->vma = dst_offset;
+               per->had_vma = true;
+             }
 
+             dst_offset -=   section->vma;
 
-         dst_offset -=   section->vma;
-
-
-         dst_base_ptr = oasys_per_section(section)->data;
-         dst_ptr = oasys_per_section(section)->data +
-           dst_offset;
-
-         while (src < end_src) {
-           uint32_type gap = end_src - src -1;
-           uint8e_type mod_byte = *src++;
-           count = 8;
-           if (mod_byte == 0 && gap >= 8) {
-             dst_ptr[0] = src[0];
-             dst_ptr[1] = src[1];
-             dst_ptr[2] = src[2];
-             dst_ptr[3] = src[3];
-             dst_ptr[4] = src[4];
-             dst_ptr[5] = src[5];
-             dst_ptr[6] = src[6];
-             dst_ptr[7] = src[7];
-             dst_ptr+= 8;
-             src += 8;
-           }
-           else {
-             for (relbit = 1; count-- != 0 && gap != 0; gap --, relbit <<=1) 
-                 {
-                   if (relbit & mod_byte) 
-                       {
-                         uint8e_type reloc = *src;
-                         /* This item needs to be relocated */
-                         switch (reloc & RELOCATION_TYPE_BITS) {
-                         case RELOCATION_TYPE_ABS:
-
-                           break;
-
-                         case RELOCATION_TYPE_REL: 
-                             {
-                               /* Relocate the item relative to the section */
-                               oasys_reloc_type *r =
-                                 (oasys_reloc_type *)
-                                   bfd_alloc(abfd,
-                                             sizeof(oasys_reloc_type));
-                               *(per->reloc_tail_ptr) = r;
-                               per->reloc_tail_ptr = &r->next;
-                               r->next= (oasys_reloc_type *)NULL;
-                               /* Reference to undefined symbol */
-                               src++;
-                               /* There is no symbol */
-                               r->symbol = 0;
-                               /* Work out the howto */
-                               r->relent.section =
-                                 data->sections[reloc & RELOCATION_SECT_BITS];
-                               r->relent.addend = - r->relent.section->vma;
-                               r->relent.address = dst_ptr - dst_base_ptr;
-                               r->relent.howto = &howto_table[reloc>>6];
-                               r->relent.sym_ptr_ptr = (asymbol **)NULL;
-                               section->reloc_count++;
-
-                               /* Fake up the data to look like it's got the -ve pc in it, this makes
-                                  it much easier to convert into other formats. This is done by
-                                  hitting the addend.
-                                  */
-                               if (r->relent.howto->pc_relative == true) {
-                                 r->relent.addend -= dst_ptr - dst_base_ptr;
-                               }
+             dst_base_ptr = oasys_per_section(section)->data;
+             dst_ptr = oasys_per_section(section)->data +
+               dst_offset;
 
-
-                             }
-                           break;
-
-
-                         case RELOCATION_TYPE_UND:
-                             { 
-                               oasys_reloc_type *r =
-                                 (oasys_reloc_type *)
-                                   bfd_alloc(abfd,
-                                             sizeof(oasys_reloc_type));
-                               *(per->reloc_tail_ptr) = r;
-                               per->reloc_tail_ptr = &r->next;
-                               r->next= (oasys_reloc_type *)NULL;
-                               /* Reference to undefined symbol */
-                               src++;
-                               /* Get symbol number */
-                               r->symbol = (src[0]<<8) | src[1];
-                               /* Work out the howto */
-                               r->relent.section = (asection *)NULL;
-                               r->relent.addend = 0;
-                               r->relent.address = dst_ptr - dst_base_ptr;
-                               r->relent.howto = &howto_table[reloc>>6];
-                               r->relent.sym_ptr_ptr = (asymbol **)NULL;
-                               section->reloc_count++;
-
-                               src+=2;
-                               /* Fake up the data to look like it's got the -ve pc in it, this makes
-                                  it much easier to convert into other formats. This is done by
-                                  hitting the addend.
-                                  */
-                               if (r->relent.howto->pc_relative == true) {
-                                 r->relent.addend -= dst_ptr - dst_base_ptr;
-                               }
+             if (src < end_src) {
+               section->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
+             }
+             while (src < end_src) {
+               unsigned char mod_byte = *src++;
+               size_t gap = end_src - src;
+               
+               count = 8;
+               if (mod_byte == 0 && gap >= 8) {
+                 dst_ptr[0] = src[0];
+                 dst_ptr[1] = src[1];
+                 dst_ptr[2] = src[2];
+                 dst_ptr[3] = src[3];
+                 dst_ptr[4] = src[4];
+                 dst_ptr[5] = src[5];
+                 dst_ptr[6] = src[6];
+                 dst_ptr[7] = src[7];
+                 dst_ptr+= 8;
+                 src += 8;
+               }
+               else {
+                 for (relbit = 1; count-- != 0 && src < end_src; relbit <<=1) 
+                     {
+                       if (relbit & mod_byte) 
+                           {
+                             unsigned char reloc = *src;
+                             /* This item needs to be relocated */
+                             switch (reloc & RELOCATION_TYPE_BITS) {
+                             case RELOCATION_TYPE_ABS:
+
+                               break;
+
+                             case RELOCATION_TYPE_REL: 
+                                 {
+                                   /* Relocate the item relative to the section */
+                                   oasys_reloc_type *r =
+                                     (oasys_reloc_type *)
+                                       bfd_alloc(abfd,
+                                                 sizeof(oasys_reloc_type));
+                                   if (!r)
+                                     {
+                                       bfd_error = no_memory;
+                                       return false;
+                                     }
+                                   *(per->reloc_tail_ptr) = r;
+                                   per->reloc_tail_ptr = &r->next;
+                                   r->next= (oasys_reloc_type *)NULL;
+                                   /* Reference to undefined symbol */
+                                   src++;
+                                   /* There is no symbol */
+                                   r->symbol = 0;
+                                   /* Work out the howto */
+                                   abort();
+#if 0
+                                   r->relent.section =
+                                     data->sections[reloc &
+                                                    RELOCATION_SECT_BITS];
+
+                                   r->relent.addend = -
+                                     r->relent.section->vma;
+#endif
+                                   r->relent.address = dst_ptr - dst_base_ptr;
+                                   r->relent.howto = &howto_table[reloc>>6];
+                                   r->relent.sym_ptr_ptr = (asymbol **)NULL;
+                                   section->reloc_count++;
+
+                                   /* Fake up the data to look like it's got the -ve pc in it, this makes
+                                      it much easier to convert into other formats. This is done by
+                                      hitting the addend.
+                                      */
+                                   if (r->relent.howto->pc_relative == true) {
+                                     r->relent.addend -= dst_ptr - dst_base_ptr;
+                                   }
+
+
+                                 }
+                               break;
+
+
+                             case RELOCATION_TYPE_UND:
+                                 { 
+                                   oasys_reloc_type *r =
+                                     (oasys_reloc_type *)
+                                       bfd_alloc(abfd,
+                                                 sizeof(oasys_reloc_type));
+                                   if (!r)
+                                     {
+                                       bfd_error = no_memory;
+                                       return false;
+                                     }
+                                   *(per->reloc_tail_ptr) = r;
+                                   per->reloc_tail_ptr = &r->next;
+                                   r->next= (oasys_reloc_type *)NULL;
+                                   /* Reference to undefined symbol */
+                                   src++;
+                                   /* Get symbol number */
+                                   r->symbol = (src[0]<<8) | src[1];
+                                   /* Work out the howto */
+                                   abort();
+                                   
+#if 0
+                                   r->relent.section = (asection
+                                                        *)NULL;
+#endif
+                                   r->relent.addend = 0;
+                                   r->relent.address = dst_ptr - dst_base_ptr;
+                                   r->relent.howto = &howto_table[reloc>>6];
+                                   r->relent.sym_ptr_ptr = (asymbol **)NULL;
+                                   section->reloc_count++;
+
+                                   src+=2;
+                                   /* Fake up the data to look like it's got the -ve pc in it, this makes
+                                      it much easier to convert into other formats. This is done by
+                                      hitting the addend.
+                                      */
+                                   if (r->relent.howto->pc_relative == true) {
+                                     r->relent.addend -= dst_ptr - dst_base_ptr;
+                                   }
 
                                
 
+                                 }
+                               break;
+                             case RELOCATION_TYPE_COM:
+                               BFD_FAIL();
                              }
-                           break;
-                         case RELOCATION_TYPE_COM:
-                           BFD_FAIL();
-                         }
-                       }
-                   *dst_ptr++ = *src++;
-                 }
+                           }
+                       *dst_ptr++ = *src++;
+                     }
+               }
+             }   
            }
-         }       
+         break;
+       case oasys_record_is_local_enum:
+       case oasys_record_is_symbol_enum:
+       case oasys_record_is_section_enum:
+         break;
+       default:
+         loop = false;
        }
-      break;
-    case oasys_record_is_local_enum:
-    case oasys_record_is_symbol_enum:
-    case oasys_record_is_section_enum:
-      break;
-    default:
-      loop = false;
-    }
   }
+
   return true;
 
 }
 
-
-
-bfd_error_vector_type bfd_error_vector;
-
 static boolean
 DEFUN(oasys_new_section_hook,(abfd, newsect),
       bfd *abfd AND
@@ -627,10 +752,16 @@ DEFUN(oasys_new_section_hook,(abfd, newsect),
 {
   newsect->used_by_bfd = (PTR)
     bfd_alloc(abfd, sizeof(oasys_per_section_type));
+  if (!newsect->used_by_bfd)
+    {
+      bfd_error = no_memory;
+      return false;
+    }
   oasys_per_section( newsect)->data = (bfd_byte *)NULL;
   oasys_per_section(newsect)->section = newsect;
   oasys_per_section(newsect)->offset  = 0;
-  newsect->alignment_power = 3;
+  oasys_per_section(newsect)->initialized = false;
+  newsect->alignment_power = 1;
   /* Turn the section string into an index */
 
   sscanf(newsect->name,"%u", &newsect->target_index);
@@ -654,18 +785,25 @@ DEFUN(oasys_get_section_contents,(abfd, section, location, offset, count),
       sec_ptr section AND
       PTR location AND
       file_ptr offset AND
-      int count)
+      bfd_size_type count)
 {
   oasys_per_section_type *p = (oasys_per_section_type *) section->used_by_bfd;
   oasys_slurp_section_data(abfd);
-  (void)  memcpy(location, p->data + offset, count);
+  if (p->initialized == false) 
+      {
+       (void) memset(location, 0, (int)count);
+      }
+  else 
+      {
+       (void) memcpy(location,(PTR)( p->data + offset), (int)count);
+      }
   return true;
 }
 
 
 unsigned int
-DEFUN(oasys_canonicalize_reloc,(abfd, section, relptr, symbols),
-      bfd *abfd AND
+DEFUN(oasys_canonicalize_reloc,(ignore_abfd, section, relptr, symbols),
+      bfd *ignore_abfd AND
       sec_ptr section AND
       arelent **relptr AND
       asymbol **symbols)
@@ -673,10 +811,15 @@ DEFUN(oasys_canonicalize_reloc,(abfd, section, relptr, symbols),
   unsigned int reloc_count = 0;
   oasys_reloc_type *src = (oasys_reloc_type *)(section->relocation);
   while (src != (oasys_reloc_type *)NULL) {
+      abort();
+      
+#if 0
     if (src->relent.section == (asection *)NULL) 
        {
          src->relent.sym_ptr_ptr = symbols + src->symbol;
        }
+#endif
+
     *relptr ++ = &src->relent;
     src = src->next;
     reloc_count++;
@@ -686,17 +829,6 @@ DEFUN(oasys_canonicalize_reloc,(abfd, section, relptr, symbols),
 }
 
 
-boolean
-DEFUN(oasys_set_arch_mach, (abfd, arch, machine),
-      bfd *abfd AND
-      enum bfd_architecture arch AND
-      unsigned long machine)
-{
-  abfd->obj_arch = arch;
-  abfd->obj_machine = machine;
-  return true;
-}
-
 
 
 /* Writing */
@@ -712,12 +844,13 @@ DEFUN(oasys_write_record,(abfd, type, record, size),
 {
   int checksum;
   size_t i;
-  uint8e_type *ptr;
+  unsigned char *ptr;
+
   record->header.length = size;
-  record->header.type = type;
+  record->header.type = (int)type;
   record->header.check_sum = 0;
   record->header.fill = 0;
-  ptr = &record->pad[0];
+  ptr = (unsigned char *)&record->pad[0];
   checksum = 0;
   for (i = 0; i < size; i++) {
     checksum += *ptr++;
@@ -744,19 +877,19 @@ DEFUN(oasys_write_syms, (abfd),
     char *dst = symbol.name;
     unsigned int l = 0;
 
-    if (g->flags & BSF_FORT_COMM) {
+    if (bfd_is_com_section (g->section)) {
       symbol.relb = RELOCATION_TYPE_COM;
-      bfd_h_putshort(abfd, index, (uint8e_type *)(&symbol.refno[0]));
+      bfd_h_put_16(abfd, index, symbol.refno);
       index++;
     }
-    else if (g->flags & BSF_ABSOLUTE) {
+    else if (g->section == & bfd_abs_section) {
       symbol.relb = RELOCATION_TYPE_ABS;
-      bfd_h_putshort(abfd, 0, (uint8e_type *)(&symbol.refno[0]));
+      bfd_h_put_16(abfd, 0, symbol.refno);
 
     }
-    else if (g->flags & BSF_UNDEFINED) {
+    else if (g->section == &bfd_und_section) {
       symbol.relb = RELOCATION_TYPE_UND ;
-      bfd_h_putshort(abfd, index, (uint8e_type *)(&symbol.refno[0]));
+      bfd_h_put_16(abfd, index, symbol.refno);
       /* Overload the value field with the output index number */
       index++;
     }
@@ -765,15 +898,27 @@ DEFUN(oasys_write_syms, (abfd),
       continue;
     }
     else {
-      symbol.relb = RELOCATION_TYPE_REL | g->section->output_section->target_index;
-      bfd_h_putshort(abfd, 0, (uint8e_type *)(&symbol.refno[0]));
+      if (g->section == (asection *)NULL) {
+       /* Sometime, the oasys tools give out a symbol with illegal
+          bits in it, we'll output it in the same broken way */
+       
+       symbol.relb = RELOCATION_TYPE_REL | 0;
+      }
+      else {
+       symbol.relb = RELOCATION_TYPE_REL |g->section->output_section->target_index;
+      }
+      bfd_h_put_16(abfd, 0, symbol.refno);
     }
+#ifdef UNDERSCORE_HACK
+    if (src[l] == '_')
+      dst[l++] = '.';
+#endif
     while (src[l]) {
       dst[l] = src[l];
       l++;
     }
 
-    bfd_h_putlong(abfd, g->value, symbol.value);
+    bfd_h_put_32(abfd, g->value, symbol.value);
 
       
     if (g->flags & BSF_LOCAL) {
@@ -794,28 +939,29 @@ DEFUN(oasys_write_syms, (abfd),
 
 
   /* Write a section header for each section */
-static void 
-DEFUN(oasys_write_sections, (abfd),
-      bfd *CONST abfd)
+static boolean
+oasys_write_sections (abfd)
+     bfd *abfd;
 {
   asection *s;
-  static  oasys_section_record_type out = {0};
+  static oasys_section_record_type out;
 
   for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
     if (!isdigit(s->name[0])) 
        {
-          bfd_error_vector.nonrepresentable_section(abfd,
-                                                   s->name);
+         bfd_error = nonrepresentable_section;
+         return false;
        }
     out.relb = RELOCATION_TYPE_REL | s->target_index;
-    bfd_h_putlong(abfd, s->size, out.value);
-    bfd_h_putlong(abfd, s->vma, out.vma);
+    bfd_h_put_32(abfd, s->_cooked_size, out.value);
+    bfd_h_put_32(abfd, s->vma, out.vma);
 
     oasys_write_record(abfd,
                       oasys_record_is_section_enum,
                       (oasys_record_union_type *) &out,
                       sizeof(out));
   }
+  return true;
 }
 
 static void
@@ -852,11 +998,11 @@ DEFUN(oasys_write_end,(abfd),
       bfd *CONST abfd)
 {
   oasys_end_record_type end;
-  uint8e_type null = 0;
+  unsigned char null = 0;
   end.relb = RELOCATION_TYPE_ABS;
-  bfd_h_putlong(abfd, abfd->start_address, end.entry); 
-  bfd_h_putshort(abfd, 0, end.fill);
-  end.zero =0;
+  bfd_h_put_32(abfd, abfd->start_address, end.entry); 
+  bfd_h_put_16(abfd, 0, end.fill);
+  end.zero = 0;
   oasys_write_record(abfd,
                     oasys_record_is_end_enum,
                     (oasys_record_union_type *)&end,
@@ -884,149 +1030,173 @@ DEFUN(oasys_write_data, (abfd),
 {
   asection *s;
   for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
-    uint8e_type *raw_data = oasys_per_section(s)->data;
-    oasys_data_record_type processed_data;
-    unsigned int current_byte_index = 0;
-    unsigned int relocs_to_go = s->reloc_count;
-    arelent **p = s->orelocation;
-    if (s->reloc_count != 0) {
-      /* Sort the reloc records so it's easy to insert the relocs into the
-        data */
+    if (s->flags & SEC_LOAD) {
+      bfd_byte *raw_data = oasys_per_section(s)->data;
+      oasys_data_record_type processed_data;
+      bfd_size_type current_byte_index = 0;
+      unsigned int relocs_to_go = s->reloc_count;
+      arelent **p = s->orelocation;
+      if (s->reloc_count != 0) {
+/* Sort the reloc records so it's easy to insert the relocs into the
+          data */
     
-      qsort(s->orelocation,
-           s->reloc_count,
-           sizeof(arelent **),
-           comp);
-    }
-    current_byte_index = 0;
-    processed_data.relb = s->target_index | RELOCATION_TYPE_REL;
-
-    while ((size_t)current_byte_index < s->size) 
-       {
-         /* Scan forwards by eight bytes or however much is left and see if
-            there are any relocations going on */
-         uint8e_type *mod = &processed_data.data[0];
-         uint8e_type *dst = &processed_data.data[1];
-
-         unsigned int i;
-         unsigned int long_length = 128;
-
+       qsort(s->orelocation,
+             s->reloc_count,
+             sizeof(arelent **),
+             comp);
+      }
+      current_byte_index = 0;
+      processed_data.relb = s->target_index | RELOCATION_TYPE_REL;
+
+      while (current_byte_index < s->_cooked_size) 
+         {
+           /* Scan forwards by eight bytes or however much is left and see if
+              there are any relocations going on */
+           bfd_byte *mod = &processed_data.data[0];
+           bfd_byte *dst = &processed_data.data[1];
+
+           unsigned int i = 0;
+           *mod = 0;
+
+
+           bfd_h_put_32(abfd, s->vma + current_byte_index,
+                        processed_data.addr);
+
+           /* Don't start a relocation unless you're sure you can finish it
+              within the same data record.  The worst case relocation is a
+              4-byte relocatable value which is split across two modification
+              bytes (1 relocation byte + 2 symbol reference bytes + 2 data +
+              1 modification byte + 2 data = 8 bytes total).  That's where
+              the magic number 8 comes from.
+           */
+           while (current_byte_index < s->_raw_size && dst <=
+               &processed_data.data[sizeof(processed_data.data)-8]) {
+           
+
+               if (relocs_to_go != 0) {        
+                 arelent *r = *p;
+                 const reloc_howto_type * const how=r->howto;
+                 /* There is a relocation, is it for this byte ? */
+                 if (r->address == current_byte_index) {
+                   unsigned char rel_byte;
+
+                   p++;
+                   relocs_to_go--;
+
+                   *mod |= (1<<i);
+                   if(how->pc_relative) {
+                     rel_byte = RELOCATION_PCREL_BIT;
+
+                     /* Also patch the raw data so that it doesn't have
+                        the -ve stuff any more */
+                     if (how->size != 2) {
+                       bfd_put_16(abfd, 
+                                  bfd_get_16(abfd,raw_data) +
+                                  current_byte_index, raw_data);
+                     }
 
-         bfd_h_putlong(abfd, s->vma + current_byte_index, processed_data.addr);
-         if ((size_t)(long_length + current_byte_index) > (size_t)(s->size)) {
-           long_length = s->size - current_byte_index;
-         }
-         while (long_length  > 0 &&  (dst - (uint8e_type*)&processed_data < 128)) {
-           
-           unsigned int length = long_length;
-           *mod =0;
-           if (length > 8)
-             length = 8;
-
-           for (i = 0; i < length; i++) {
-             if (relocs_to_go != 0) {  
-               arelent *r = *p;
-               reloc_howto_type *CONST how=r->howto;
-               /* There is a relocation, is it for this byte ? */
-               if (r->address == current_byte_index) {
-                 uint8e_type rel_byte;
-                 p++;
-                 relocs_to_go--;
-
-                 *mod |= (1<<i);
-                 if(how->pc_relative) {
-                   rel_byte = 0x80;
-
-                   /* Also patch the raw data so that it doesn't have
-                      the -ve stuff any more */
-                   if (how->size != 2) {
-                     bfd_putshort(abfd, 
-                                  bfd_getshort(abfd,raw_data) +
+                     else {
+                       bfd_put_32(abfd, 
+                                  bfd_get_32(abfd,raw_data) +
                                   current_byte_index, raw_data);
+                     }
                    }
-
                    else {
-                     bfd_putlong(abfd, 
-                                 bfd_getlong(abfd,raw_data) +
-                                 current_byte_index, raw_data);
+                     rel_byte = 0;
+                   }
+                   if (how->size ==2) {
+                     rel_byte |= RELOCATION_32BIT_BIT;
                    }
-                 }
-                 else {
-                   rel_byte = 0;
-                 }
-                 if (how->size ==2) {
-                   rel_byte |= 0x40;
-                 }
                  
-                 /* Is this a section relative relocation, or a symbol
-                    relative relocation ? */
-                 if (r->section != (asection*)NULL) 
-                     {
-                       /* The relent has a section attatched, so it must be section
-                          relative */
-                       rel_byte |= RELOCATION_TYPE_REL;
-                       rel_byte |= r->section->output_section->target_index;
-                       *dst++ = rel_byte;
-                     }
-                 else 
-                     {
-                       asymbol *p = *(r->sym_ptr_ptr);
-
-                       /* If this symbol has a section attatched, then it
-                          has already been resolved.  Change from a symbol
-                          ref to a section ref */
-                       if(p->section != (asection *)NULL) {
+                   /* Is this a section relative relocation, or a symbol
+                      relative relocation ? */
+                   abort();
+       
+#if 0
+                   if (r->section != (asection*)NULL) 
+                       {
+                         /* The relent has a section attached, so it must be section
+                            relative */
                          rel_byte |= RELOCATION_TYPE_REL;
-                         rel_byte |=
-                           p->section->output_section->target_index;
+                         rel_byte |= r->section->output_section->target_index;
                          *dst++ = rel_byte;
                        }
-                       else {
-                         rel_byte |= RELOCATION_TYPE_UND;
-                 
-
-                         *dst++ = rel_byte;
-                         /* Next two bytes are a symbol index - we can get
-                            this from the symbol value which has been zapped
-                            into the symbol index in the table when the
-                            symbol table was written
-                            */
-                         *dst++ = p->value >> 8;
-                         *dst++ = p->value;
+                   else 
+#endif
+                       {
+                         asymbol *p = *(r->sym_ptr_ptr);
+
+                         /* If this symbol has a section attached, then it
+                            has already been resolved.  Change from a symbol
+                            ref to a section ref */
+                         if(p->section != (asection *)NULL) {
+                           rel_byte |= RELOCATION_TYPE_REL;
+                           rel_byte |=
+                             p->section->output_section->target_index;
+                           *dst++ = rel_byte;
+                         }
+                         else {
+                           rel_byte |= RELOCATION_TYPE_UND;
+                           *dst++ = rel_byte;
+                           /* Next two bytes are a symbol index - we can get
+                              this from the symbol value which has been zapped
+                              into the symbol index in the table when the
+                              symbol table was written
+                              */
+                           *dst++ = p->value >> 8;
+                           *dst++ = p->value;
+                         }
                        }
-
-                     }
+#define ADVANCE { if (++i >= 8) { i = 0; mod = dst++; *mod = 0; } current_byte_index++; }
+                   /* relocations never occur from an unloadable section,
+                      so we can assume that raw_data is not NULL
+                    */
+                   *dst++ = *raw_data++;
+                   ADVANCE
+                   *dst++ = *raw_data++;
+                   ADVANCE
+                   if (how->size == 2) {
+                     *dst++ = *raw_data++;
+                     ADVANCE
+                     *dst++ = *raw_data++;
+                     ADVANCE
+                   }
+                   continue;
+                 }
                }
-             }
-             /* If this is coming from an unloadable section then copy
-                zeros */
-             if (raw_data == (uint8e_type *)NULL) {
-               *dst++ = 0;
-             }
-             else {
-               *dst++ = *raw_data++;
-             }
-             current_byte_index++;
+               /* If this is coming from an unloadable section then copy
+                  zeros */
+               if (raw_data == NULL) {
+                 *dst++ = 0;
+               }
+               else {
+                 *dst++ = *raw_data++;
+               }
+               ADVANCE
            }
-           mod = dst++;
-           long_length -= length;
-         }
 
-         oasys_write_record(abfd,
-                            oasys_record_is_data_enum,
-                            (oasys_record_union_type *)&processed_data,
-                            dst - (uint8e_type*)&processed_data);
+           /* Don't write a useless null modification byte */
+           if (dst == mod+1) {
+             --dst;
+           }
+
+           oasys_write_record(abfd,
+                              oasys_record_is_data_enum,
+                              (oasys_record_union_type *)&processed_data,
+                              dst - (bfd_byte *)&processed_data);
                         
-       }
+         }
+    }
   }
 }
 static boolean
 DEFUN(oasys_write_object_contents, (abfd),
-      bfd * CONST abfd)
+      bfd *abfd)
 {
   oasys_write_header(abfd);
   oasys_write_syms(abfd);
-  oasys_write_sections(abfd);
+  if (! oasys_write_sections(abfd))
+    return false;
   oasys_write_data(abfd);
   oasys_write_end(abfd);
   return true;
@@ -1046,15 +1216,20 @@ DEFUN(oasys_set_section_contents,(abfd, section, location, offset, count),
       sec_ptr section AND 
       PTR location AND
       file_ptr offset AND
-      int count)
+      bfd_size_type count)
 {
   if (count != 0) {
     if (oasys_per_section(section)->data == (bfd_byte *)NULL ) 
        {
          oasys_per_section(section)->data =
-           (bfd_byte *)(bfd_alloc(abfd,section->size));    
+           (bfd_byte *)(bfd_alloc(abfd,section->_cooked_size));    
+         if (!   oasys_per_section(section)->data)
+           {
+             bfd_error = no_memory;
+             return false;
+           }
        }
-    (void) memcpy(oasys_per_section(section)->data + offset,
+    (void) memcpy((PTR)(oasys_per_section(section)->data + offset),
                  location,
                  count);
   }
@@ -1076,9 +1251,13 @@ DEFUN(oasys_make_empty_symbol,(abfd),
 
   oasys_symbol_type  *new =
     (oasys_symbol_type *)bfd_zalloc (abfd, sizeof (oasys_symbol_type));
+  if (!new)
+    {
+      bfd_error = no_memory;
+      return NULL;
+    }
   new->symbol.the_bfd = abfd;
   return &new->symbol;
-
 }
 
 
@@ -1092,7 +1271,7 @@ oasys_openr_next_archived_file(arch, prev)
 bfd *arch;
 bfd *prev;
 {
-  oasys_ar_data_type *ar = oasys_ar_data(arch);
+  oasys_ar_data_type *ar = OASYS_AR_DATA(arch);
   oasys_module_info_type *p;
   /* take the next one from the arch state, or reset */
   if (prev == (bfd *)NULL) {
@@ -1164,53 +1343,70 @@ DEFUN(oasys_sizeof_headers,(abfd, exec),
 {
 return 0;
 }
-
+#define FOO PROTO
 #define oasys_core_file_failing_command (char *(*)())(bfd_nullvoidptr)
 #define oasys_core_file_failing_signal (int (*)())bfd_0
-#define oasys_core_file_matches_executable_p  0 /*(PROTO(boolean, (*),(bfd*, bfd*)))bfd_false*/
+#define oasys_core_file_matches_executable_p  0 
 #define oasys_slurp_armap bfd_true
 #define oasys_slurp_extended_name_table bfd_true
 #define oasys_truncate_arname (void (*)())bfd_nullvoidptr
-#define oasys_write_armap 0 /* (PROTO( boolean, (*),(bfd *, unsigned int, struct orl *, int, int))) bfd_nullvoidptr*/
+#define oasys_write_armap 0
 #define oasys_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
 #define        oasys_close_and_cleanup         bfd_generic_close_and_cleanup
-
-
+#define oasys_set_arch_mach bfd_default_set_arch_mach
+#define oasys_bfd_debug_info_start bfd_void
+#define oasys_bfd_debug_info_end bfd_void
+#define oasys_bfd_debug_info_accumulate  (FOO(void, (*), (bfd *, asection *)))bfd_void
+#define oasys_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
+#define oasys_bfd_relax_section bfd_generic_relax_section
+#define oasys_bfd_reloc_type_lookup \
+  ((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
+#define oasys_bfd_make_debug_symbol \
+  ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
+#define oasys_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
+#define oasys_bfd_link_add_symbols _bfd_generic_link_add_symbols
+#define oasys_bfd_final_link _bfd_generic_final_link
 
 /*SUPPRESS 460 */
 bfd_target oasys_vec =
 {
   "oasys",                     /* name */
-  bfd_target_oasys_flavour_enum,
+  bfd_target_oasys_flavour,
   true,                                /* target byte order */
   true,                                /* target headers byte order */
   (HAS_RELOC | EXEC_P |                /* object flags */
    HAS_LINENO | HAS_DEBUG |
-   HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
+   HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
   (SEC_CODE|SEC_DATA|SEC_ROM|SEC_HAS_CONTENTS
    |SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
+   0,                          /* leading underscore */
   ' ',                         /* ar_pad_char */
   16,                          /* ar_max_namelen */
-
-  _do_getblong, _do_putblong, _do_getbshort, _do_putbshort, /* data */
-  _do_getblong, _do_putblong, _do_getbshort, _do_putbshort, /* hdrs */
-
-  {_bfd_dummy_target,
-     oasys_object_p,           /* bfd_check_format */
-     oasys_archive_p,
- _bfd_dummy_target,
+  1,                           /* minimum alignment */
+  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
+    bfd_getb32, bfd_getb_signed_32, bfd_putb32,
+    bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
+  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
+    bfd_getb32, bfd_getb_signed_32, bfd_putb32,
+    bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
+
+    {_bfd_dummy_target,
+       oasys_object_p,         /* bfd_check_format */
+       oasys_archive_p,
+       _bfd_dummy_target,
      },
-  {                            /* bfd_set_format */
-    bfd_false,
-    oasys_mkobject, 
-    _bfd_generic_mkarchive,
-    bfd_false
+    {                          /* bfd_set_format */
+      bfd_false,
+      oasys_mkobject, 
+      _bfd_generic_mkarchive,
+      bfd_false
+      },
+    {                          /* bfd_write_contents */
+      bfd_false,
+      oasys_write_object_contents,
+      _bfd_write_archive_contents,
+      bfd_false,
     },
-  {                            /* bfd_write_contents */
-    bfd_false,
-    oasys_write_object_contents,
-    _bfd_write_archive_contents,
-    bfd_false,
-  },
-  JUMP_TABLE(oasys)
+  JUMP_TABLE(oasys),
+  (PTR) 0
 };
This page took 0.048634 seconds and 4 git commands to generate.