/* BFD back-end for VERSAdos-E objects.
+ Copyright 1995, 1996, 1998, 1999, 2000 Free Software Foundation, Inc.
+ Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
Versados is a Motorola trademark.
- Copyright 1995 Free Software Foundation, Inc.
- Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
-
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
o Object Text Recrod
o End Record
-
*/
#include "bfd.h"
#include "libbfd.h"
#include "libiberty.h"
-
static boolean versados_mkobject PARAMS ((bfd *));
static boolean versados_scan PARAMS ((bfd *));
static const bfd_target *versados_object_p PARAMS ((bfd *));
-
#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 */
struct ext_otr otr;
};
-/* Initialize by filling in the hex conversion array. */
-
-
-
-
+/* Initialize by filling in the hex conversion array. */
/* Set up the tdata information. */
{
tdata_type *tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type));
if (tdata == NULL)
- {
- bfd_set_error (bfd_error_no_memory);
- return false;
- }
+ return false;
abfd->tdata.versados_data = tdata;
tdata->symbols = NULL;
VDATA (abfd)->alert = 0x12345678;
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 (abfd, snum, name, val, sec)
bfd *abfd;
return n;
}
-
static int
get_record (abfd, ptr)
bfd *abfd;
return n;
}
-
static void
process_esd (abfd, esd, pass)
bfd *abfd;
}
break;
-
case ESD_ABS:
size = get_4 (&ptr);
start = get_4 (&ptr);
"-v32", true, 0xffffffff, 0xffffffff, false),
};
-
static int
get_offset (len, ptr)
int len;
int offsetlen = flag & 0x7;
int j;
-
if (esdids == 0)
{
/* A zero esdid means the new pc is the offset given */
int rn = EDATA (abfd, otr->esdid - 1).relocs++;
if (pass == 1)
{
- /* this is the first pass over the data,
+ /* this is the first pass over the data,
just remember that we need a reloc */
}
else
if (!contents && need_contents)
esdid->contents = (unsigned char *) bfd_alloc (abfd, esdid->section->_raw_size);
-
}
static boolean
int j;
int nsecs = 0;
+ 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)
{
VDATA (abfd)->strings = bfd_alloc (abfd, VDATA (abfd)->stringlen);
+ 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 */
return 1;
}
-
-
/* Check whether an existing file is a versados file. */
static const bfd_target *
struct ext_vheader ext;
unsigned char len;
- if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
+ if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
return NULL;
+ if (bfd_read (&len, 1, 1, abfd) != 1)
+ {
+ if (bfd_get_error () != bfd_error_system_call)
+ bfd_set_error (bfd_error_wrong_format);
+ return NULL;
+ }
- bfd_read (&len, 1, 1, abfd);
- if (bfd_read (&ext.type, 1, len, abfd) != len
- || ext.type != '1')
+ if (bfd_read (&ext.type, 1, 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.. */
+ /* OK, looks like a record, build the tdata and read in. */
if (!versados_mkobject (abfd)
|| !versados_scan (abfd))
return abfd->xvec;
}
-
static boolean
versados_pass_2 (abfd)
bfd *abfd;
VDATA (abfd)->es_done = ES_BASE;
-
/* read records till we get to where we want to be */
while (1)
return true;
}
+#define versados_get_section_contents_in_window \
+ _bfd_generic_get_section_contents_in_window
+
static boolean
versados_set_section_contents (abfd, section, location, offset, bytes_to_do)
- bfd *abfd;
- sec_ptr section;
- PTR location;
- file_ptr offset;
- bfd_size_type bytes_to_do;
+ bfd *abfd ATTRIBUTE_UNUSED;
+ sec_ptr section ATTRIBUTE_UNUSED;
+ PTR location ATTRIBUTE_UNUSED;
+ file_ptr offset ATTRIBUTE_UNUSED;
+ bfd_size_type bytes_to_do ATTRIBUTE_UNUSED;
{
return false;
}
-
-/*ARGSUSED */
static int
versados_sizeof_headers (abfd, exec)
- bfd *abfd;
- boolean exec;
+ bfd *abfd ATTRIBUTE_UNUSED;
+ boolean exec ATTRIBUTE_UNUSED;
{
return 0;
}
return symcount;
}
-/*ARGSUSED */
void
versados_get_symbol_info (ignore_abfd, symbol, ret)
- bfd *ignore_abfd;
+ bfd *ignore_abfd ATTRIBUTE_UNUSED;
asymbol *symbol;
symbol_info *ret;
{
bfd_symbol_info (symbol, ret);
}
-/*ARGSUSED */
void
versados_print_symbol (ignore_abfd, afile, symbol, how)
- bfd *ignore_abfd;
+ bfd *ignore_abfd ATTRIBUTE_UNUSED;
PTR afile;
asymbol *symbol;
bfd_print_symbol_type how;
long
versados_get_reloc_upper_bound (abfd, asect)
- bfd *abfd;
+ bfd *abfd ATTRIBUTE_UNUSED;
sec_ptr asect;
{
return (asect->reloc_count + 1) * sizeof (arelent *);
}
-
long
versados_canonicalize_reloc (abfd, section, relptr, symbols)
bfd *abfd;
#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_local_label bfd_generic_is_local_label
+#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_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
#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_merge_sections bfd_generic_merge_sections
#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_final_link _bfd_generic_final_link
{
"versados", /* name */
bfd_target_versados_flavour,
- true, /* target byte order */
- true, /* target headers byte order */
+ 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),
0, /* leading underscore */
' ', /* ar_pad_char */
16, /* ar_max_namelen */
- 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_JUMP_TABLE_LINK (versados),
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+ NULL,
+
(PTR) 0
};