#------------------------------------------------------------------------------- # elftools: elf/descriptions.py # # Textual descriptions of the various enums and flags of ELF # # Eli Bendersky (eliben@gmail.com) # This code is in the public domain #------------------------------------------------------------------------------- from .enums import ENUM_E_VERSION, ENUM_RELOC_TYPE_i386, ENUM_RELOC_TYPE_x64 from .constants import P_FLAGS, SH_FLAGS from ..common.py3compat import iteritems def describe_ei_class(x): return _DESCR_EI_CLASS.get(x, _unknown) def describe_ei_data(x): return _DESCR_EI_DATA.get(x, _unknown) def describe_ei_version(x): s = '%d' % ENUM_E_VERSION[x] if x == 'EV_CURRENT': s += ' (current)' return s def describe_ei_osabi(x): return _DESCR_EI_OSABI.get(x, _unknown) def describe_e_type(x): return _DESCR_E_TYPE.get(x, _unknown) def describe_e_machine(x): return _DESCR_E_MACHINE.get(x, _unknown) def describe_e_version_numeric(x): return '0x%x' % ENUM_E_VERSION[x] def describe_p_type(x): return _DESCR_P_TYPE.get(x, _unknown) def describe_p_flags(x): s = '' for flag in (P_FLAGS.PF_R, P_FLAGS.PF_W, P_FLAGS.PF_X): s += _DESCR_P_FLAGS[flag] if (x & flag) else ' ' return s def describe_sh_type(x): return _DESCR_SH_TYPE.get(x, _unknown) def describe_sh_flags(x): s = '' for flag in ( SH_FLAGS.SHF_WRITE, SH_FLAGS.SHF_ALLOC, SH_FLAGS.SHF_EXECINSTR, SH_FLAGS.SHF_MERGE, SH_FLAGS.SHF_STRINGS, SH_FLAGS.SHF_INFO_LINK, SH_FLAGS.SHF_LINK_ORDER, SH_FLAGS.SHF_OS_NONCONFORMING, SH_FLAGS.SHF_GROUP, SH_FLAGS.SHF_TLS, SH_FLAGS.SHF_EXCLUDE): s += _DESCR_SH_FLAGS[flag] if (x & flag) else '' return s def describe_symbol_type(x): return _DESCR_ST_INFO_TYPE.get(x, _unknown) def describe_symbol_bind(x): return _DESCR_ST_INFO_BIND.get(x, _unknown) def describe_symbol_visibility(x): return _DESCR_ST_VISIBILITY.get(x, _unknown) def describe_symbol_shndx(x): return _DESCR_ST_SHNDX.get(x, '%3s' % x) def describe_reloc_type(x, elffile): arch = elffile.get_machine_arch() if arch == 'x86': return _DESCR_RELOC_TYPE_i386.get(x, _unknown) elif arch == 'x64': return _DESCR_RELOC_TYPE_x64.get(x, _unknown) else: return 'unrecognized: %-7x' % (x & 0xFFFFFFFF) #------------------------------------------------------------------------------- _unknown = '' _DESCR_EI_CLASS = dict( ELFCLASSNONE='none', ELFCLASS32='ELF32', ELFCLASS64='ELF64', ) _DESCR_EI_DATA = dict( ELFDATANONE='none', ELFDATA2LSB="2's complement, little endian", ELFDATA2MSB="2's complement, big endian", ) _DESCR_EI_OSABI = dict( ELFOSABI_SYSV='UNIX - System V', ELFOSABI_HPUX='UNIX - HP-UX', ELFOSABI_NETBSD='UNIX - NetBSD', ELFOSABI_LINUX='UNIX - Linux', ELFOSABI_HURD='UNIX - GNU/Hurd', ELFOSABI_SOLARIS='UNIX - Solaris', ELFOSABI_AIX='UNIX - AIX', ELFOSABI_IRIX='UNIX - IRIX', ELFOSABI_FREEBSD='UNIX - FreeBSD', ELFOSABI_TRU64='UNIX - TRU64', ELFOSABI_MODESTO='Novell - Modesto', ELFOSABI_OPENBSD='UNIX - OpenBSD', ELFOSABI_OPENVMS='VMS - OpenVMS', ELFOSABI_NSK='HP - Non-Stop Kernel', ELFOSABI_AROS='AROS', ELFOSABI_ARM='ARM', ELFOSABI_STANDALONE='Standalone App', ) _DESCR_E_TYPE = dict( ET_NONE='NONE (None)', ET_REL='REL (Relocatable file)', ET_EXEC='EXEC (Executable file)', ET_DYN='DYN (Shared object file)', ET_CORE='CORE (Core file)', PROC_SPECIFIC='Processor Specific', ) _DESCR_E_MACHINE = dict( EM_NONE='None', EM_M32='WE32100', EM_SPARC='Sparc', EM_386='Intel 80386', EM_68K='MC68000', EM_88K='MC88000', EM_860='Intel 80860', EM_MIPS='MIPS R3000', EM_S370='IBM System/370', EM_MIPS_RS4_BE='MIPS 4000 big-endian', EM_IA_64='Intel IA-64', EM_X86_64='Advanced Micro Devices X86-64', EM_AVR='Atmel AVR 8-bit microcontroller', RESERVED='RESERVED', ) _DESCR_P_TYPE = dict( PT_NULL='NULL', PT_LOAD='LOAD', PT_DYNAMIC='DYNAMIC', PT_INTERP='INTERP', PT_NOTE='NOTE', PT_SHLIB='SHLIB', PT_PHDR='PHDR', PT_GNU_EH_FRAME='GNU_EH_FRAME', PT_GNU_STACK='GNU_STACK', PT_GNU_RELRO='GNU_RELRO', ) _DESCR_P_FLAGS = { P_FLAGS.PF_X: 'E', P_FLAGS.PF_R: 'R', P_FLAGS.PF_W: 'W', } _DESCR_SH_TYPE = dict( SHT_NULL='NULL', SHT_PROGBITS='PROGBITS', SHT_SYMTAB='SYMTAB', SHT_STRTAB='STRTAB', SHT_RELA='RELA', SHT_HASH='HASH', SHT_DYNAMIC='DYNAMIC', SHT_NOTE='NOTE', SHT_NOBITS='NOBITS', SHT_REL='REL', SHT_SHLIB='SHLIB', SHT_DYNSYM='DYNSYM', SHT_INIT_ARRAY='INIT_ARRAY', SHT_FINI_ARRAY='FINI_ARRAY', SHT_PREINIT_ARRAY='PREINIT_ARRAY', SHT_GNU_HASH='GNU_HASH', SHT_GROUP='GROUP', SHT_SYMTAB_SHNDX='SYMTAB SECTION INDICIES', SHT_GNU_verdef='VERDEF', SHT_GNU_verneed='VERNEED', SHT_GNU_versym='VERSYM', SHT_GNU_LIBLIST='GNU_LIBLIST', ) _DESCR_SH_FLAGS = { SH_FLAGS.SHF_WRITE: 'W', SH_FLAGS.SHF_ALLOC: 'A', SH_FLAGS.SHF_EXECINSTR: 'X', SH_FLAGS.SHF_MERGE: 'M', SH_FLAGS.SHF_STRINGS: 'S', SH_FLAGS.SHF_INFO_LINK: 'I', SH_FLAGS.SHF_LINK_ORDER: 'L', SH_FLAGS.SHF_OS_NONCONFORMING: 'O', SH_FLAGS.SHF_GROUP: 'G', SH_FLAGS.SHF_TLS: 'T', SH_FLAGS.SHF_EXCLUDE: 'E', } _DESCR_ST_INFO_TYPE = dict( STT_NOTYPE='NOTYPE', STT_OBJECT='OBJECT', STT_FUNC='FUNC', STT_SECTION='SECTION', STT_FILE='FILE', STT_COMMON='COMMON', STT_TLS='TLS', STT_NUM='NUM', STT_RELC='RELC', STT_SRELC='SRELC', ) _DESCR_ST_INFO_BIND = dict( STB_LOCAL='LOCAL', STB_GLOBAL='GLOBAL', STB_WEAK='WEAK', ) _DESCR_ST_VISIBILITY = dict( STV_DEFAULT='DEFAULT', STV_INTERNAL='INTERNAL', STV_HIDDEN='HIDDEN', STD_PROTECTED='PROTECTED', ) _DESCR_ST_SHNDX = dict( SHN_UNDEF='UND', SHN_ABS='ABS', SHN_COMMON='COM', ) _DESCR_RELOC_TYPE_i386 = dict( (v, k) for k, v in iteritems(ENUM_RELOC_TYPE_i386)) _DESCR_RELOC_TYPE_x64 = dict( (v, k) for k, v in iteritems(ENUM_RELOC_TYPE_x64))