elf32-cris.c

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

C
713
字号
		   sym->st_value, rel->r_addend);#endif	}      else	{	  h = sym_hashes [r_symndx - symtab_hdr->sh_info];	  while (h->root.type == bfd_link_hash_indirect		 || h->root.type == bfd_link_hash_warning)	    h = (struct elf_link_hash_entry *) h->root.u.i.link;	  name = h->root.root.string;	  if (h->root.type == bfd_link_hash_defined	      || h->root.type == bfd_link_hash_defweak)	    {	      sec = h->root.u.def.section;	      relocation = (h->root.u.def.value			    + sec->output_section->vma			    + sec->output_offset);#if 0	      fprintf (stderr,		       "defined: sec: %s, name: %s, value: %x + %x + %x gives: %x\n",		       sec->name, name, h->root.u.def.value,		       sec->output_section->vma, sec->output_offset, relocation);#endif	    }	  else if (h->root.type == bfd_link_hash_undefweak)	    {#if 0	      fprintf (stderr, "undefined: sec: %s, name: %s\n",		       sec->name, name);#endif	      relocation = 0;	    }	  else if (info->shared		   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)	    relocation = 0;	  else	    {	      if (! ((*info->callbacks->undefined_symbol)		     (info, h->root.root.string, input_bfd,		      input_section, rel->r_offset, true)))		return false;#if 0	      fprintf (stderr, "unknown: name: %s\n", name);#endif	      relocation = 0;	    }	}      r = cris_final_link_relocate (howto, input_bfd, input_section,				     contents, rel, relocation);      if (r != bfd_reloc_ok)	{	  const char * msg = (const char *) NULL;	  switch (r)	    {	    case bfd_reloc_overflow:	      r = info->callbacks->reloc_overflow		(info, name, howto->name, (bfd_vma) 0,		 input_bfd, input_section, rel->r_offset);	      break;	    case bfd_reloc_undefined:	      r = info->callbacks->undefined_symbol		(info, name, input_bfd, input_section, rel->r_offset,		 true);	      break;	    case bfd_reloc_outofrange:	      msg = _("internal error: out of range error");	      break;	    case bfd_reloc_notsupported:	      msg = _("internal error: unsupported relocation error");	      break;	    case bfd_reloc_dangerous:	      msg = _("internal error: dangerous relocation");	      break;	    default:	      msg = _("internal error: unknown error");	      break;	    }	  if (msg)	    r = info->callbacks->warning	      (info, msg, name, input_bfd, input_section, rel->r_offset);	  if (! r)	    return false;	}    }  return true;}/* Return the section that should be marked against GC for a given   relocation.  */static asection *cris_elf_gc_mark_hook (abfd, info, rel, h, sym)     bfd *                        abfd;     struct bfd_link_info *       info ATTRIBUTE_UNUSED;     Elf_Internal_Rela *          rel;     struct elf_link_hash_entry * h;     Elf_Internal_Sym *           sym;{  if (h != NULL)    {      switch (ELF32_R_TYPE (rel->r_info))	{	case R_CRIS_GNU_VTINHERIT:	case R_CRIS_GNU_VTENTRY:	  break;	default:	  switch (h->root.type)	    {	    case bfd_link_hash_defined:	    case bfd_link_hash_defweak:	      return h->root.u.def.section;	    case bfd_link_hash_common:	      return h->root.u.c.p->section;	    default:	      break;	    }	}    }  else    {      if (!(elf_bad_symtab (abfd)	    && ELF_ST_BIND (sym->st_info) != STB_LOCAL)	  && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)		&& sym->st_shndx != SHN_COMMON))	{	  return bfd_section_from_elf_index (abfd, sym->st_shndx);	}    }  return NULL;}/* Update the got entry reference counts for the section being removed.  */static booleancris_elf_gc_sweep_hook (abfd, info, sec, relocs)     bfd *                     abfd ATTRIBUTE_UNUSED;     struct bfd_link_info *    info ATTRIBUTE_UNUSED;     asection *                sec ATTRIBUTE_UNUSED;     const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED;{  return true;}/* Look through the relocs for a section during the first phase.   Since we don't do .gots or .plts, we just need to consider the   virtual table relocs for gc.  */static booleancris_elf_check_relocs (abfd, info, sec, relocs)     bfd *abfd;     struct bfd_link_info *info;     asection *sec;     const Elf_Internal_Rela *relocs;{  Elf_Internal_Shdr *symtab_hdr;  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;  const Elf_Internal_Rela *rel;  const Elf_Internal_Rela *rel_end;  if (info->relocateable)    return true;  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;  sym_hashes = elf_sym_hashes (abfd);  sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);  if (!elf_bad_symtab (abfd))    sym_hashes_end -= symtab_hdr->sh_info;  rel_end = relocs + sec->reloc_count;  for (rel = relocs; rel < rel_end; rel++)    {      struct elf_link_hash_entry *h;      unsigned long r_symndx;      r_symndx = ELF32_R_SYM (rel->r_info);      if (r_symndx < symtab_hdr->sh_info)        h = NULL;      else        h = sym_hashes[r_symndx - symtab_hdr->sh_info];      switch (ELF32_R_TYPE (rel->r_info))        {        /* This relocation describes the C++ object vtable hierarchy.           Reconstruct it for later use during GC.  */        case R_CRIS_GNU_VTINHERIT:          if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))            return false;          break;        /* This relocation describes which C++ vtable entries are actually           used.  Record for later use during GC.  */        case R_CRIS_GNU_VTENTRY:          if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))            return false;          break;        }    }  return true;}/* Reject a file depending on underscores on symbols.  */static booleancris_elf_object_p (abfd)     bfd *abfd;{  if ((elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE))    return (bfd_get_symbol_leading_char (abfd) == '_');  else    return (bfd_get_symbol_leading_char (abfd) == 0);}/* Mark presence or absence of leading underscore.  */static voidcris_elf_final_write_processing (abfd, linker)     bfd *abfd;     boolean linker ATTRIBUTE_UNUSED;{  if (bfd_get_symbol_leading_char (abfd) == '_')    elf_elfheader (abfd)->e_flags |= EF_CRIS_UNDERSCORE;  else    elf_elfheader (abfd)->e_flags &= ~EF_CRIS_UNDERSCORE;}/* Display the flags field.  */static booleancris_elf_print_private_bfd_data (abfd, ptr)     bfd *abfd;     PTR ptr;{  FILE *file = (FILE *) ptr;  BFD_ASSERT (abfd != NULL && ptr != NULL)  _bfd_elf_print_private_bfd_data (abfd, ptr);  fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);  if (elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE)    fprintf (file, _(" [symbols have a _ prefix]"));  fputc ('\n', file);  return true;}/* Don't mix files with and without a leading underscore.  */static booleancris_elf_merge_private_bfd_data (ibfd, obfd)     bfd *ibfd;     bfd *obfd;{  flagword old_flags, new_flags;  if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)    return false;  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)    return true;  if (! elf_flags_init (obfd))    {      /* This happens when ld starts out with a 'blank' output file.  */      elf_flags_init (obfd) = true;      /* Set flags according to current bfd_target.  */      cris_elf_final_write_processing (obfd, false);    }  old_flags = elf_elfheader (obfd)->e_flags;  new_flags = elf_elfheader (ibfd)->e_flags;  /* Is this good or bad?  We'll follow with other excluding flags.  */  if ((old_flags & EF_CRIS_UNDERSCORE) != (new_flags & EF_CRIS_UNDERSCORE))    {      (*_bfd_error_handler)	((new_flags & EF_CRIS_UNDERSCORE)	 ? _("%s: uses _-prefixed symbols, but writing file with non-prefixed symbols")	 : _("%s: uses non-prefixed symbols, but writing file with _-prefixed symbols"),	 bfd_get_filename (ibfd));      bfd_set_error (bfd_error_bad_value);      return false;    }  return true;}#define ELF_ARCH		bfd_arch_cris#define ELF_MACHINE_CODE	EM_CRIS#define ELF_MAXPAGESIZE		0x2000#define TARGET_LITTLE_SYM	bfd_elf32_cris_vec#define TARGET_LITTLE_NAME	"elf32-cris"#define elf_symbol_leading_char 0#define elf_info_to_howto_rel			NULL#define elf_info_to_howto			cris_info_to_howto_rela#define elf_backend_relocate_section		cris_elf_relocate_section#define elf_backend_gc_mark_hook		cris_elf_gc_mark_hook#define elf_backend_gc_sweep_hook		cris_elf_gc_sweep_hook#define elf_backend_check_relocs                cris_elf_check_relocs#define elf_backend_can_gc_sections		1#define elf_backend_object_p			cris_elf_object_p#define elf_backend_final_write_processing \	cris_elf_final_write_processing#define bfd_elf32_bfd_print_private_bfd_data \	cris_elf_print_private_bfd_data#define bfd_elf32_bfd_merge_private_bfd_data \	cris_elf_merge_private_bfd_data#define bfd_elf32_bfd_reloc_type_lookup		cris_reloc_type_lookup/* Later, we my want to optimize RELA entries into REL entries for dynamic   linking and libraries (if it's a win of any significance).  Until then,   take the easy route.  */#define elf_backend_may_use_rel_p 0#define elf_backend_may_use_rela_p 1#include "elf32-target.h"#define INCLUDED_TARGET_FILE#undef TARGET_LITTLE_SYM#undef TARGET_LITTLE_NAME#undef elf_symbol_leading_char#define TARGET_LITTLE_SYM bfd_elf32_us_cris_vec#define TARGET_LITTLE_NAME "elf32-us-cris"#define elf_symbol_leading_char '_'#include "elf32-target.h"

⌨️ 快捷键说明

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