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 + -
显示快捷键?