/* BFD back-end for VERSAdos-E objects.
   Copyright (C) 1995-2018 Free Software Foundation, Inc.
   Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.

   Versados is a Motorola trademark.

   This file is part of BFD, the Binary File Descriptor library.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   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 this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

/*
   SUBSECTION
   VERSAdos-E relocatable object file format

   DESCRIPTION

   This module supports reading of VERSAdos relocatable
   object files.

   A VERSAdos file looks like contains

   o Identification Record
   o External Symbol Definition Record
   o Object Text Record
   o End Record.  */

#include "sysdep.h"
#include "bfd.h"
#include "libbfd.h"
#include "libiberty.h"


#define VHEADER '1'
#define VESTDEF '2'
#define VOTR '3'
#define VEND '4'

#define ES_BASE 17		/* First symbol has esdid 17.  */

/* Per file target dependent information.  */

/* One for each section.  */
struct esdid
{
  asection *section;		/* Ptr to bfd version.  */
  unsigned char *contents;	/* Used to build image.  */
  bfd_size_type content_size;	/* The size of the contents buffer.  */
  int pc;
  int relocs;			/* Reloc count, valid end of pass 1.  */
  int donerel;			/* Have relocs been translated.  */
};

typedef struct versados_data_struct
{
  int es_done;			/* Count of symbol index, starts at ES_BASE.  */
  asymbol *symbols;		/* Pointer to local symbols.  */
  char *strings;		/* Strings of all the above.  */
  int stringlen;		/* Len of string table (valid end of pass1).  */
  int nsecsyms;			/* Number of sections.  */

  int ndefs;			/* Number of exported symbols (they dont get esdids).  */
  int nrefs;			/* Number of imported symbols  (valid end of pass1).  */

  int ref_idx;			/* Current processed value of the above.  */
  int def_idx;

  int pass_2_done;

  struct esdid e[16];		/* Per section info.  */
  int alert;			/* To see if we're trampling.  */
  asymbol *rest[256 - 16];	/* Per symbol info.  */
}
tdata_type;

#define VDATA(abfd)       (abfd->tdata.versados_data)
#define EDATA(abfd, n)    (abfd->tdata.versados_data->e[(n) < 16 ? (n) : 0])
#define RDATA(abfd, n)    (abfd->tdata.versados_data->rest[(n) < 240 ? (n) : 0])

struct ext_otr
{
  unsigned char size;
  char type;
  unsigned char map[4];
  unsigned char esdid;
  unsigned char data[200];
};

struct ext_vheader
{
  unsigned char size;
  char type;			/* Record type.  */
  char name[10];		/* Module name.  */
  char rev;			/* Module rev number.  */
  char lang;
  char vol[4];
  char user[2];
  char cat[8];
  char fname[8];
  char ext[2];
  char time[3];
  char date[3];
  char rest[211];
};

struct ext_esd
{
  unsigned char size;
  char type;
  unsigned char esd_entries[1];
};

#define ESD_ABS		  0
#define ESD_COMMON	  1
#define ESD_STD_REL_SEC   2
#define ESD_SHRT_REL_SEC  3
#define ESD_XDEF_IN_SEC   4
#define ESD_XDEF_IN_ABS   5
#define ESD_XREF_SEC	  6
#define ESD_XREF_SYM      7

union ext_any
{
  unsigned char size;
  struct ext_vheader header;
  struct ext_esd esd;
  struct ext_otr otr;
};

/* Initialize by filling in the hex conversion array.  */

/* Set up the tdata information.  */

static bfd_boolean
versados_mkobject (bfd *abfd)
{
  if (abfd->tdata.versados_data == NULL)
    {
      bfd_size_type amt = sizeof (tdata_type);
      tdata_type *tdata = bfd_zalloc (abfd, amt);

      if (tdata == NULL)
	return FALSE;
      abfd->tdata.versados_data = tdata;
      tdata->symbols = NULL;
      VDATA (abfd)->alert = 0x12345678;
    }

  bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0);
  return TRUE;
}

/* Report a problem in an S record file.  FIXME: This probably should
   not call fprintf, but we really do need some mechanism for printing
   error messages.  */

static asymbol *
versados_new_symbol (bfd *abfd,
		     int snum,
		     const char *name,
		     bfd_vma val,
		     asection *sec)
{
  asymbol *n = VDATA (abfd)->symbols + snum;
  n->name = name;
  n->value = val;
  n->section = sec;
  n->the_bfd = abfd;
  n->flags = 0;
  return n;
}

