X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fversados.c;h=e281d71b18efd142c51e5436025416716914abb5;hb=d1778b88f8d8444f15ecf2dbbbf680c5659efb53;hp=72bf1417703745cc138536e7001e2054176fcac5;hpb=ae115e5114deb0326333c80f7af9e689b2e7d01f;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/versados.c b/bfd/versados.c index 72bf141770..e281d71b18 100644 --- a/bfd/versados.c +++ b/bfd/versados.c @@ -1,10 +1,9 @@ /* BFD back-end for VERSAdos-E objects. + Copyright 1995, 1996, 1998, 1999, 2000 Free Software Foundation, Inc. + Written by Steve Chamberlain of Cygnus Support . Versados is a Motorola trademark. - Copyright 1995 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support . - This file is part of BFD, the Binary File Descriptor library. This program is free software; you can redistribute it and/or modify @@ -37,7 +36,6 @@ o Object Text Recrod o End Record - */ #include "bfd.h" @@ -45,18 +43,15 @@ #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 */ @@ -146,11 +141,7 @@ union ext_any 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. */ @@ -162,10 +153,7 @@ versados_mkobject (abfd) { 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; @@ -175,13 +163,10 @@ versados_mkobject (abfd) 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; @@ -199,7 +184,6 @@ versados_new_symbol (abfd, snum, name, val, sec) return n; } - static int get_record (abfd, ptr) bfd *abfd; @@ -248,7 +232,6 @@ new_symbol_string (abfd, name) return n; } - static void process_esd (abfd, esd, pass) bfd *abfd; @@ -300,7 +283,6 @@ process_esd (abfd, esd, pass) } break; - case ESD_ABS: size = get_4 (&ptr); start = get_4 (&ptr); @@ -360,7 +342,6 @@ reloc_howto_type versados_howto_table[] = "-v32", true, 0xffffffff, 0xffffffff, false), }; - static int get_offset (len, ptr) int len; @@ -409,7 +390,6 @@ process_otr (abfd, otr, pass) int offsetlen = flag & 0x7; int j; - if (esdids == 0) { /* A zero esdid means the new pc is the offset given */ @@ -437,7 +417,7 @@ process_otr (abfd, otr, pass) 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 @@ -475,7 +455,6 @@ process_otr (abfd, otr, pass) if (!contents && need_contents) esdid->contents = (unsigned char *) bfd_alloc (abfd, esdid->section->_raw_size); - } static boolean @@ -487,10 +466,12 @@ versados_scan (abfd) 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) { @@ -554,6 +535,9 @@ versados_scan (abfd) 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 */ @@ -585,8 +569,6 @@ versados_scan (abfd) return 1; } - - /* Check whether an existing file is a versados file. */ static const bfd_target * @@ -596,20 +578,34 @@ versados_object_p (abfd) 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)) @@ -618,7 +614,6 @@ versados_object_p (abfd) return abfd->xvec; } - static boolean versados_pass_2 (abfd) bfd *abfd; @@ -633,7 +628,6 @@ versados_pass_2 (abfd) VDATA (abfd)->es_done = ES_BASE; - /* read records till we get to where we want to be */ while (1) @@ -672,23 +666,24 @@ versados_get_section_contents (abfd, section, location, offset, count) 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; } @@ -737,20 +732,18 @@ versados_get_symtab (abfd, alocation) 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; @@ -772,13 +765,12 @@ versados_print_symbol (ignore_abfd, afile, symbol, 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; @@ -833,7 +825,7 @@ versados_canonicalize_reloc (abfd, section, relptr, symbols) #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 @@ -847,6 +839,8 @@ versados_canonicalize_reloc (abfd, section, relptr, symbols) #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 @@ -856,8 +850,8 @@ const bfd_target versados_vec = { "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), @@ -866,7 +860,6 @@ const bfd_target versados_vec = 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 */ @@ -903,5 +896,7 @@ const bfd_target versados_vec = BFD_JUMP_TABLE_LINK (versados), BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), + NULL, + (PTR) 0 };