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 + -
显示快捷键?