tekhex.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,066 行 · 第 1/2 页

C
1,066
字号
  unsigned int c = bfd_get_symcount (abfd);  table[c] = 0;  while (p)    {      table[--c] = &(p->symbol);      p = p->prev;    }  return bfd_get_symcount (abfd);}static longtekhex_get_symtab_upper_bound (abfd)     bfd *abfd;{  return (abfd->symcount + 1) * (sizeof (struct tekhex_asymbol_struct *));}static booleantekhex_mkobject (abfd)     bfd *abfd;{  tdata_type *tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type));  if (!tdata)    return false;  abfd->tdata.tekhex_data = tdata;  tdata->type = 1;  tdata->head = (tekhex_data_list_type *) NULL;  tdata->symbols = (struct tekhex_symbol_struct *) NULL;  tdata->data = (struct data_struct *) NULL;  return true;}/*  Return true if the file looks like it's in TekHex format. Just look  for a percent sign and some hex digits */static const bfd_target *tekhex_object_p (abfd)     bfd *abfd;{  char b[4];  tekhex_init ();  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0      || bfd_read (b, 1, 4, abfd) != 4)    return NULL;  if (b[0] != '%' || !ISHEX (b[1]) || !ISHEX (b[2]) || !ISHEX (b[3]))    return (const bfd_target *) NULL;  tekhex_mkobject (abfd);  pass_over (abfd, first_phase);  return abfd->xvec;}static voidmove_section_contents (abfd, section, locationp, offset, count, get)     bfd *abfd;     asection *section;     PTR locationp;     file_ptr offset ATTRIBUTE_UNUSED;     bfd_size_type count;     boolean get;{  bfd_vma addr;  char *location = (char *) locationp;  bfd_vma prev_number = 1;	/* Nothing can have this as a high bit*/  struct data_struct *d = (struct data_struct *) NULL;  for (addr = section->vma; count != 0; count--, addr++)    {      bfd_vma chunk_number = addr & ~CHUNK_MASK;	/* Get high bits of address */      bfd_vma low_bits = addr & CHUNK_MASK;      if (chunk_number != prev_number)	{	  /* Different chunk, so move pointer */	  d = find_chunk (abfd, chunk_number);	}      if (get)	{	  if (d->chunk_init[low_bits])	    {	      *location = d->chunk_data[low_bits];	    }	  else	    {	      *location = 0;	    }	}      else	{	  d->chunk_data[low_bits] = *location;	  d->chunk_init[low_bits] = (*location != 0);	}      location++;    }}static booleantekhex_get_section_contents (abfd, section, locationp, offset, count)     bfd *abfd;     asection *section;     PTR locationp;     file_ptr offset;     bfd_size_type count;{  if (section->flags & (SEC_LOAD | SEC_ALLOC))    {      move_section_contents (abfd, section, locationp, offset, count, true);      return true;    }  else    return false;}static booleantekhex_set_arch_mach (abfd, arch, machine)     bfd *abfd;     enum bfd_architecture arch;     unsigned long machine;{  return bfd_default_set_arch_mach (abfd, arch, machine);}/* we have to save up all the Tekhexords for a splurge before output,    */static booleantekhex_set_section_contents (abfd, section, locationp, offset, bytes_to_do)     bfd *abfd;     sec_ptr section;     PTR locationp;     file_ptr offset;     bfd_size_type bytes_to_do;{  if (abfd->output_has_begun == false)    {      /* The first time around, allocate enough sections to hold all the chunks */      asection *s = abfd->sections;      bfd_vma vma;      for (s = abfd->sections; s; s = s->next)	{	  if (s->flags & SEC_LOAD)	    {	      for (vma = s->vma & ~CHUNK_MASK;		   vma < s->vma + s->_raw_size;		   vma += CHUNK_MASK)		find_chunk (abfd, vma);	    }	}    }  if (section->flags & (SEC_LOAD | SEC_ALLOC))    {      move_section_contents (abfd, section, locationp, offset, bytes_to_do, false);      return true;    }  else    return false;}static voidwritevalue (dst, value)     char **dst;     bfd_vma value;{  char *p = *dst;  int len;  int shift;  for (len = 8, shift = 28; shift; shift -= 4, len--)    {      if ((value >> shift) & 0xf)	{	  *p++ = len + '0';	  while (len)	    {	      *p++ = digs[(value >> shift) & 0xf];	      shift -= 4;	      len--;	    }	  *dst = p;	  return;	}    }  *p++ = '1';  *p++ = '0';  *dst = p;}static voidwritesym (dst, sym)     char **dst;     CONST char *sym;{  char *p = *dst;  int len = (sym ? strlen (sym) : 0);  if (len >= 16)    {      *p++ = '0';      len = 16;    }  else    {      if (len == 0)	{	  *p++ = '1';	  sym = "$";	  len = 1;	}      else	{	  *p++ = digs[len];	}    }  while (len--)    {      *p++ = *sym++;    }  *dst = p;}static voidout (abfd, type, start, end)     bfd *abfd;     int type;     char *start;     char *end;{  int sum = 0;  char *s;  char front[6];  bfd_size_type wrlen;  front[0] = '%';  TOHEX (front + 1, end - start + 5);  front[3] = type;  for (s = start; s < end; s++)    {      sum += sum_block[(unsigned char) *s];    }  sum += sum_block[(unsigned char) front[1]];	/*  length */  sum += sum_block[(unsigned char) front[2]];  sum += sum_block[(unsigned char) front[3]];	/* type */  TOHEX (front + 4, sum);  if (bfd_write (front, 1, 6, abfd) != 6)    abort ();  end[0] = '\n';  wrlen = end - start + 1;  if (bfd_write (start, 1, wrlen, abfd) != wrlen)    abort ();}static booleantekhex_write_object_contents (abfd)     bfd *abfd;{  int bytes_written;  char buffer[100];  asymbol **p;  asection *s;  struct data_struct *d;  tekhex_init ();  bytes_written = 0;  /* And the raw data */  for (d = abfd->tdata.tekhex_data->data;       d != (struct data_struct *) NULL;       d = d->next)    {      int low;      CONST int span = 32;      int addr;      /* Write it in blocks of 32 bytes */      for (addr = 0; addr < CHUNK_MASK + 1; addr += span)	{	  int need = 0;	  /* Check to see if necessary */	  for (low = 0; !need && low < span; low++)	    {	      if (d->chunk_init[addr + low])		need = 1;	    }	  if (need)	    {	      char *dst = buffer;	      writevalue (&dst, addr + d->vma);	      for (low = 0; low < span; low++)		{		  TOHEX (dst, d->chunk_data[addr + low]);		  dst += 2;		}	      out (abfd, '6', buffer, dst);	    }	}    }  /* write all the section headers for the sections */  for (s = abfd->sections; s != (asection *) NULL; s = s->next)    {      char *dst = buffer;      writesym (&dst, s->name);      *dst++ = '1';      writevalue (&dst, s->vma);      writevalue (&dst, s->vma + s->_raw_size);      out (abfd, '3', buffer, dst);    }  /* And the symbols */  if (abfd->outsymbols)    {      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;	      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;		}	      writesym (&dst, s->name);	      writevalue (&dst, s->value + s->section->vma);	      out (abfd, '3', buffer, dst);	    }	}    }  /* And the terminator */  if (bfd_write ("%0781010\n", 1, 9, abfd) != 9)    abort ();  return true;}static inttekhex_sizeof_headers (abfd, exec)     bfd *abfd ATTRIBUTE_UNUSED;     boolean exec ATTRIBUTE_UNUSED;{  return 0;}static asymbol *tekhex_make_empty_symbol (abfd)     bfd *abfd;{  tekhex_symbol_type *new =  (tekhex_symbol_type *) bfd_zalloc (abfd, sizeof (struct tekhex_symbol_struct));  if (!new)    return NULL;  new->symbol.the_bfd = abfd;  new->prev = (struct tekhex_symbol_struct *) NULL;  return &(new->symbol);}static voidtekhex_get_symbol_info (ignore_abfd, symbol, ret)     bfd *ignore_abfd ATTRIBUTE_UNUSED;     asymbol *symbol;     symbol_info *ret;{  bfd_symbol_info (symbol, ret);}static voidtekhex_print_symbol (ignore_abfd, filep, symbol, how)     bfd *ignore_abfd ATTRIBUTE_UNUSED;     PTR filep;     asymbol *symbol;     bfd_print_symbol_type how;{  FILE *file = (FILE *) filep;  switch (how)    {    case bfd_print_symbol_name:      fprintf (file, "%s", symbol->name);      break;    case bfd_print_symbol_more:      break;    case bfd_print_symbol_all:      {	CONST char *section_name = symbol->section->name;	bfd_print_symbol_vandf ((PTR) file, symbol);	fprintf (file, " %-5s %s",		 section_name,		 symbol->name);      }    }}#define	tekhex_close_and_cleanup _bfd_generic_close_and_cleanup#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_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#define tekhex_read_minisymbols _bfd_generic_read_minisymbols#define tekhex_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol#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_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#define tekhex_bfd_link_split_section _bfd_generic_link_split_section#define tekhex_get_section_contents_in_window \  _bfd_generic_get_section_contents_in_windowconst bfd_target tekhex_vec ={  "tekhex",			/* name */  bfd_target_tekhex_flavour,  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),  (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,    tekhex_object_p,		/* bfd_check_format */    _bfd_dummy_target,    _bfd_dummy_target,  },  {    bfd_false,    tekhex_mkobject,    _bfd_generic_mkarchive,    bfd_false,  },  {				/* bfd_write_contents */    bfd_false,    tekhex_write_object_contents,    _bfd_write_archive_contents,    bfd_false,  },  BFD_JUMP_TABLE_GENERIC (tekhex),  BFD_JUMP_TABLE_COPY (_bfd_generic),  BFD_JUMP_TABLE_CORE (_bfd_nocore),  BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),  BFD_JUMP_TABLE_SYMBOLS (tekhex),  BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),  BFD_JUMP_TABLE_WRITE (tekhex),  BFD_JUMP_TABLE_LINK (tekhex),  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),  NULL,  (PTR) 0};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?