static bfd_boolean
get_record (bfd *abfd, union ext_any *ptr)
{
  if (bfd_bread (&ptr->size, (bfd_size_type) 1, abfd) != 1
      || (bfd_bread ((char *) ptr + 1, (bfd_size_type) ptr->size, abfd)
	  != ptr->size))
    return FALSE;

  {
    bfd_size_type amt = ptr->size + 1;

    if (amt < sizeof (* ptr))
      memset ((char *) ptr + amt, 0, sizeof (* ptr) - amt);
  }

  return TRUE;
}

static int
get_4 (unsigned char **pp)
{
  unsigned char *p = *pp;

  *pp += 4;
  return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | (p[3] << 0);
}

static void
get_10 (unsigned char **pp, char *name)
{
  char *p = (char *) *pp;
  int len = 10;

  *pp += len;
  while (*p != ' ' && len)
    {
      *name++ = *p++;
      len--;
    }
  *name = 0;
}

static char *
new_symbol_string (bfd *abfd, const char *name)
{
  char *n = VDATA (abfd)->strings;

  strcpy (VDATA (abfd)->strings, name);
  VDATA (abfd)->strings += strlen (VDATA (abfd)->strings) + 1;
  return n;
}

static void
process_esd (bfd *abfd, struct ext_esd *esd, int pass)
{
  /* Read through the ext def for the est entries.  */
  int togo = esd->size - 2;
  bfd_vma size;
  bfd_vma start;
  asection *sec;
  char name[11];
  unsigned char *ptr = esd->esd_entries;
  unsigned char *end = ptr + togo;

  while (ptr < end)
    {
      int scn = *ptr & 0xf;
      int typ = (*ptr >> 4) & 0xf;

      /* Declare this section.  */
      sprintf (name, "%d", scn);
      sec = bfd_make_section_old_way (abfd, strdup (name));
      sec->target_index = scn;
      EDATA (abfd, scn).section = sec;
      ptr++;

      switch (typ)
	{
	default:
	  abort ();
	case ESD_XREF_SEC:
	case ESD_XREF_SYM:
	  {
	    int snum = VDATA (abfd)->ref_idx++;
	    get_10 (&ptr, name);
	    if (pass == 1)
	      VDATA (abfd)->stringlen += strlen (name) + 1;
	    else
	      {
		int esidx;
		asymbol *s;
		char *n = new_symbol_string (abfd, name);

		s = versados_new_symbol (abfd, snum, n, (bfd_vma) 0,
					 bfd_und_section_ptr);
		esidx = VDATA (abfd)->es_done++;
		RDATA (abfd, esidx - ES_BASE) = s;
	      }
	  }
	  break;

	case ESD_ABS:
	  size = get_4 (&ptr);
	  (void) size;
	  start = get_4 (&ptr);
	  (void) start;
	  break;
	case ESD_STD_REL_SEC:
	case ESD_SHRT_REL_SEC:
	  sec->size = get_4 (&ptr);
	  sec->flags |= SEC_ALLOC;
	  break;
	case ESD_XDEF_IN_ABS:
	  sec = bfd_abs_section_ptr;
	  /* Fall through.  */
	case ESD_XDEF_IN_SEC:
	  {
	    int snum = VDATA (abfd)->def_idx++;
	    bfd_vma val;

	    get_10 (&ptr, name);
	    val = get_4 (&ptr);
	    if (pass == 1)
	      /* Just remember the symbol.  */
	      VDATA (abfd)->stringlen += strlen (name) + 1;
	    else
	      {
		asymbol *s;
		char *n = new_symbol_string (abfd, name);

		s = versados_new_symbol (abfd, snum + VDATA (abfd)->nrefs, n,
					 val, sec);
		s->flags |= BSF_GLOBAL;
	      }
	  }
	  break;
	}
    }
}

#define R_RELWORD     1
#define R_RELLONG     2
#define R_RELWORD_NEG 3
#define R_RELLONG_NEG 4

reloc_howto_type versados_howto_table[] =
{
  HOWTO (R_RELWORD, 0, 1, 16, FALSE,
	 0, complain_overflow_dont, 0,
	 "+v16", TRUE, 0x0000ffff, 0x0000ffff, FALSE),
  HOWTO (R_RELLONG, 0, 2, 32, FALSE,
	 0, complain_overflow_dont, 0,
	 "+v32", TRUE, 0xffffffff, 0xffffffff, FALSE),

  HOWTO (R_RELWORD_NEG, 0, -1, 16, FALSE,
	 0, complain_overflow_dont, 0,
	 "-v16", TRUE, 0x0000ffff, 0x0000ffff, FALSE),
  HOWTO (R_RELLONG_NEG, 0, -2, 32, FALSE,
	 0, complain_overflow_dont, 0,
	 "-v32", TRUE, 0xffffffff, 0xffffffff, FALSE),
};

