1 /* BFD back-end for s-record objects.
2 Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
27 Ordinary S-Records cannot hold anything but addresses and
28 data, so that's all that we implement.
30 The only interesting thing is that S-Records may come out of
31 order and there is no header, so an initial scan is required
32 to discover the minimum and maximum addresses used to create
33 the vma and size of the only section we create. We
34 arbitrarily call this section ".text".
36 When bfd_get_section_contents is called the file is read
37 again, and this time the data is placed into a bfd_alloc'd
40 Any number of sections may be created for output, we save them
41 up and output them when it's time to close the bfd.
43 An s record looks like:
46 S<type><length><address><data><checksum>
51 is the number of bytes following upto the checksum. Note that
52 this is not the number of chars following, since it takes two
53 chars to represent a byte.
57 1) two byte address data record
58 2) three byte address data record
59 3) four byte address data record
60 7) four byte address termination record
61 8) three byte address termination record
62 9) two byte address termination record
65 is the start address of the data following, or in the case of
66 a termination record, the start address of the image
70 is the sum of all the raw byte data in the record, from the length
71 upwards, modulo 256 and subtracted from 255.
75 Symbol S-Record handling
78 Some ICE equipment understands an addition to the standard
79 S-Record format; symbols and their addresses can be sent
82 The format of this is:
84 (<space> <symbol> <address>)*)
87 so a short symbol table could look like:
101 We allow symbols to be anywhere in the data stream - the module names
110 /* Macros for converting between hex and binary. */
112 static CONST char digs[] = "0123456789ABCDEF";
114 /* Table that gets filled in with numbers corresponding to hex chars. */
116 static char hex_value[256];
119 #define NIBBLE(x) hex_value[(unsigned char)(x)]
120 #define HEX(buffer) ((NIBBLE((buffer)[0])<<4) + NIBBLE((buffer)[1]))
121 #define TOHEX(d, x, ch) \
122 d[1] = digs[(x) & 0xf]; \
123 d[0] = digs[((x)>>4)&0xf]; \
125 #define ISHEX(x) (hex_value[(unsigned char)(x)] != NOT_HEX)
127 /* Initialize by filling in the hex conversion array. */
130 DEFUN_VOID (srec_init)
133 static boolean inited = false;
139 for (i = 0; i < sizeof (hex_value); i++)
141 hex_value[i] = NOT_HEX;
143 for (i = 0; i < 10; i++)
145 hex_value[i + '0'] = i;
147 for (i = 0; i < 6; i++)
149 hex_value[i + 'a'] = i + 10;
150 hex_value[i + 'A'] = i + 10;
156 /* The maximum number of bytes on a line is FF */
157 #define MAXCHUNK 0xff
158 /* The number of bytes we fit onto a line on output */
161 /* We cannot output our srecords as we see them, we have to glue them
162 together, this is done in this structure : */
164 struct srec_data_list_struct
169 struct srec_data_list_struct *next;
173 typedef struct srec_data_list_struct srec_data_list_type;
176 typedef struct srec_data_struct
178 srec_data_list_type *head;
181 int done_symbol_read;
193 called once per input S-Record, used to work out vma and size of data.
196 static bfd_vma low, high;
200 size_symbols (abfd, buf, len, val)
207 abfd->tdata.srec_data->string_size += len + 1;
211 fillup_symbols (abfd, buf, len, val)
217 if (!abfd->tdata.srec_data->done_symbol_read)
220 if (abfd->tdata.srec_data->symbols == 0)
222 abfd->tdata.srec_data->symbols = (asymbol *) bfd_alloc (abfd, abfd->symcount * sizeof (asymbol));
223 abfd->tdata.srec_data->strings = (char *) bfd_alloc (abfd, abfd->tdata.srec_data->string_size);
224 if (!abfd->tdata.srec_data->symbols || !abfd->tdata.srec_data->strings)
226 bfd_set_error (bfd_error_no_memory);
227 abort (); /* FIXME */
229 abfd->tdata.srec_data->symbol_idx = 0;
230 abfd->tdata.srec_data->string_idx = 0;
233 p = abfd->tdata.srec_data->symbols + abfd->tdata.srec_data->symbol_idx++;
235 p->name = abfd->tdata.srec_data->strings + abfd->tdata.srec_data->string_idx;
236 memcpy ((char *) (p->name), buf, len + 1);
237 abfd->tdata.srec_data->string_idx += len + 1;
239 p->flags = BSF_EXPORT | BSF_GLOBAL;
240 p->section = &bfd_abs_section;
246 DEFUN (size_srec, (abfd, section, address, raw, length),
248 asection * section AND
255 if (address + length > high)
256 high = address + length - 1;
261 called once per input S-Record, copies data from input into bfd_alloc'd area
266 DEFUN (fillup, (abfd, section, address, raw, length),
268 asection * section AND
275 (bfd_byte *) (section->used_by_bfd) + address - section->vma;
276 /* length -1 because we don't read in the checksum */
277 for (i = 0; i < length - 1; i++)
285 /* Pass over an S-Record file, calling one of the above functions on each
292 return (x == ' ' || x == '\t' || x == '\n' || x == '\r');
295 skipwhite (src, abfd)
300 while (white (*src) && !eof)
302 eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1);
308 DEFUN (srec_mkobject, (abfd),
311 if (abfd->tdata.srec_data == 0)
313 tdata_type *tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type));
316 bfd_set_error (bfd_error_no_memory);
319 abfd->tdata.srec_data = tdata;
321 tdata->head = (srec_data_list_type *) NULL;
328 pass_over (abfd, func, symbolfunc, section)
331 void (*symbolfunc) ();
334 unsigned int bytes_on_line;
337 srec_mkobject (abfd);
338 /* To the front of the file */
339 bfd_seek (abfd, (file_ptr) 0, SEEK_SET);
342 char buffer[MAXCHUNK];
347 /* Find first 'S' or $ */
348 eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1);
357 /* Inside a symbol definition - just ignore the module name */
358 while (*src != '\n' && !eof)
360 eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1);
365 /* spaces - maybe just before a symbol */
366 while (*src != '\n' && *src != '\r' && white (*src))
368 eof = skipwhite (src, abfd);
373 char symbol[MAXCHUNK];
375 /* get the symbol part */
376 while (!eof && !white (*src) && slen < MAXCHUNK)
378 symbol[slen++] = *src;
379 eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1);
382 eof = skipwhite (src, abfd);
383 /* skip the $ for the hex value */
386 eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1);
389 /* Scan off the hex number */
390 while (isxdigit (*src))
395 else if (isupper (*src))
397 val += *src - 'A' + 10;
401 val += *src - 'a' + 10;
403 eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1);
405 symbolfunc (abfd, symbol, slen, val);
412 /* Fetch the type and the length */
413 bfd_read (src, 1, 3, abfd);
417 if (!ISHEX (src[0]) || !ISHEX (src[1]))
420 bytes_on_line = HEX (src);
422 if (bytes_on_line > MAXCHUNK / 2)
426 bfd_read (src, 1, bytes_on_line * 2, abfd);
432 /* Prologue - ignore */
440 address = HEX (src) | (address << 8);
444 address = HEX (src) | (address << 8);
446 address = HEX (src) | (address << 8);
449 func (abfd, section, address, src, bytes_on_line);
464 /* We create one section called .text for all the contents,
465 and allocate enough room for the entire file. */
467 section = bfd_make_section (abfd, ".text");
468 section->_raw_size = 0;
469 section->vma = 0xffffffff;
472 pass_over (abfd, size_srec, size_symbols, section);
473 section->_raw_size = high - low;
475 section->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC;
478 abfd->flags |= HAS_SYMS;
483 DEFUN (srec_object_p, (abfd),
490 bfd_seek (abfd, (file_ptr) 0, SEEK_SET);
491 bfd_read (b, 1, 4, abfd);
493 if (b[0] != 'S' || !ISHEX (b[1]) || !ISHEX (b[2]) || !ISHEX (b[3]))
494 return (bfd_target *) NULL;
496 /* We create one section called .text for all the contents,
497 and allocate enough room for the entire file. */
499 return object_p (abfd);
504 DEFUN (symbolsrec_object_p, (abfd),
511 bfd_seek (abfd, (file_ptr) 0, SEEK_SET);
512 bfd_read (b, 1, 4, abfd);
514 if (b[0] != '$' || b[1] != '$')
515 return (bfd_target *) NULL;
517 return object_p (abfd);
522 DEFUN (srec_get_section_contents, (abfd, section, location, offset, count),
524 asection * section AND
529 if (section->used_by_bfd == (PTR) NULL)
531 section->used_by_bfd = (PTR) bfd_alloc (abfd, section->_raw_size);
532 if (!section->used_by_bfd)
534 bfd_set_error (bfd_error_no_memory);
538 pass_over (abfd, fillup, fillup_symbols, section);
540 memcpy ((PTR) location,
541 (PTR) ((char *) (section->used_by_bfd) + offset),
549 DEFUN (srec_set_arch_mach, (abfd, arch, machine),
551 enum bfd_architecture arch AND
552 unsigned long machine)
554 return bfd_default_set_arch_mach (abfd, arch, machine);
558 /* we have to save up all the Srecords for a splurge before output,
562 DEFUN (srec_set_section_contents, (abfd, section, location, offset, bytes_to_do),
567 bfd_size_type bytes_to_do)
569 tdata_type *tdata = abfd->tdata.srec_data;
570 srec_data_list_type *entry = (srec_data_list_type *)
571 bfd_alloc (abfd, sizeof (srec_data_list_type));
575 bfd_set_error (bfd_error_no_memory);
579 if ((section->flags & SEC_ALLOC)
580 && (section->flags & SEC_LOAD))
582 unsigned char *data = (unsigned char *) bfd_alloc (abfd, bytes_to_do);
585 bfd_set_error (bfd_error_no_memory);
588 memcpy ((PTR) data, location, bytes_to_do);
590 if ((section->lma + offset + bytes_to_do) <= 0xffff)
594 else if ((section->lma + offset + bytes_to_do) <= 0xffffff
605 entry->where = section->lma + offset;
606 entry->size = bytes_to_do;
607 entry->next = tdata->head;
613 /* Write a record of type, of the supplied number of bytes. The
614 supplied bytes and length don't have a checksum. That's worked out
619 DEFUN (srec_write_record, (abfd, type, address, data, end),
623 CONST unsigned char *data AND
624 CONST unsigned char *end)
627 char buffer[MAXCHUNK];
629 unsigned int check_sum = 0;
630 CONST unsigned char *src = data;
639 dst += 2; /* leave room for dst*/
645 TOHEX (dst, (address >> 24), check_sum);
649 TOHEX (dst, (address >> 16), check_sum);
654 TOHEX (dst, (address >> 8), check_sum);
656 TOHEX (dst, (address), check_sum);
661 for (src = data; src < end; src++)
663 TOHEX (dst, *src, check_sum);
667 /* Fill in the length */
668 TOHEX (length, (dst - length) / 2, check_sum);
670 check_sum = 255 - check_sum;
671 TOHEX (dst, check_sum, check_sum);
676 bfd_write ((PTR) buffer, 1, dst - buffer, abfd);
682 DEFUN (srec_write_header, (abfd),
685 unsigned char buffer[MAXCHUNK];
686 unsigned char *dst = buffer;
689 /* I'll put an arbitary 40 char limit on header size */
690 for (i = 0; i < 40 && abfd->filename[i]; i++)
692 *dst++ = abfd->filename[i];
694 srec_write_record (abfd, 0, 0, buffer, dst);
698 DEFUN (srec_write_section, (abfd, tdata, list),
700 tdata_type * tdata AND
701 srec_data_list_type * list)
703 unsigned int bytes_written = 0;
704 unsigned char *location = list->data;
706 while (bytes_written < list->size)
710 unsigned int bytes_this_chunk = list->size - bytes_written;
712 if (bytes_this_chunk > CHUNK)
714 bytes_this_chunk = CHUNK;
717 address = list->where + bytes_written;
719 srec_write_record (abfd,
723 location + bytes_this_chunk);
725 bytes_written += bytes_this_chunk;
726 location += bytes_this_chunk;
732 DEFUN (srec_write_terminator, (abfd, tdata),
736 unsigned char buffer[2];
738 srec_write_record (abfd, 10 - tdata->type,
739 abfd->start_address, buffer, buffer);
745 srec_write_symbols (abfd)
748 char buffer[MAXCHUNK];
749 /* Dump out the symbols of a bfd */
751 int len = bfd_get_symcount (abfd);
755 asymbol **table = bfd_get_outsymbols (abfd);
756 sprintf (buffer, "$$ %s\r\n", abfd->filename);
758 bfd_write (buffer, strlen (buffer), 1, abfd);
760 for (i = 0; i < len; i++)
762 asymbol *s = table[i];
764 int len = strlen (s->name);
766 /* If this symbol has a .[ocs] in it, it's probably a file name
767 and we'll output that as the module name */
769 if (len > 3 && s->name[len - 2] == '.')
772 sprintf (buffer, "$$ %s\r\n", s->name);
774 bfd_write (buffer, l, 1, abfd);
778 if (s->flags & (BSF_GLOBAL | BSF_LOCAL)
779 && (s->flags & BSF_DEBUGGING) == 0
781 && s->name[0] != 't')
783 /* Just dump out non debug symbols */
789 s->value + s->section->output_section->lma
790 + s->section->output_offset);
792 while (p[0] == '0' && p[1] != 0)
794 sprintf (buffer, " %s $%s\r\n", s->name, p);
796 bfd_write (buffer, l, 1, abfd);
799 sprintf (buffer, "$$ \r\n");
800 bfd_write (buffer, strlen (buffer), 1, abfd);
805 internal_srec_write_object_contents (abfd, symbols)
809 tdata_type *tdata = abfd->tdata.srec_data;
810 srec_data_list_type *list;
813 srec_write_symbols (abfd);
815 srec_write_header (abfd);
817 /* Now wander though all the sections provided and output them */
820 while (list != (srec_data_list_type *) NULL)
822 srec_write_section (abfd, tdata, list);
825 srec_write_terminator (abfd, tdata);
830 srec_write_object_contents (abfd)
833 return internal_srec_write_object_contents (abfd, 0);
837 symbolsrec_write_object_contents (abfd)
840 return internal_srec_write_object_contents (abfd, 1);
845 DEFUN (srec_sizeof_headers, (abfd, exec),
853 DEFUN (srec_make_empty_symbol, (abfd),
856 asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol));
863 srec_get_symtab_upper_bound (abfd)
866 /* Read in all the info */
867 srec_get_section_contents (abfd, abfd->sections, 0, 0, 0);
868 return (bfd_get_symcount (abfd) + 1) * (sizeof (asymbol *));
872 DEFUN (srec_get_symtab, (abfd, alocation),
874 asymbol ** alocation)
876 int lim = abfd->symcount;
878 for (i = 0; i < lim; i++)
880 alocation[i] = abfd->tdata.srec_data->symbols + i;
888 DEFUN (srec_get_symbol_info, (ignore_abfd, symbol, ret),
889 bfd * ignore_abfd AND
893 bfd_symbol_info (symbol, ret);
898 DEFUN (srec_print_symbol, (ignore_abfd, afile, symbol, how),
899 bfd * ignore_abfd AND
902 bfd_print_symbol_type how)
904 FILE *file = (FILE *) afile;
907 case bfd_print_symbol_name:
908 fprintf (file, "%s", symbol->name);
911 bfd_print_symbol_vandf ((PTR) file, symbol);
912 fprintf (file, " %-5s %s",
913 symbol->section->name,
920 #define srec_new_section_hook (FOO(boolean, (*), (bfd *, asection *)))bfd_true
922 #define srec_get_reloc_upper_bound (FOO(unsigned int, (*),(bfd*, asection *)))bfd_false
923 #define srec_canonicalize_reloc (FOO(unsigned int, (*),(bfd*,asection *, arelent **, asymbol **))) bfd_0
927 #define srec_openr_next_archived_file (FOO(bfd *, (*), (bfd*,bfd*))) bfd_nullvoidptr
928 #define srec_find_nearest_line (FOO(boolean, (*),(bfd*,asection*,asymbol**,bfd_vma, CONST char**, CONST char**, unsigned int *))) bfd_false
929 #define srec_generic_stat_arch_elt (FOO(int, (*), (bfd *,struct stat *))) bfd_0
932 #define srec_core_file_failing_command (char *(*)())(bfd_nullvoidptr)
933 #define srec_core_file_failing_signal (int (*)())bfd_0
934 #define srec_core_file_matches_executable_p (FOO(boolean, (*),(bfd*, bfd*)))bfd_false
935 #define srec_slurp_armap bfd_true
936 #define srec_slurp_extended_name_table bfd_true
937 #define srec_truncate_arname (void (*)())bfd_nullvoidptr
938 #define srec_write_armap (FOO( boolean, (*),(bfd *, unsigned int, struct orl *, unsigned int, int))) bfd_nullvoidptr
939 #define srec_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
940 #define srec_close_and_cleanup bfd_generic_close_and_cleanup
941 #define srec_bfd_debug_info_start bfd_void
942 #define srec_bfd_debug_info_end bfd_void
943 #define srec_bfd_debug_info_accumulate (FOO(void, (*), (bfd *, asection *))) bfd_void
944 #define srec_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
945 #define srec_bfd_relax_section bfd_generic_relax_section
946 #define srec_bfd_reloc_type_lookup \
947 ((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
948 #define srec_bfd_make_debug_symbol \
949 ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
950 #define srec_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
951 #define srec_bfd_link_add_symbols _bfd_generic_link_add_symbols
952 #define srec_bfd_final_link _bfd_generic_final_link
954 bfd_target srec_vec =
957 bfd_target_srec_flavour,
958 true, /* target byte order */
959 true, /* target headers byte order */
960 (HAS_RELOC | EXEC_P | /* object flags */
961 HAS_LINENO | HAS_DEBUG |
962 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
963 (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
964 | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
965 0, /* leading underscore */
966 ' ', /* ar_pad_char */
967 16, /* ar_max_namelen */
968 1, /* minimum alignment */
969 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
970 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
971 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
972 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
973 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
974 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
978 srec_object_p, /* bfd_check_format */
979 (struct bfd_target * (*)()) bfd_nullvoidptr,
980 (struct bfd_target * (*)()) bfd_nullvoidptr,
985 _bfd_generic_mkarchive,
988 { /* bfd_write_contents */
990 srec_write_object_contents,
991 _bfd_write_archive_contents,
999 bfd_target symbolsrec_vec =
1001 "symbolsrec", /* name */
1002 bfd_target_srec_flavour,
1003 true, /* target byte order */
1004 true, /* target headers byte order */
1005 (HAS_RELOC | EXEC_P | /* object flags */
1006 HAS_LINENO | HAS_DEBUG |
1007 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
1008 (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
1009 | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
1010 0, /* leading underscore */
1011 ' ', /* ar_pad_char */
1012 16, /* ar_max_namelen */
1013 1, /* minimum alignment */
1014 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
1015 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
1016 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
1017 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
1018 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
1019 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
1023 symbolsrec_object_p, /* bfd_check_format */
1024 (struct bfd_target * (*)()) bfd_nullvoidptr,
1025 (struct bfd_target * (*)()) bfd_nullvoidptr,
1030 _bfd_generic_mkarchive,
1033 { /* bfd_write_contents */
1035 symbolsrec_write_object_contents,
1036 _bfd_write_archive_contents,