* elf.c (prep_headers): Get the machine code from the elf
[deliverable/binutils-gdb.git] / bfd / tekhex.c
index 6a5b913282ffe3dbe10c8aa81848400b7715d258..943992bf766673ce5ea129ec51bb2dc12f665b38 100644 (file)
@@ -1,6 +1,6 @@
 /* BFD backend for Extended Tektronix Hex Format  objects.
-   Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
-
+   Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000
+   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.
@@ -24,11 +24,11 @@ SUBSECTION
        Tektronix Hex Format handling
 
 DESCRIPTION
-       
+
        Tek Hex records can hold symbols and data, but not
        relocations. Their main application is communication with
        devices like PROM programmers and ICE equipment.
-       
+
        It seems that the sections are descibed as being really big,
         the example I have says that the text section is 0..ffffffff.
        BFD would barf with this, many apps would try to alloc 4GB to
@@ -49,11 +49,10 @@ DESCRIPTION
        Any number of sections may be created for output, we save them
        up and output them when it's time to close the bfd.
 
-
        A TekHex record looks like:
 EXAMPLE
        %<block length><type><checksum><stuff><cr>
-       
+
 DESCRIPTION
        Where
        o length
@@ -63,7 +62,6 @@ DESCRIPTION
        3) symbol record
        6) data record
        8) termination record
-       
 
 The data can come out of order, and may be discontigous. This is a
 serial protocol, so big files are unlikely, so we keep a list of 8k chunks
@@ -100,6 +98,35 @@ static char sum_block[256];
 (d)[0] = digs[((x)>>4)&0xf];
 #define        ISHEX(x)  hex_p(x)
 
+static void tekhex_init PARAMS ((void));
+static bfd_vma getvalue PARAMS ((char **));
+static void tekhex_print_symbol
+ PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type));
+static void tekhex_get_symbol_info PARAMS ((bfd *, asymbol *, symbol_info *));
+static asymbol *tekhex_make_empty_symbol PARAMS ((bfd *));
+static int tekhex_sizeof_headers PARAMS ((bfd *, boolean));
+static boolean tekhex_write_object_contents PARAMS ((bfd *));
+static void out PARAMS ((bfd *, int, char *, char *));
+static void writesym PARAMS ((char **, CONST char *));
+static void writevalue PARAMS ((char **, bfd_vma));
+static boolean tekhex_set_section_contents
+ PARAMS ((bfd*, sec_ptr, PTR, file_ptr, bfd_size_type));
+static boolean tekhex_set_arch_mach
+ PARAMS ((bfd *, enum bfd_architecture, unsigned long));
+static boolean tekhex_get_section_contents
+ PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
+static void move_section_contents
+ PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type, boolean));
+static const bfd_target *tekhex_object_p PARAMS ((bfd *));
+static boolean tekhex_mkobject PARAMS ((bfd *));
+static long tekhex_get_symtab_upper_bound PARAMS ((bfd *));
+static long tekhex_get_symtab PARAMS ((bfd *, asymbol **));
+static void pass_over PARAMS ((bfd *, void (*) (bfd*, int, char *)));
+static void first_phase PARAMS ((bfd *, int, char *));
+static void insert_byte PARAMS ((bfd *, int, bfd_vma));
+static struct data_struct *find_chunk PARAMS ((bfd *, bfd_vma));
+static unsigned int getsym PARAMS ((char *, char **));
+
 /*
 Here's an example
 %3A6C6480004E56FFFC4E717063B0AEFFFC6D0652AEFFFC60F24E5E4E75
@@ -187,7 +214,6 @@ fcffffff  g       T_SEGMENT i$1
 00000000  g       T_SEGMENT $
 00000010  g       T_SEGMENT $
 
-
 RELOCATION RECORDS FOR [D00000000]: (none)
 
 RELOCATION RECORDS FOR [D00008000]: (none)
@@ -314,7 +340,7 @@ getsym (dstp, srcp)
   return len;
 }
 
-struct data_struct *
+static struct data_struct *
 find_chunk (abfd, vma)
      bfd *abfd;
      bfd_vma vma;
@@ -364,7 +390,7 @@ insert_byte (abfd, value, addr)
 static void
 first_phase (abfd, type, src)
      bfd *abfd;
-     char type;
+     int type;
      char *src;
 {
   asection *section = bfd_abs_section_ptr;
@@ -396,7 +422,7 @@ first_phase (abfd, type, src)
          char *n = bfd_alloc (abfd, len + 1);
 
          if (!n)
-           abort();            /* FIXME */
+           abort ();           /* FIXME */
          memcpy (n, sym, len + 1);
          section = bfd_make_section (abfd, n);
        }
