versados.c

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

C
902
字号
    }  EDATA (abfd, otr->esdid - 1).pc = dst_idx;  if (!contents && need_contents)    esdid->contents = (unsigned char *) bfd_alloc (abfd, esdid->section->_raw_size);}static booleanversados_scan (abfd)     bfd *abfd;{  int loop = 1;  int i;  int j;  int nsecs = 0;  VDATA (abfd)->stringlen = 0;  VDATA (abfd)->nrefs = 0;  VDATA (abfd)->ndefs = 0;  VDATA (abfd)->ref_idx = 0;  VDATA (abfd)->def_idx = 0;  VDATA (abfd)->pass_2_done = 0;  while (loop)    {      union ext_any any;      if (!get_record (abfd, &any))	return true;      switch (any.header.type)	{	case VHEADER:	  break;	case VEND:	  loop = 0;	  break;	case VESTDEF:	  process_esd (abfd, &any.esd, 1);	  break;	case VOTR:	  process_otr (abfd, &any.otr, 1);	  break;	}    }  /* Now allocate space for the relocs and sections */  VDATA (abfd)->nrefs = VDATA (abfd)->ref_idx;  VDATA (abfd)->ndefs = VDATA (abfd)->def_idx;  VDATA (abfd)->ref_idx = 0;  VDATA (abfd)->def_idx = 0;  abfd->symcount = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs;  for (i = 0; i < 16; i++)    {      struct esdid *esdid = &EDATA (abfd, i);      if (esdid->section)	{	  esdid->section->relocation	    = (arelent *) bfd_alloc (abfd, sizeof (arelent) * esdid->relocs);	  esdid->pc = 0;	  if (esdid->contents)	    esdid->section->flags |= SEC_HAS_CONTENTS | SEC_LOAD;	  esdid->section->reloc_count = esdid->relocs;	  if (esdid->relocs)	    esdid->section->flags |= SEC_RELOC;	  esdid->relocs = 0;	  /* Add an entry into the symbol table for it */	  nsecs++;	  VDATA (abfd)->stringlen += strlen (esdid->section->name) + 1;	}    }  abfd->symcount += nsecs;  VDATA (abfd)->symbols = (asymbol *) bfd_alloc (abfd,				       sizeof (asymbol) * (abfd->symcount));  VDATA (abfd)->strings = bfd_alloc (abfd, VDATA (abfd)->stringlen);  if ((VDATA (abfd)->symbols == NULL && abfd->symcount > 0)      || (VDATA (abfd)->strings == NULL && VDATA (abfd)->stringlen > 0))    return false;  /* Actually fill in the section symbols,     we stick them at the end of the table */  for (j = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs, i = 0; i < 16; i++)    {      struct esdid *esdid = &EDATA (abfd, i);      asection *sec = esdid->section;      if (sec)	{	  asymbol *s = VDATA (abfd)->symbols + j;	  s->name = new_symbol_string (abfd, sec->name);	  s->section = sec;	  s->flags = BSF_LOCAL;	  s->value = 0;	  s->the_bfd = abfd;	  j++;	}    }  if (abfd->symcount)    abfd->flags |= HAS_SYMS;  /* Set this to nsecs - since we've already planted the section     symbols */  VDATA (abfd)->nsecsyms = nsecs;  VDATA (abfd)->ref_idx = 0;  return 1;}/* Check whether an existing file is a versados  file.  */static const bfd_target *versados_object_p (abfd)     bfd *abfd;{  struct ext_vheader ext;  unsigned char len;  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)    return NULL;  if (bfd_read (&len, 1, 1, abfd) != 1)    {      if (bfd_get_error () != bfd_error_system_call)	bfd_set_error (bfd_error_wrong_format);      return NULL;    }  if (bfd_read (&ext.type, 1, len, abfd) != len)    {      if (bfd_get_error () != bfd_error_system_call)	bfd_set_error (bfd_error_wrong_format);      return NULL;    }  /* We guess that the language field will never be larger than 10.     In sample files, it is always either 0 or 1.  Checking for this     prevents confusion with Intel Hex files.  */  if (ext.type != VHEADER      || ext.lang > 10)    {      bfd_set_error (bfd_error_wrong_format);      return NULL;    }  /* OK, looks like a record, build the tdata and read in.  */  if (!versados_mkobject (abfd)      || !versados_scan (abfd))    return NULL;  return abfd->xvec;}static booleanversados_pass_2 (abfd)     bfd *abfd;{  union ext_any any;  if (VDATA (abfd)->pass_2_done)    return 1;  if (bfd_seek (abfd, 0, SEEK_SET) != 0)    return 0;  VDATA (abfd)->es_done = ES_BASE;  /* read records till we get to where we want to be */  while (1)    {      get_record (abfd, &any);      switch (any.header.type)	{	case VEND:	  VDATA (abfd)->pass_2_done = 1;	  return 1;	case VESTDEF:	  process_esd (abfd, &any.esd, 2);	  break;	case VOTR:	  process_otr (abfd, &any.otr, 2);	  break;	}    }}static booleanversados_get_section_contents (abfd, section, location, offset, count)     bfd *abfd;     asection *section;     PTR location;     file_ptr offset;     bfd_size_type count;{  if (!versados_pass_2 (abfd))    return false;  memcpy (location,	  EDATA (abfd, section->target_index).contents + offset,	  (size_t) count);  return true;}#define versados_get_section_contents_in_window \  _bfd_generic_get_section_contents_in_windowstatic booleanversados_set_section_contents (abfd, section, location, offset, bytes_to_do)     bfd *abfd ATTRIBUTE_UNUSED;     sec_ptr section ATTRIBUTE_UNUSED;     PTR location ATTRIBUTE_UNUSED;     file_ptr offset ATTRIBUTE_UNUSED;     bfd_size_type bytes_to_do ATTRIBUTE_UNUSED;{  return false;}static intversados_sizeof_headers (abfd, exec)     bfd *abfd ATTRIBUTE_UNUSED;     boolean exec ATTRIBUTE_UNUSED;{  return 0;}static asymbol *versados_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 longversados_get_symtab_upper_bound (abfd)     bfd *abfd;{  return (bfd_get_symcount (abfd) + 1) * sizeof (asymbol *);}/* Return the symbol table.  */static longversados_get_symtab (abfd, alocation)     bfd *abfd;     asymbol **alocation;{  unsigned int symcount = bfd_get_symcount (abfd);  unsigned int i;  asymbol *s;  versados_pass_2 (abfd);  for (i = 0, s = VDATA (abfd)->symbols;       i < symcount;       s++, i++)    {      *alocation++ = s;    }  *alocation = NULL;  return symcount;}voidversados_get_symbol_info (ignore_abfd, symbol, ret)     bfd *ignore_abfd ATTRIBUTE_UNUSED;     asymbol *symbol;     symbol_info *ret;{  bfd_symbol_info (symbol, ret);}voidversados_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);    }}longversados_get_reloc_upper_bound (abfd, asect)     bfd *abfd ATTRIBUTE_UNUSED;     sec_ptr asect;{  return (asect->reloc_count + 1) * sizeof (arelent *);}longversados_canonicalize_reloc (abfd, section, relptr, symbols)     bfd *abfd;     sec_ptr section;     arelent **relptr;     asymbol **symbols;{  unsigned int count;  arelent *src;  versados_pass_2 (abfd);  src = section->relocation;  if (!EDATA (abfd, section->target_index).donerel)    {      EDATA (abfd, section->target_index).donerel = 1;      /* translate from indexes to symptr ptrs */      for (count = 0; count < section->reloc_count; count++)	{	  int esdid = (int) src[count].sym_ptr_ptr;	  if (esdid == 0)	    {	      src[count].sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;	    }	  else if (esdid < ES_BASE)	/* Section relative thing */	    {	      struct esdid *e = &EDATA (abfd, esdid - 1);	      if (!section)		{		 /** relocation relative to section which was		   never declared ! */		}	      src[count].sym_ptr_ptr = e->section->symbol_ptr_ptr;	    }	  else	    {	      src[count].sym_ptr_ptr = symbols + esdid - ES_BASE;	    }	}    }  for (count = 0; count < section->reloc_count; count++)    {      *relptr++ = src++;    }  *relptr = 0;  return section->reloc_count;}#define	versados_close_and_cleanup _bfd_generic_close_and_cleanup#define versados_bfd_free_cached_info _bfd_generic_bfd_free_cached_info#define versados_new_section_hook _bfd_generic_new_section_hook#define versados_bfd_is_local_label_name bfd_generic_is_local_label_name#define versados_get_lineno _bfd_nosymbols_get_lineno#define versados_find_nearest_line _bfd_nosymbols_find_nearest_line#define versados_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol#define versados_read_minisymbols _bfd_generic_read_minisymbols#define versados_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol#define versados_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup#define versados_set_arch_mach bfd_default_set_arch_mach#define versados_bfd_get_relocated_section_contents \  bfd_generic_get_relocated_section_contents#define versados_bfd_relax_section bfd_generic_relax_section#define versados_bfd_gc_sections bfd_generic_gc_sections#define versados_bfd_link_hash_table_create _bfd_generic_link_hash_table_create#define versados_bfd_link_add_symbols _bfd_generic_link_add_symbols#define versados_bfd_final_link _bfd_generic_final_link#define versados_bfd_link_split_section _bfd_generic_link_split_sectionconst bfd_target versados_vec ={  "versados",			/* name */  bfd_target_versados_flavour,  BFD_ENDIAN_BIG,		/* target byte order */  BFD_ENDIAN_BIG,		/* 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,    versados_object_p,		/* bfd_check_format */    _bfd_dummy_target,    _bfd_dummy_target,  },  {    bfd_false,    versados_mkobject,    _bfd_generic_mkarchive,    bfd_false,  },  {				/* bfd_write_contents */    bfd_false,    bfd_false,    _bfd_write_archive_contents,    bfd_false,  },  BFD_JUMP_TABLE_GENERIC (versados),  BFD_JUMP_TABLE_COPY (_bfd_generic),  BFD_JUMP_TABLE_CORE (_bfd_nocore),  BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),  BFD_JUMP_TABLE_SYMBOLS (versados),  BFD_JUMP_TABLE_RELOCS (versados),  BFD_JUMP_TABLE_WRITE (versados),  BFD_JUMP_TABLE_LINK (versados),  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),  NULL,  (PTR) 0};

⌨️ 快捷键说明

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