elf32-d10v.c

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

C
523
字号
       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;}static booleanelf32_d10v_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;{  /* we don't use got and plt entries for d10v */  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 booleanelf32_d10v_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_D10V_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_D10V_GNU_VTENTRY:          if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))            return false;          break;        }    }  return true;}/* Relocate a D10V ELF section.  */static booleanelf32_d10v_relocate_section (output_bfd, info, input_bfd, input_section,			    contents, relocs, local_syms, local_sections)     bfd *output_bfd ATTRIBUTE_UNUSED;     struct bfd_link_info *info;     bfd *input_bfd;     asection *input_section;     bfd_byte *contents;     Elf_Internal_Rela *relocs;     Elf_Internal_Sym *local_syms;     asection **local_sections;{  Elf_Internal_Shdr *symtab_hdr;  struct elf_link_hash_entry **sym_hashes;  Elf_Internal_Rela *rel, *relend;  const char *name;  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;  sym_hashes = elf_sym_hashes (input_bfd);  rel = relocs;  relend = relocs + input_section->reloc_count;  for (; rel < relend; rel++)    {      int r_type;      reloc_howto_type *howto;      unsigned long r_symndx;      Elf_Internal_Sym *sym;      asection *sec;      struct elf_link_hash_entry *h;      bfd_vma relocation;      bfd_reloc_status_type r;      r_symndx = ELF32_R_SYM (rel->r_info);      r_type = ELF32_R_TYPE (rel->r_info);      if (r_type == R_D10V_GNU_VTENTRY          || r_type == R_D10V_GNU_VTINHERIT )        continue;      howto = elf_d10v_howto_table + r_type;      if (info->relocateable)	{	  /* This is a relocateable link.  We don't have to change	     anything, unless the reloc is against a section symbol,	     in which case we have to adjust according to where the	     section symbol winds up in the output section.  */	  if (r_symndx < symtab_hdr->sh_info)	    {	      sym = local_syms + r_symndx;	      if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)		{		  sec = local_sections[r_symndx];		  rel->r_addend += sec->output_offset + sym->st_value;		}	    }	  continue;	}      /* This is a final link.  */      h = NULL;      sym = NULL;      sec = NULL;      if (r_symndx < symtab_hdr->sh_info)	{	  sym = local_syms + r_symndx;	  sec = local_sections[r_symndx];	  relocation = (sec->output_section->vma			+ sec->output_offset			+ sym->st_value);	}      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;	  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);	    }	  else if (h->root.type == bfd_link_hash_undefweak)	    relocation = 0;	  else	    {	      if (!((*info->callbacks->undefined_symbol)		    (info, h->root.root.string, input_bfd,		     input_section, rel->r_offset, true)))		return false;	      relocation = 0;	    }	}      if (h != NULL)	name = h->root.root.string;      else	{	  name = (bfd_elf_string_from_elf_section		  (input_bfd, symtab_hdr->sh_link, sym->st_name));	  if (name == NULL || *name == '\0')	    name = bfd_section_name (input_bfd, sec);	}      r = _bfd_final_link_relocate (howto, input_bfd, input_section,                                    contents, rel->r_offset,                                    relocation, rel->r_addend);      if (r != bfd_reloc_ok)	{	  const char * msg = (const char *) 0;	  switch (r)	    {	    case bfd_reloc_overflow:	      if (!((*info->callbacks->reloc_overflow)		    (info, name, howto->name, (bfd_vma) 0,		     input_bfd, input_section, rel->r_offset)))		return false;	      break;	    case bfd_reloc_undefined:	      if (!((*info->callbacks->undefined_symbol)		    (info, name, input_bfd, input_section,		     rel->r_offset, true)))		return false;	      break;	    case bfd_reloc_outofrange:	      msg = _ ("internal error: out of range error");	      goto common_error;	    case bfd_reloc_notsupported:	      msg = _ ("internal error: unsupported relocation error");	      goto common_error;	    case bfd_reloc_dangerous:	      msg = _ ("internal error: dangerous error");	      goto common_error;	    default:	      msg = _ ("internal error: unknown error");	      /* fall through */	    common_error:	      if (!((*info->callbacks->warning)		    (info, msg, name, input_bfd, input_section,		     rel->r_offset)))		return false;	      break;	    }	}    }  return true;}#define ELF_ARCH		bfd_arch_d10v#define ELF_MACHINE_CODE	EM_CYGNUS_D10V#define ELF_MAXPAGESIZE		0x1000#define TARGET_BIG_SYM          bfd_elf32_d10v_vec#define TARGET_BIG_NAME		"elf32-d10v"#define elf_info_to_howto	             0#define elf_info_to_howto_rel	             d10v_info_to_howto_rel#define elf_backend_object_p	             0#define elf_backend_final_write_processing   0#define elf_backend_gc_mark_hook             elf32_d10v_gc_mark_hook#define elf_backend_gc_sweep_hook            elf32_d10v_gc_sweep_hook#define elf_backend_check_relocs             elf32_d10v_check_relocs#define elf_backend_relocate_section         elf32_d10v_relocate_section#define elf_backend_can_gc_sections          1#include "elf32-target.h"

⌨️ 快捷键说明

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