@@ -425,7 +451,7 @@ first_phase (abfd, type, src)
                char type = (*src);
 
                if (!new)
-                 abort();      /* FIXME */
+                 abort ();     /* FIXME */
                new->symbol.the_bfd = abfd;
                src++;
                abfd->symcount++;
@@ -435,7 +461,7 @@ first_phase (abfd, type, src)
                len = getsym (sym, &src);
                new->symbol.name = bfd_alloc (abfd, len + 1);
                if (!new->symbol.name)
-                 abort();      /* FIXME */
+                 abort ();     /* FIXME */
                memcpy ((char *) (new->symbol.name), sym, len + 1);
                new->symbol.section = section;
                if (type <= '4')
@@ -453,9 +479,9 @@ first_phase (abfd, type, src)
    record.  */
 
 static void
- pass_over (abfd, func)
+pass_over (abfd, func)
      bfd *abfd;
-     void (*func) ();
+     void (*func) PARAMS ((bfd *, int, char *));
 {
   unsigned int chars_on_line;
   boolean eof = false;
@@ -499,11 +525,10 @@ static void
 
 }
 
-long
+static long
 tekhex_get_symtab (abfd, table)
      bfd *abfd;
      asymbol **table;
-
 {
   tekhex_symbol_type *p = abfd->tdata.tekhex_data->symbols;
   unsigned int c = bfd_get_symcount (abfd);
@@ -518,7 +543,7 @@ tekhex_get_symtab (abfd, table)
   return bfd_get_symcount (abfd);
 }
 
-long
+static long
 tekhex_get_symtab_upper_bound (abfd)
      bfd *abfd;
 {
@@ -572,7 +597,7 @@ move_section_contents (abfd, section, locationp, offset, count, get)
      bfd *abfd;
      asection *section;
      PTR locationp;
-     file_ptr offset;
+     file_ptr offset ATTRIBUTE_UNUSED;
      bfd_size_type count;
      boolean get;
 {
@@ -615,6 +640,7 @@ move_section_contents (abfd, section, locationp, offset, count, get)
     }
 
 }
+
 static boolean
 tekhex_get_section_contents (abfd, section, locationp, offset, count)
      bfd *abfd;
@@ -632,7 +658,7 @@ tekhex_get_section_contents (abfd, section, locationp, offset, count)
     return false;
 }
 
-boolean
+static boolean
 tekhex_set_arch_mach (abfd, arch, machine)
      bfd *abfd;
      enum bfd_architecture arch;
@@ -749,7 +775,7 @@ writesym (dst, sym)
 static void
 out (abfd, type, start, end)
      bfd *abfd;
-     char type;
+     int type;
      char *start;
      char *end;
 {
@@ -789,6 +815,8 @@ tekhex_write_object_contents (abfd)
   asection *s;
   struct data_struct *d;
 
+  tekhex_init ();
+
   bytes_written = 0;
 
   /* And the raw data */
@@ -840,50 +868,53 @@ tekhex_write_object_contents (abfd)
     }
 
   /* And the symbols */
-  for (p = abfd->outsymbols; *p; p++)
+  if (abfd->outsymbols)
     {
-      int section_code = bfd_decode_symclass (*p);
+      for (p = abfd->outsymbols; *p; p++)
+       {
+         int section_code = bfd_decode_symclass (*p);
 
-      if (section_code != '?')
-       {                       /* do not include debug symbols */
-         asymbol *s = *p;
-         char *dst = buffer;
+         if (section_code != '?')
+           {                   /* do not include debug symbols */
+             asymbol *s = *p;
+             char *dst = buffer;
 
-         writesym (&dst, s->section->name);
+             writesym (&dst, s->section->name);
 
-         switch (section_code)
-           {
-           case 'A':
-             *dst++ = '2';
-             break;
-           case 'a':
-             *dst++ = '6';
-             break;
-           case 'D':
-           case 'B':
-           case 'O':
-             *dst++ = '4';
-             break;
-           case 'd':
-           case 'b':
-           case 'o':
-             *dst++ = '8';
-             break;
-           case 'T':
-             *dst++ = '3';
-             break;
-           case 't':
-             *dst++ = '7';
-             break;
-           case 'C':
-           case 'U':
-             bfd_set_error (bfd_error_wrong_format);
-             return false;
-           }
+             switch (section_code)
+               {
+               case 'A':
+                 *dst++ = '2';
+                 break;
+               case 'a':
+                 *dst++ = '6';
+                 break;
+               case 'D':
+               case 'B':
+               case 'O':
+                 *dst++ = '4';
+                 break;
+               case 'd':
+               case 'b':
+               case 'o':
+                 *dst++ = '8';
+                 break;
+               case 'T':
+                 *dst++ = '3';
+                 break;
+               case 't':
+                 *dst++ = '7';
+                 break;
+               case 'C':
+               case 'U':
+                 bfd_set_error (bfd_error_wrong_format);
+                 return false;
+               }
 
-         writesym (&dst, s->name);
-         writevalue (&dst, s->value + s->section->vma);
-         out (abfd, '3', buffer, dst);
+             writesym (&dst, s->name);
+             writevalue (&dst, s->value + s->section->vma);
+             out (abfd, '3', buffer, dst);
+           }
        }
     }
 
@@ -894,9 +925,9 @@ tekhex_write_object_contents (abfd)
 }
 
 static int
