coff-i960.c

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

C
666
字号
  if (esym == NULL)    return false;  if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)    return false;  for (o = abfd->sections; o != NULL; o = o->next)    {      struct internal_syment isym;      strncpy (isym._n._n_name, o->name, SYMNMLEN);      isym.n_value = 0;      isym.n_scnum = o->target_index;      isym.n_type = T_NULL;      isym.n_sclass = C_STAT;      isym.n_numaux = 0;      bfd_coff_swap_sym_out (abfd, (PTR) &isym, (PTR) esym);      if (bfd_write (esym, symesz, 1, abfd) != symesz)	{	  free (esym);	  return false;	}      obj_raw_syment_count (abfd) += 1;    }  free (esym);  return true;}/* The reloc processing routine for the optimized COFF linker.  */static booleancoff_i960_relocate_section (output_bfd, info, input_bfd, input_section,			    contents, relocs, syms, sections)     bfd *output_bfd ATTRIBUTE_UNUSED;     struct bfd_link_info *info;     bfd *input_bfd;     asection *input_section;     bfd_byte *contents;     struct internal_reloc *relocs;     struct internal_syment *syms;     asection **sections;{  struct internal_reloc *rel;  struct internal_reloc *relend;  rel = relocs;  relend = rel + input_section->reloc_count;  for (; rel < relend; rel++)    {      long symndx;      struct coff_link_hash_entry *h;      struct internal_syment *sym;      bfd_vma addend;      bfd_vma val;      reloc_howto_type *howto;      bfd_reloc_status_type rstat = bfd_reloc_ok;      boolean done;      symndx = rel->r_symndx;      if (symndx == -1)	{	  h = NULL;	  sym = NULL;	}      else	{	  h = obj_coff_sym_hashes (input_bfd)[symndx];	  sym = syms + symndx;	}      if (sym != NULL && sym->n_scnum != 0)	addend = - sym->n_value;      else	addend = 0;      switch (rel->r_type)	{	case 17: howto = &howto_rellong; break;	case 25: howto = &howto_iprmed; break;	case 27: howto = &howto_optcall; break;	default:	  bfd_set_error (bfd_error_bad_value);	  return false;	}      val = 0;      if (h == NULL)	{	  asection *sec;	  if (symndx == -1)	    {	      sec = bfd_abs_section_ptr;	      val = 0;	    }	  else	    {	      sec = sections[symndx];              val = (sec->output_section->vma		     + sec->output_offset		     + sym->n_value		     - sec->vma);	    }	}      else	{	  if (h->root.type == bfd_link_hash_defined	      || h->root.type == bfd_link_hash_defweak)	    {	      asection *sec;	      sec = h->root.u.def.section;	      val = (h->root.u.def.value		     + sec->output_section->vma		     + sec->output_offset);	    }	  else if (! info->relocateable)	    {	      if (! ((*info->callbacks->undefined_symbol)		     (info, h->root.root.string, input_bfd, input_section,		      rel->r_vaddr - input_section->vma, true)))		return false;	    }	}      done = false;      if (howto->type == R_OPTCALL && ! info->relocateable && symndx != -1)	{	  int class;	  if (h != NULL)	    class = h->class;	  else	    class = sym->n_sclass;	  switch (class)	    {	    case C_NULL:	      /* This symbol is apparently not from a COFF input file.                 We warn, and then assume that it is not a leaf                 function.  */	      if (! ((*info->callbacks->reloc_dangerous)		     (info,		      _("uncertain calling convention for non-COFF symbol"),		      input_bfd, input_section,		      rel->r_vaddr - input_section->vma)))		return false;	      break;	    case C_LEAFSTAT:	    case C_LEAFEXT:	      /* This is a call to a leaf procedure; use the bal                 instruction.  */	      {		long olf;		unsigned long word;		if (h != NULL)		  {		    BFD_ASSERT (h->numaux == 2);		    olf = h->aux[1].x_bal.x_balntry;		  }		else		  {		    bfd_byte *esyms;		    union internal_auxent aux;		    BFD_ASSERT (sym->n_numaux == 2);		    esyms = (bfd_byte *) obj_coff_external_syms (input_bfd);		    esyms += (symndx + 2) * bfd_coff_symesz (input_bfd);		    bfd_coff_swap_aux_in (input_bfd, (PTR) esyms, sym->n_type,					  sym->n_sclass, 1, sym->n_numaux,					  (PTR) &aux);		    olf = aux.x_bal.x_balntry;		  }		word = bfd_get_32 (input_bfd,				   (contents				    + (rel->r_vaddr - input_section->vma)));		word = ((word + olf - val) & BAL_MASK) | BAL;		bfd_put_32 (input_bfd,			    word,			    (contents			     + (rel->r_vaddr - input_section->vma)));		done = true;	      }	      break;	    case C_SCALL:	      BFD_ASSERT (0);	      break;	    }	}      if (! done)	{	  if (howto->pc_relative)	    addend += input_section->vma;	  rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,					    contents,					    rel->r_vaddr - input_section->vma,					    val, addend);	}      switch (rstat)	{	default:	  abort ();	case bfd_reloc_ok:	  break;	case bfd_reloc_overflow:	  {	    const char *name;	    char buf[SYMNMLEN + 1];	    if (symndx == -1)	      name = "*ABS*";	    else if (h != NULL)	      name = h->root.root.string;	    else	      {		name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);		if (name == NULL)		  return false;	      }	    if (! ((*info->callbacks->reloc_overflow)		   (info, name, howto->name, (bfd_vma) 0, input_bfd,		    input_section, rel->r_vaddr - input_section->vma)))	      return false;	  }	}    }  return true;}/* Adjust the symbol index of any reloc against a global symbol to   instead be a reloc against the internal symbol we created specially   for the section.  */static booleancoff_i960_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp)     bfd *obfd ATTRIBUTE_UNUSED;     struct bfd_link_info *info ATTRIBUTE_UNUSED;     bfd *ibfd;     asection *sec ATTRIBUTE_UNUSED;     struct internal_reloc *irel;     boolean *adjustedp;{  struct coff_link_hash_entry *h;  *adjustedp = false;  h = obj_coff_sym_hashes (ibfd)[irel->r_symndx];  if (h == NULL      || (h->root.type != bfd_link_hash_defined	  && h->root.type != bfd_link_hash_defweak))    return true;  irel->r_symndx = h->root.u.def.section->output_section->target_index - 1;  *adjustedp = true;  return true;}#define coff_bfd_is_local_label_name coff_i960_is_local_label_name#define coff_start_final_link coff_i960_start_final_link#define coff_relocate_section coff_i960_relocate_section#define coff_adjust_symndx coff_i960_adjust_symndx#define coff_bfd_reloc_type_lookup coff_i960_reloc_type_lookup#include "coffcode.h"extern const bfd_target icoff_big_vec;CREATE_LITTLE_COFF_TARGET_VEC (icoff_little_vec, "coff-Intel-little", 0, 0, '_', & icoff_big_vec)const bfd_target icoff_big_vec ={  "coff-Intel-big",		/* name */  bfd_target_coff_flavour,  BFD_ENDIAN_LITTLE,		/* data byte order is little */  BFD_ENDIAN_BIG,		/* header byte order is big */  (HAS_RELOC | EXEC_P |		/* object flags */   HAS_LINENO | HAS_DEBUG |   HAS_SYMS | HAS_LOCALS | WP_TEXT),  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */  '_',				/* leading underscore */  '/',				/* ar_pad_char */  15,				/* ar_max_namelen */bfd_getl64, bfd_getl_signed_64, bfd_putl64,     bfd_getl32, bfd_getl_signed_32, bfd_putl32,     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* 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, coff_object_p, /* bfd_check_format */     bfd_generic_archive_p, _bfd_dummy_target},  {bfd_false, coff_mkobject,	/* bfd_set_format */     _bfd_generic_mkarchive, bfd_false},  {bfd_false, coff_write_object_contents,	/* bfd_write_contents */     _bfd_write_archive_contents, bfd_false},     BFD_JUMP_TABLE_GENERIC (coff),     BFD_JUMP_TABLE_COPY (coff),     BFD_JUMP_TABLE_CORE (_bfd_nocore),     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),     BFD_JUMP_TABLE_SYMBOLS (coff),     BFD_JUMP_TABLE_RELOCS (coff),     BFD_JUMP_TABLE_WRITE (coff),     BFD_JUMP_TABLE_LINK (coff),     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),  & icoff_little_vec,  COFF_SWAP_TABLE};

⌨️ 快捷键说明

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