static int
get_offset (unsigned int len, unsigned char *ptr)
{
  int val = 0;

  if (len)
    {
      unsigned int i;

      val = *ptr++;
      if (val & 0x80)
	val |= ~0xff;
      for (i = 1; i < len; i++)
	val = (val << 8) | *ptr++;
    }

  return val;
}

static void
process_otr (bfd *abfd, struct ext_otr *otr, int pass)
{
  unsigned long shift;
  unsigned char *srcp = otr->data;
  unsigned char *endp = (unsigned char *) otr + otr->size;
  unsigned int bits = (otr->map[0] << 24)
  | (otr->map[1] << 16)
  | (otr->map[2] << 8)
  | (otr->map[3] << 0);

  struct esdid *esdid;
  unsigned char *contents;
  bfd_boolean need_contents = FALSE;
  unsigned int dst_idx;

  /* PR 17512: file: ac7da425.  */
  if (otr->esdid == 0)
    return;

  esdid = &EDATA (abfd, otr->esdid - 1);
  contents = esdid->contents;
  dst_idx = esdid->pc;

  for (shift = ((unsigned long) 1 << 31); shift && srcp < endp; shift >>= 1)
    {
      if (bits & shift)
	{
	  int flag = *srcp++;
	  int esdids = (flag >> 5) & 0x7;
	  int sizeinwords = ((flag >> 3) & 1) ? 2 : 1;
	  unsigned int offsetlen = flag & 0x7;
	  int j;

	  /* PR 21591: Check for invalid lengths.  */
	  if (srcp + esdids + offsetlen >= endp)
	    return;

	  if (esdids == 0)
	    {
	      /* A zero esdid means the new pc is the offset given.  */
	      dst_idx += get_offset (offsetlen, srcp);
	      srcp += offsetlen;
	    }
	  else
	    {
	      int val = get_offset (offsetlen, srcp + esdids);

	      if (pass == 1)
		need_contents = TRUE;
	      else if (contents && dst_idx < esdid->content_size - sizeinwords * 2)
		for (j = 0; j < sizeinwords * 2; j++)
		  {
		    contents[dst_idx + (sizeinwords * 2) - j - 1] = val;
		    val >>= 8;
		  }

	      for (j = 0; j < esdids; j++)
		{
		  int id = *srcp++;

		  if (id)
		    {
		      int rn = EDATA (abfd, otr->esdid - 1).relocs++;

		      if (pass == 1)
			{
			  /* This is the first pass over the data,
			     just remember that we need a reloc.  */
			}
		      else
			{
			  arelent *n;

			  /* PR 17512: file: 54f733e0.  */
			  if (EDATA (abfd, otr->esdid - 1).section == NULL)
			    continue;
			  n = EDATA (abfd, otr->esdid - 1).section->relocation + rn;
			  n->address = dst_idx;
			  n->sym_ptr_ptr = (asymbol **) (size_t) id;
			  n->addend = 0;
			  n->howto = versados_howto_table + ((j & 1) * 2) + (sizeinwords - 1);
			}
		    }
		}
	      srcp += offsetlen;
	      dst_idx += sizeinwords * 2;
	    }
	}
      else
	{
	  need_contents = TRUE;

	  if (esdid->section && contents && dst_idx < esdid->content_size - 1)
	    if (pass == 2)
	      {
		/* Absolute code, comes in 16 bit lumps.  */
		contents[dst_idx] = srcp[0];
		contents[dst_idx + 1] = srcp[1];
	      }

	  dst_idx += 2;
	  srcp += 2;
	}
    }

  EDATA (abfd, otr->esdid - 1).pc = dst_idx;

  if (!contents && need_contents)
    {
      if (esdid->section)
	{
	  bfd_size_type size;

	  size = esdid->section->size;
	  esdid->contents = bfd_alloc (abfd, size);
	  esdid->content_size = size;
	}
      else
	esdid->contents = NULL;
    }
}

