readelf.c

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

C
2,305
字号
	case DEC:#if BFD_HOST_64BIT_LONG	  printf ("%ld", vma);#else	  if (_bfd_int64_high (vma))	    /* ugg */	    printf ("++%ld", _bfd_int64_low (vma));	  else	    printf ("%ld", _bfd_int64_low (vma));#endif	  break;	case DEC_5:#if BFD_HOST_64BIT_LONG	  printf ("%5ld", vma);#else	  if (_bfd_int64_high (vma))	    /* ugg */	    printf ("++%ld", _bfd_int64_low (vma));	  else	    printf ("%5ld", _bfd_int64_low (vma));#endif	  break;	case UNSIGNED:#if BFD_HOST_64BIT_LONG	  printf ("%lu", vma);#else	  if (_bfd_int64_high (vma))	    /* ugg */	    printf ("++%lu", _bfd_int64_low (vma));	  else	    printf ("%lu", _bfd_int64_low (vma));#endif	  break;	}    }#endif}static bfd_vmabyte_get_big_endian (field, size)     unsigned char * field;     int             size;{  switch (size)    {    case 1:      return * field;    case 2:      return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);    case 4:      return ((unsigned long) (field [3]))	|   (((unsigned long) (field [2])) << 8)	|   (((unsigned long) (field [1])) << 16)	|   (((unsigned long) (field [0])) << 24);#ifndef BFD64    case 8:      /* Although we are extracing data from an 8 byte wide field, we	 are returning only 4 bytes of data.  */      return ((unsigned long) (field [7]))	|   (((unsigned long) (field [6])) << 8)	|   (((unsigned long) (field [5])) << 16)	|   (((unsigned long) (field [4])) << 24);#else    case 8:    case -8:      /* This is a special case, generated by the BYTE_GET8 macro.	 It means that we are loading an 8 byte value from a field	 in an external structure into an 8 byte value in a field	 in an internal strcuture.  */      return ((bfd_vma) (field [7]))	|   (((bfd_vma) (field [6])) << 8)	|   (((bfd_vma) (field [5])) << 16)	|   (((bfd_vma) (field [4])) << 24)	|   (((bfd_vma) (field [3])) << 32)	|   (((bfd_vma) (field [2])) << 40)	|   (((bfd_vma) (field [1])) << 48)	|   (((bfd_vma) (field [0])) << 56);#endif    default:      error (_("Unhandled data length: %d\n"), size);      abort ();    }}/* Guess the relocation size commonly used by the specific machines.  */static intguess_is_rela (e_machine)     unsigned long e_machine;{  switch (e_machine)    {      /* Targets that use REL relocations.  */    case EM_ARM:    case EM_386:    case EM_486:    case EM_960:    case EM_CYGNUS_M32R:    case EM_CYGNUS_D10V:    case EM_MIPS:    case EM_MIPS_RS3_LE:      return FALSE;      /* Targets that use RELA relocations.  */    case EM_68K:    case EM_SPARC32PLUS:    case EM_SPARCV9:    case EM_SPARC:    case EM_PPC:    case EM_CYGNUS_V850:    case EM_CYGNUS_D30V:    case EM_CYGNUS_MN10200:    case EM_CYGNUS_MN10300:    case EM_CYGNUS_FR30:    case EM_SH:    case EM_ALPHA:    case EM_MCORE:    case EM_IA_64:    case EM_AVR:    case EM_CRIS:    case EM_860:    case EM_X86_64:      return TRUE;    case EM_MMA:    case EM_PCP:    case EM_NCPU:    case EM_NDR1:    case EM_STARCORE:    case EM_ME16:    case EM_ST100:    case EM_TINYJ:    case EM_FX66:    case EM_ST9PLUS:    case EM_ST7:    case EM_68HC16:    case EM_68HC11:    case EM_68HC08:    case EM_68HC05:    case EM_SVX:    case EM_ST19:    case EM_VAX:    default:      warn (_("Don't know about relocations on this machine architecture\n"));      return FALSE;    }}static intslurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)     FILE *file;     unsigned long rel_offset;     unsigned long rel_size;     Elf_Internal_Rela **relasp;     unsigned long *nrelasp;{  Elf_Internal_Rela *relas;  unsigned long nrelas;  unsigned int i;  if (is_32bit_elf)    {      Elf32_External_Rela * erelas;      GET_DATA_ALLOC (rel_offset, rel_size, erelas,		      Elf32_External_Rela *, "relocs");      nrelas = rel_size / sizeof (Elf32_External_Rela);      relas = (Elf_Internal_Rela *)	malloc (nrelas * sizeof (Elf_Internal_Rela));      if (relas == NULL)	{	  error(_("out of memory parsing relocs"));	  return 0;	}      for (i = 0; i < nrelas; i++)	{	  relas[i].r_offset = BYTE_GET (erelas[i].r_offset);	  relas[i].r_info   = BYTE_GET (erelas[i].r_info);	  relas[i].r_addend = BYTE_GET (erelas[i].r_addend);	}      free (erelas);    }  else    {      Elf64_External_Rela * erelas;      GET_DATA_ALLOC (rel_offset, rel_size, erelas,		      Elf64_External_Rela *, "relocs");      nrelas = rel_size / sizeof (Elf64_External_Rela);      relas = (Elf_Internal_Rela *)	malloc (nrelas * sizeof (Elf_Internal_Rela));      if (relas == NULL)	{	  error(_("out of memory parsing relocs"));	  return 0;	}      for (i = 0; i < nrelas; i++)	{	  relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);	  relas[i].r_info   = BYTE_GET8 (erelas[i].r_info);	  relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);	}      free (erelas);    }  *relasp = relas;  *nrelasp = nrelas;  return 1;}static intslurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)     FILE *file;     unsigned long rel_offset;     unsigned long rel_size;     Elf_Internal_Rel **relsp;     unsigned long *nrelsp;{  Elf_Internal_Rel *rels;  unsigned long nrels;  unsigned int i;  if (is_32bit_elf)    {      Elf32_External_Rel * erels;      GET_DATA_ALLOC (rel_offset, rel_size, erels,		      Elf32_External_Rel *, "relocs");      nrels = rel_size / sizeof (Elf32_External_Rel);      rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));      if (rels == NULL)	{	  error(_("out of memory parsing relocs"));	  return 0;	}      for (i = 0; i < nrels; i++)	{	  rels[i].r_offset = BYTE_GET (erels[i].r_offset);	  rels[i].r_info   = BYTE_GET (erels[i].r_info);	}      free (erels);    }  else    {      Elf64_External_Rel * erels;      GET_DATA_ALLOC (rel_offset, rel_size, erels,		      Elf64_External_Rel *, "relocs");      nrels = rel_size / sizeof (Elf64_External_Rel);      rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));      if (rels == NULL)	{	  error(_("out of memory parsing relocs"));	  return 0;	}      for (i = 0; i < nrels; i++)	{	  rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);	  rels[i].r_info   = BYTE_GET8 (erels[i].r_info);	}      free (erels);    }  *relsp = rels;  *nrelsp = nrels;  return 1;}/* Display the contents of the relocation data found at the specified offset.  */static intdump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)     FILE *             file;     unsigned long      rel_offset;     unsigned long      rel_size;     Elf_Internal_Sym * symtab;     unsigned long      nsyms;     char *             strtab;     int                is_rela;{  unsigned int        i;  Elf_Internal_Rel *  rels;  Elf_Internal_Rela * relas;  if (is_rela == UNKNOWN)    is_rela = guess_is_rela (elf_header.e_machine);  if (is_rela)    {      if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))	return 0;    }  else    {      if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))	return 0;    }  if (is_rela)    printf      (_("  Offset    Info  Type            Symbol's Value  Symbol's Name          Addend\n"));  else    printf      (_("  Offset    Info  Type            Symbol's Value  Symbol's Name\n"));  for (i = 0; i < rel_size; i++)    {      const char * rtype;      bfd_vma      offset;      bfd_vma      info;      bfd_vma      symtab_index;      bfd_vma      type;      if (is_rela)	{	  offset = relas [i].r_offset;	  info   = relas [i].r_info;	}      else	{	  offset = rels [i].r_offset;	  info   = rels [i].r_info;	}      if (is_32bit_elf)	{	  type         = ELF32_R_TYPE (info);	  symtab_index = ELF32_R_SYM  (info);	}      else	{	  if (elf_header.e_machine == EM_SPARCV9)	    type       = ELF64_R_TYPE_ID (info);	  else	    type       = ELF64_R_TYPE (info);	  /* The #ifdef BFD64 below is to prevent a compile time warning.	     We know that if we do not have a 64 bit data type that we	     will never execute this code anyway.  */#ifdef BFD64	  symtab_index = ELF64_R_SYM  (info);#endif	}#ifdef _bfd_int64_low      printf ("  %8.8lx  %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));#else      printf ("  %8.8lx  %5.5lx ", offset, info);#endif      switch (elf_header.e_machine)	{	default:	  rtype = NULL;	  break;	case EM_CYGNUS_M32R:	  rtype = elf_m32r_reloc_type (type);	  break;	case EM_386:	case EM_486:	  rtype = elf_i386_reloc_type (type);	  break;	case EM_68K:	  rtype = elf_m68k_reloc_type (type);	  break;	case EM_960:	  rtype = elf_i960_reloc_type (type);	  break;	case EM_AVR:	  rtype = elf_avr_reloc_type (type);	  break;	case EM_OLD_SPARCV9:	case EM_SPARC32PLUS:	case EM_SPARCV9:	case EM_SPARC:	  rtype = elf_sparc_reloc_type (type);	  break;	case EM_CYGNUS_V850:	  rtype = v850_reloc_type (type);	  break;	case EM_CYGNUS_D10V:	  rtype = elf_d10v_reloc_type (type);	  break;	case EM_CYGNUS_D30V:	  rtype = elf_d30v_reloc_type (type);	  break;	case EM_SH:	  rtype = elf_sh_reloc_type (type);	  break;	case EM_CYGNUS_MN10300:	  rtype = elf_mn10300_reloc_type (type);	  break;	case EM_CYGNUS_MN10200:	  rtype = elf_mn10200_reloc_type (type);	  break;	case EM_CYGNUS_FR30:	  rtype = elf_fr30_reloc_type (type);	  break;	case EM_MCORE:	  rtype = elf_mcore_reloc_type (type);	  break;	case EM_PPC:	  rtype = elf_ppc_reloc_type (type);	  break;	case EM_MIPS:	case EM_MIPS_RS3_LE:	  rtype = elf_mips_reloc_type (type);	  break;	case EM_ALPHA:	  rtype = elf_alpha_reloc_type (type);	  break;	case EM_ARM:	  rtype = elf_arm_reloc_type (type);	  break;	case EM_CYGNUS_ARC:	case EM_ARC:	  rtype = elf_arc_reloc_type (type);	  break;

⌨️ 快捷键说明

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