-  tekhex_sizeof_headers (abfd, exec)
-     bfd *abfd;
-     boolean exec;
+tekhex_sizeof_headers (abfd, exec)
+     bfd *abfd ATTRIBUTE_UNUSED;
+     boolean exec ATTRIBUTE_UNUSED;
 
 {
   return 0;
@@ -918,7 +949,7 @@ tekhex_make_empty_symbol (abfd)
 
 static void
 tekhex_get_symbol_info (ignore_abfd, symbol, ret)
-     bfd *ignore_abfd;
+     bfd *ignore_abfd ATTRIBUTE_UNUSED;
      asymbol *symbol;
      symbol_info *ret;
 {
@@ -926,8 +957,8 @@ tekhex_get_symbol_info (ignore_abfd, symbol, ret)
 }
 
 static void
-tekhex_print_symbol (ignore_abfd, filep, symbol, how)
-     bfd *ignore_abfd;
+tekhex_print_symbol (abfd, filep, symbol, how)
+     bfd *abfd;
      PTR filep;
      asymbol *symbol;
      bfd_print_symbol_type how;
@@ -946,7 +977,7 @@ tekhex_print_symbol (ignore_abfd, filep, symbol, how)
       {
        CONST char *section_name = symbol->section->name;
 
-       bfd_print_symbol_vandf ((PTR) file, symbol);
+       bfd_print_symbol_vandf (abfd, (PTR) file, symbol);
 
        fprintf (file, " %-5s %s",
                 section_name,
@@ -959,7 +990,7 @@ tekhex_print_symbol (ignore_abfd, filep, symbol, how)
 #define tekhex_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
 #define tekhex_new_section_hook _bfd_generic_new_section_hook
 
-#define tekhex_bfd_is_local_label bfd_generic_is_local_label
+#define tekhex_bfd_is_local_label_name bfd_generic_is_local_label_name
 #define tekhex_get_lineno _bfd_nosymbols_get_lineno
 #define tekhex_find_nearest_line _bfd_nosymbols_find_nearest_line
 #define tekhex_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
@@ -969,6 +1000,8 @@ tekhex_print_symbol (ignore_abfd, filep, symbol, how)
 #define tekhex_bfd_get_relocated_section_contents \
   bfd_generic_get_relocated_section_contents
 #define tekhex_bfd_relax_section bfd_generic_relax_section
+#define tekhex_bfd_gc_sections bfd_generic_gc_sections
+#define tekhex_bfd_merge_sections bfd_generic_merge_sections
 #define tekhex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
 #define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols
 #define tekhex_bfd_final_link _bfd_generic_final_link
@@ -981,8 +1014,8 @@ const bfd_target tekhex_vec =
 {
   "tekhex",                    /* name */
   bfd_target_tekhex_flavour,
-  true,                                /* target byte order */
-  true,                                /* target headers byte order */
+  BFD_ENDIAN_UNKNOWN,          /* target byte order */
+  BFD_ENDIAN_UNKNOWN,          /* target headers byte order */
   (EXEC_P |                    /* object flags */
    HAS_SYMS | HAS_LINENO | HAS_DEBUG | HAS_RELOC | HAS_LOCALS |
    WP_TEXT | D_PAGED),
@@ -1027,5 +1060,7 @@ const bfd_target tekhex_vec =
   BFD_JUMP_TABLE_LINK (tekhex),
   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 
+  NULL,
+
   (PTR) 0
 };
This page took 0.037664 seconds and 4 git commands to generate.