Add a flag to asection, linker_has_input, and use it to reliably
[deliverable/binutils-gdb.git] / bfd / versados.c
index 72bf1417703745cc138536e7001e2054176fcac5..e281d71b18efd142c51e5436025416716914abb5 100644 (file)
@@ -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 <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
@@ -37,7 +36,6 @@
    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 */
@@ -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
 };
This page took 0.027834 seconds and 4 git commands to generate.