static bfd_boolean
versados_scan (bfd *abfd)
{
  bfd_boolean loop = TRUE;
  int i;
  int j;
  int nsecs = 0;
  bfd_size_type amt;

  VDATA (abfd)->stringlen = 0;
  VDATA (abfd)->nrefs = 0;
  VDATA (abfd)->ndefs = 0;
  VDATA (abfd)->ref_idx = 0;
  VDATA (abfd)->def_idx = 0;
  VDATA (abfd)->pass_2_done = 0;

  while (loop)
    {
      union ext_any any;

      if (!get_record (abfd, &any))
	return FALSE;
      switch (any.header.type)
	{
	case VHEADER:
	  break;
	case VEND:
	  loop = FALSE;
	  break;
	case VESTDEF:
	  process_esd (abfd, &any.esd, 1);
	  break;
	case VOTR:
	  process_otr (abfd, &any.otr, 1);
	  break;
	}
    }

  /* Now allocate space for the relocs and sections.  */
  VDATA (abfd)->nrefs = VDATA (abfd)->ref_idx;
  VDATA (abfd)->ndefs = VDATA (abfd)->def_idx;
  VDATA (abfd)->ref_idx = 0;
  VDATA (abfd)->def_idx = 0;

  abfd->symcount = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs;

  for (i = 0; i < 16; i++)
    {
      struct esdid *esdid = &EDATA (abfd, i);

      if (esdid->section)
	{
	  amt = (bfd_size_type) esdid->relocs * sizeof (arelent);
	  esdid->section->relocation = bfd_alloc (abfd, amt);
	  esdid->pc = 0;

	  if (esdid->contents)
	    esdid->section->flags |= SEC_HAS_CONTENTS | SEC_LOAD;

	  esdid->section->reloc_count = esdid->relocs;
	  if (esdid->relocs)
	    esdid->section->flags |= SEC_RELOC;

	  esdid->relocs = 0;

	  /* Add an entry into the symbol table for it.  */
	  nsecs++;
	  VDATA (abfd)->stringlen += strlen (esdid->section->name) + 1;
	}
    }

  abfd->symcount += nsecs;

  amt = abfd->symcount;
  amt *= sizeof (asymbol);
  VDATA (abfd)->symbols = bfd_alloc (abfd, amt);

  amt = VDATA (abfd)->stringlen;
  VDATA (abfd)->strings = bfd_alloc (abfd, amt);

  if ((VDATA (abfd)->symbols == NULL && abfd->symcount > 0)
      || (VDATA (abfd)->strings == NULL && VDATA (abfd)->stringlen > 0))
    return FALSE;

  /* Actually fill in the section symbols,
     we stick them at the end of the table.  */
  for (j = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs, i = 0; i < 16; i++)
    {
      struct esdid *esdid = &EDATA (abfd, i);
      asection *sec = esdid->section;

      if (sec)
	{
	  asymbol *s = VDATA (abfd)->symbols + j;
	  s->name = new_symbol_string (abfd, sec->name);
	  s->section = sec;
	  s->flags = BSF_LOCAL;
	  s->value = 0;
	  s->the_bfd = abfd;
	  j++;
	}
    }

  if (abfd->symcount)
    abfd->flags |= HAS_SYMS;

  /* Set this to nsecs - since we've already planted the section
     symbols.  */
  VDATA (abfd)->nsecsyms = nsecs;

  VDATA (abfd)->ref_idx = 0;

  return TRUE;
}

/* Check whether an existing file is a versados  file.  */

