srec.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,379 行 · 第 1/3 页
C
1,379 行
}/* Write a record of type, of the supplied number of bytes. The supplied bytes and length don't have a checksum. That's worked out here. */static booleansrec_write_record (abfd, type, address, data, end) bfd *abfd; int type; bfd_vma address; const bfd_byte *data; const bfd_byte *end;{ char buffer[MAXCHUNK]; unsigned int check_sum = 0; CONST bfd_byte *src = data; char *dst = buffer; char *length; bfd_size_type wrlen; *dst++ = 'S'; *dst++ = '0' + type; length = dst; dst += 2; /* Leave room for dst. */ switch (type) { case 3: case 7: TOHEX (dst, (address >> 24), check_sum); dst += 2; case 8: case 2: TOHEX (dst, (address >> 16), check_sum); dst += 2; case 9: case 1: case 0: TOHEX (dst, (address >> 8), check_sum); dst += 2; TOHEX (dst, (address), check_sum); dst += 2; break; } for (src = data; src < end; src++) { TOHEX (dst, *src, check_sum); dst += 2; } /* Fill in the length. */ TOHEX (length, (dst - length) / 2, check_sum); check_sum &= 0xff; check_sum = 255 - check_sum; TOHEX (dst, check_sum, check_sum); dst += 2; *dst++ = '\r'; *dst++ = '\n'; wrlen = dst - buffer; if (bfd_write ((PTR) buffer, 1, wrlen, abfd) != wrlen) return false; return true;}static booleansrec_write_header (abfd) bfd *abfd;{ bfd_byte buffer[MAXCHUNK]; bfd_byte *dst = buffer; unsigned int i; /* I'll put an arbitary 40 char limit on header size. */ for (i = 0; i < 40 && abfd->filename[i]; i++) *dst++ = abfd->filename[i]; return srec_write_record (abfd, 0, 0, buffer, dst);}static booleansrec_write_section (abfd, tdata, list) bfd *abfd; tdata_type *tdata; srec_data_list_type *list;{ unsigned int octets_written = 0; bfd_byte *location = list->data; while (octets_written < list->size) { bfd_vma address; unsigned int octets_this_chunk = list->size - octets_written; if (octets_this_chunk > Chunk) octets_this_chunk = Chunk; address = list->where + octets_written / bfd_octets_per_byte (abfd); if (! srec_write_record (abfd, tdata->type, address, location, location + octets_this_chunk)) return false; octets_written += octets_this_chunk; location += octets_this_chunk; } return true;}static booleansrec_write_terminator (abfd, tdata) bfd *abfd; tdata_type *tdata;{ bfd_byte buffer[2]; return srec_write_record (abfd, 10 - tdata->type, abfd->start_address, buffer, buffer);}static booleansrec_write_symbols (abfd) bfd *abfd;{ char buffer[MAXCHUNK]; /* Dump out the symbols of a bfd. */ int i; int count = bfd_get_symcount (abfd); if (count) { size_t len; asymbol **table = bfd_get_outsymbols (abfd); sprintf (buffer, "$$ %s\r\n", abfd->filename); len = strlen (buffer); if (bfd_write (buffer, len, 1, abfd) != len) return false; for (i = 0; i < count; i++) { asymbol *s = table[i]; if (! bfd_is_local_label (abfd, s) && (s->flags & BSF_DEBUGGING) == 0) { /* Just dump out non debug symbols. */ bfd_size_type l; char buf2[40], *p; sprintf_vma (buf2, s->value + s->section->output_section->lma + s->section->output_offset); p = buf2; while (p[0] == '0' && p[1] != 0) p++; sprintf (buffer, " %s $%s\r\n", s->name, p); l = strlen (buffer); if (bfd_write (buffer, l, 1, abfd) != l) return false; } } sprintf (buffer, "$$ \r\n"); len = strlen (buffer); if (bfd_write (buffer, len, 1, abfd) != len) return false; } return true;}static booleaninternal_srec_write_object_contents (abfd, symbols) bfd *abfd; int symbols;{ tdata_type *tdata = abfd->tdata.srec_data; srec_data_list_type *list; if (symbols) { if (! srec_write_symbols (abfd)) return false; } if (! srec_write_header (abfd)) return false; /* Now wander though all the sections provided and output them. */ list = tdata->head; while (list != (srec_data_list_type *) NULL) { if (! srec_write_section (abfd, tdata, list)) return false; list = list->next; } return srec_write_terminator (abfd, tdata);}static booleansrec_write_object_contents (abfd) bfd *abfd;{ return internal_srec_write_object_contents (abfd, 0);}static booleansymbolsrec_write_object_contents (abfd) bfd *abfd;{ return internal_srec_write_object_contents (abfd, 1);}static intsrec_sizeof_headers (abfd, exec) bfd *abfd ATTRIBUTE_UNUSED; boolean exec ATTRIBUTE_UNUSED;{ return 0;}static asymbol *srec_make_empty_symbol (abfd) bfd *abfd;{ asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol)); if (new) new->the_bfd = abfd; return new;}/* Return the amount of memory needed to read the symbol table. */static longsrec_get_symtab_upper_bound (abfd) bfd *abfd;{ return (bfd_get_symcount (abfd) + 1) * sizeof (asymbol *);}/* Return the symbol table. */static longsrec_get_symtab (abfd, alocation) bfd *abfd; asymbol **alocation;{ unsigned int symcount = bfd_get_symcount (abfd); asymbol *csymbols; unsigned int i; csymbols = abfd->tdata.srec_data->csymbols; if (csymbols == NULL) { asymbol *c; struct srec_symbol *s; csymbols = (asymbol *) bfd_alloc (abfd, symcount * sizeof (asymbol)); if (csymbols == NULL && symcount != 0) return false; abfd->tdata.srec_data->csymbols = csymbols; for (s = abfd->tdata.srec_data->symbols, c = csymbols; s != NULL; s = s->next, ++c) { c->the_bfd = abfd; c->name = s->name; c->value = s->val; c->flags = BSF_GLOBAL; c->section = bfd_abs_section_ptr; c->udata.p = NULL; } } for (i = 0; i < symcount; i++) *alocation++ = csymbols++; *alocation = NULL; return symcount;}static voidsrec_get_symbol_info (ignore_abfd, symbol, ret) bfd *ignore_abfd ATTRIBUTE_UNUSED; asymbol *symbol; symbol_info *ret;{ bfd_symbol_info (symbol, ret);}static voidsrec_print_symbol (ignore_abfd, afile, symbol, how) bfd *ignore_abfd ATTRIBUTE_UNUSED; PTR afile; asymbol *symbol; bfd_print_symbol_type how;{ FILE *file = (FILE *) afile; switch (how) { case bfd_print_symbol_name: fprintf (file, "%s", symbol->name); break; default: bfd_print_symbol_vandf ((PTR) file, symbol); fprintf (file, " %-5s %s", symbol->section->name, symbol->name); }}#define srec_close_and_cleanup _bfd_generic_close_and_cleanup#define srec_bfd_free_cached_info _bfd_generic_bfd_free_cached_info#define srec_new_section_hook _bfd_generic_new_section_hook#define srec_bfd_is_local_label_name bfd_generic_is_local_label_name#define srec_get_lineno _bfd_nosymbols_get_lineno#define srec_find_nearest_line _bfd_nosymbols_find_nearest_line#define srec_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol#define srec_read_minisymbols _bfd_generic_read_minisymbols#define srec_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol#define srec_get_reloc_upper_bound \ ((long (*) PARAMS ((bfd *, asection *))) bfd_0l)#define srec_canonicalize_reloc \ ((long (*) PARAMS ((bfd *, asection *, arelent **, asymbol **))) bfd_0l)#define srec_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup#define srec_get_section_contents_in_window \ _bfd_generic_get_section_contents_in_window#define srec_bfd_get_relocated_section_contents \ bfd_generic_get_relocated_section_contents#define srec_bfd_relax_section bfd_generic_relax_section#define srec_bfd_gc_sections bfd_generic_gc_sections#define srec_bfd_link_hash_table_create _bfd_generic_link_hash_table_create#define srec_bfd_link_add_symbols _bfd_generic_link_add_symbols#define srec_bfd_final_link _bfd_generic_final_link#define srec_bfd_link_split_section _bfd_generic_link_split_sectionconst bfd_target srec_vec ={ "srec", /* name */ bfd_target_srec_flavour, BFD_ENDIAN_UNKNOWN, /* target byte order */ BFD_ENDIAN_UNKNOWN, /* target headers byte order */ (HAS_RELOC | EXEC_P | /* object flags */ HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ 0, /* leading underscore */ ' ', /* ar_pad_char */ 16, /* ar_max_namelen */ 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_getb64, bfd_getb_signed_64, bfd_putb64, bfd_getb32, bfd_getb_signed_32, bfd_putb32, bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ { _bfd_dummy_target, srec_object_p, /* bfd_check_format */ _bfd_dummy_target, _bfd_dummy_target, }, { bfd_false, srec_mkobject, _bfd_generic_mkarchive, bfd_false, }, { /* bfd_write_contents */ bfd_false, srec_write_object_contents, _bfd_write_archive_contents, bfd_false, }, BFD_JUMP_TABLE_GENERIC (srec), BFD_JUMP_TABLE_COPY (_bfd_generic), BFD_JUMP_TABLE_CORE (_bfd_nocore), BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), BFD_JUMP_TABLE_SYMBOLS (srec), BFD_JUMP_TABLE_RELOCS (srec), BFD_JUMP_TABLE_WRITE (srec), BFD_JUMP_TABLE_LINK (srec), BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), NULL, (PTR) 0};const bfd_target symbolsrec_vec ={ "symbolsrec", /* name */ bfd_target_srec_flavour, BFD_ENDIAN_UNKNOWN, /* target byte order */ BFD_ENDIAN_UNKNOWN, /* target headers byte order */ (HAS_RELOC | EXEC_P | /* object flags */ HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ 0, /* leading underscore */ ' ', /* ar_pad_char */ 16, /* ar_max_namelen */ 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_getb64, bfd_getb_signed_64, bfd_putb64, bfd_getb32, bfd_getb_signed_32, bfd_putb32, bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ { _bfd_dummy_target, symbolsrec_object_p, /* bfd_check_format */ _bfd_dummy_target, _bfd_dummy_target, }, { bfd_false, srec_mkobject, _bfd_generic_mkarchive, bfd_false, }, { /* bfd_write_contents */ bfd_false, symbolsrec_write_object_contents, _bfd_write_archive_contents, bfd_false, }, BFD_JUMP_TABLE_GENERIC (srec), BFD_JUMP_TABLE_COPY (_bfd_generic), BFD_JUMP_TABLE_CORE (_bfd_nocore), BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), BFD_JUMP_TABLE_SYMBOLS (srec), BFD_JUMP_TABLE_RELOCS (srec), BFD_JUMP_TABLE_WRITE (srec), BFD_JUMP_TABLE_LINK (srec), BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), NULL, (PTR) 0};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?