static const bfd_target *
versados_object_p (bfd *abfd)
{
  struct ext_vheader ext;
  unsigned char len;
  tdata_type *tdata_save;

  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
    return NULL;

  if (bfd_bread (&len, (bfd_size_type) 1, abfd) != 1)
    {
      if (bfd_get_error () != bfd_error_system_call)
	bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  /* PR 17512: file: 726-2128-0.004.  */
  if (len < 13)
    {
      bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  if (bfd_bread (&ext.type, (bfd_size_type) len, abfd) != len)
    {
      if (bfd_get_error () != bfd_error_system_call)
	bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  /* We guess that the language field will never be larger than 10.
     In sample files, it is always either 0 or 1.  Checking for this
     prevents confusion with Intel Hex files.  */
  if (ext.type != VHEADER
      || ext.lang > 10)
    {
      bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  /* OK, looks like a record, build the tdata and read in.  */
  tdata_save = abfd->tdata.versados_data;
  if (!versados_mkobject (abfd) || !versados_scan (abfd))
    {
      abfd->tdata.versados_data = tdata_save;
      return NULL;
    }

  return abfd->xvec;
}

static bfd_boolean
versados_pass_2 (bfd *abfd)
{
  union ext_any any;

  if (VDATA (abfd)->pass_2_done)
    return 1;

  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
    return 0;

  VDATA (abfd)->es_done = ES_BASE;

  /* Read records till we get to where we want to be.  */
  while (1)
    {
      get_record (abfd, &any);
      switch (any.header.type)
	{
	case VEND:
	  VDATA (abfd)->pass_2_done = 1;
	  return 1;
	case VESTDEF:
	  process_esd (abfd, &any.esd, 2);
	  break;
	case VOTR:
	  process_otr (abfd, &any.otr, 2);
	  break;
	}
    }
}

static bfd_boolean
versados_get_section_contents (bfd *abfd,
			       asection *section,
			       void * location,
			       file_ptr offset,
			       bfd_size_type count)
{
  struct esdid *esdid;

  if (!versados_pass_2 (abfd))
    return FALSE;

  esdid = &EDATA (abfd, section->target_index);

  if (esdid->contents == NULL
      || offset < 0
      || (bfd_size_type) offset > esdid->content_size
      || offset + count > esdid->content_size)
    return FALSE;

  memcpy (location, esdid->contents + offset, (size_t) count);

  return TRUE;
}

#define versados_get_section_contents_in_window \
  _bfd_generic_get_section_contents_in_window

static bfd_boolean
versados_set_section_contents (bfd *abfd ATTRIBUTE_UNUSED,
			       sec_ptr section ATTRIBUTE_UNUSED,
			       const void * location ATTRIBUTE_UNUSED,
			       file_ptr offset ATTRIBUTE_UNUSED,
			       bfd_size_type bytes_to_do ATTRIBUTE_UNUSED)
{
  return FALSE;
}

static int
versados_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
			 struct bfd_link_info *info ATTRIBUTE_UNUSED)
{
  return 0;
}

/* Return the amount of memory needed to read the symbol table.  */

static long
versados_get_symtab_upper_bound (bfd *abfd)
{
  return (bfd_get_symcount (abfd) + 1) * sizeof (asymbol *);
}

/* Return the symbol table.  */

static long
versados_canonicalize_symtab (bfd *abfd, asymbol **alocation)
{
  unsigned int symcount = bfd_get_symcount (abfd);
  unsigned int i;
  asymbol *s;

  versados_pass_2 (abfd);

  for (i = 0, s = VDATA (abfd)->symbols;
       i < symcount;
       s++, i++)
    *alocation++ = s;

  *alocation = NULL;

  return symcount;
}

static void
versados_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
			  asymbol *symbol,
			  symbol_info *ret)
{
  bfd_symbol_info (symbol, ret);
}

static void
versados_print_symbol (bfd *abfd,
		       void * afile,
		       asymbol *symbol,
		       bfd_print_symbol_type how)
{
  FILE *file = (FILE *) afile;

  switch (how)
    {
    case bfd_print_symbol_name:
      fprintf (file, "%s", symbol->name);
      break;
    default:
      bfd_print_symbol_vandf (abfd, (void *) file, symbol);
      fprintf (file, " %-5s %s",
	       symbol->section->name,
	       symbol->name);
    }
}

static long
versados_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
				sec_ptr asect)
{
  return (asect->reloc_count + 1) * sizeof (arelent *);
}

static long
versados_canonicalize_reloc (bfd *abfd,
			     sec_ptr section,
			     arelent **relptr,
			     asymbol **symbols)
{
  unsigned int count;
  arelent *src;

  versados_pass_2 (abfd);
  src = section->relocation;

  if (!EDATA (abfd, section->target_index).donerel)
    {
      EDATA (abfd, section->target_index).donerel = 1;
      /* Translate from indexes to symptr ptrs.  */
      for (count = 0; count < section->reloc_count; count++)
	{
	  int esdid = (int) (size_t) src[count].sym_ptr_ptr;

	  if (esdid == 0)
	    src[count].sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
	  else if (esdid < ES_BASE)
	    {
	      /* Section relative thing.  */
	      struct esdid *e = &EDATA (abfd, esdid - 1);

	      /* PR 17512: file:cd92277c.  */
	      if (e->section)
		src[count].sym_ptr_ptr = e->section->symbol_ptr_ptr;
	      else
		src[count].sym_ptr_ptr = bfd_und_section_ptr->symbol_ptr_ptr;
	    }
	  /* PR 17512: file:3757-2936-0.004.  */
	  else if ((unsigned) (esdid - ES_BASE) >= bfd_get_symcount (abfd))
	    src[count].sym_ptr_ptr = bfd_und_section_ptr->symbol_ptr_ptr;
	  else
	    src[count].sym_ptr_ptr = symbols + esdid - ES_BASE;
	}
    }

  for (count = 0; count < section->reloc_count; count++)
    *relptr++ = src++;

  *relptr = 0;
  return section->reloc_count;
}

#define	versados_close_and_cleanup		      _bfd_generic_close_and_cleanup
#define versados_bfd_free_cached_info		      _bfd_generic_bfd_free_cached_info
#define versados_new_section_hook		      _bfd_generic_new_section_hook
#define versados_bfd_is_target_special_symbol	((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
#define versados_bfd_is_local_label_name	      bfd_generic_is_local_label_name
#define versados_get_lineno			      _bfd_nosymbols_get_lineno
#define versados_find_nearest_line		      _bfd_nosymbols_find_nearest_line
#define versados_find_line			      _bfd_nosymbols_find_line
#define versados_find_inliner_info		      _bfd_nosymbols_find_inliner_info
#define versados_get_symbol_version_string	      _bfd_nosymbols_get_symbol_version_string
#define versados_make_empty_symbol		      _bfd_generic_make_empty_symbol
#define versados_bfd_make_debug_symbol		      _bfd_nosymbols_bfd_make_debug_symbol
#define versados_read_minisymbols		      _bfd_generic_read_minisymbols
#define versados_minisymbol_to_symbol		      _bfd_generic_minisymbol_to_symbol
#define versados_bfd_reloc_type_lookup		      _bfd_norelocs_bfd_reloc_type_lookup
#define versados_bfd_reloc_name_lookup		_bfd_norelocs_bfd_reloc_name_lookup
#define versados_set_arch_mach			      bfd_default_set_arch_mach
#define versados_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
#define versados_bfd_relax_section		      bfd_generic_relax_section
#define versados_bfd_gc_sections		      bfd_generic_gc_sections
#define versados_bfd_lookup_section_flags	      bfd_generic_lookup_section_flags
#define versados_bfd_merge_sections		      bfd_generic_merge_sections
#define versados_bfd_is_group_section		      bfd_generic_is_group_section
#define versados_bfd_discard_group		      bfd_generic_discard_group
#define versados_section_already_linked		      _bfd_generic_section_already_linked
#define versados_bfd_define_common_symbol	      bfd_generic_define_common_symbol
#define versados_bfd_define_start_stop		      bfd_generic_define_start_stop
#define versados_bfd_link_hash_table_create	      _bfd_generic_link_hash_table_create
#define versados_bfd_link_add_symbols		      _bfd_generic_link_add_symbols
#define versados_bfd_link_just_syms		      _bfd_generic_link_just_syms
#define versados_bfd_copy_link_hash_symbol_type \
  _bfd_generic_copy_link_hash_symbol_type
#define versados_bfd_final_link			      _bfd_generic_final_link
#define versados_bfd_link_split_section		      _bfd_generic_link_split_section
#define versados_bfd_link_check_relocs		      _bfd_generic_link_check_relocs
#define versados_set_reloc			      _bfd_generic_set_reloc

const bfd_target m68k_versados_vec =
{
  "versados",			/* Name.  */
  bfd_target_versados_flavour,
  BFD_ENDIAN_BIG,		/* Target byte order.  */
  BFD_ENDIAN_BIG,		/* Target headers byte order.  */
  (HAS_RELOC | EXEC_P |		/* Object flags.  */
   HAS_LINENO | HAS_DEBUG |
   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.  */
  0,				/* match priority.  */
  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,	/* Headers.  */

  {
    _bfd_dummy_target,
    versados_object_p,		/* bfd_check_format.  */
    _bfd_dummy_target,
    _bfd_dummy_target,
  },
  {
    bfd_false,
    versados_mkobject,
    _bfd_generic_mkarchive,
    bfd_false,
  },
  {				/* bfd_write_contents.  */
    bfd_false,
    bfd_false,
    _bfd_write_archive_contents,
    bfd_false,
  },

  BFD_JUMP_TABLE_GENERIC (versados),
  BFD_JUMP_TABLE_COPY (_bfd_generic),
  BFD_JUMP_TABLE_CORE (_bfd_nocore),
  BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
  BFD_JUMP_TABLE_SYMBOLS (versados),
  BFD_JUMP_TABLE_RELOCS (versados),
  BFD_JUMP_TABLE_WRITE (versados),
  BFD_JUMP_TABLE_LINK (versados),
  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),

  NULL,

  NULL
};
