| #------------------------------------------------------------------------------- |
| # 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_D_TAG, ENUM_E_VERSION, ENUM_P_TYPE_BASE, ENUM_SH_TYPE_BASE, |
| ENUM_RELOC_TYPE_i386, ENUM_RELOC_TYPE_x64, |
| ENUM_RELOC_TYPE_ARM, ENUM_RELOC_TYPE_AARCH64, ENUM_RELOC_TYPE_MIPS, |
| ENUM_ATTR_TAG_ARM) |
| from .constants import P_FLAGS, SH_FLAGS, SUNW_SYMINFO_FLAGS, VER_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): |
| if x in _DESCR_P_TYPE: |
| return _DESCR_P_TYPE.get(x) |
| elif x >= ENUM_P_TYPE_BASE['PT_LOOS'] and x <= ENUM_P_TYPE_BASE['PT_HIOS']: |
| return 'LOOS+%lx' % (x - ENUM_P_TYPE_BASE['PT_LOOS']) |
| else: |
| return _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): |
| if x in _DESCR_SH_TYPE: |
| return _DESCR_SH_TYPE.get(x) |
| elif (x >= ENUM_SH_TYPE_BASE['SHT_LOOS'] and |
| x < ENUM_SH_TYPE_BASE['SHT_GNU_versym']): |
| return 'loos+%lx' % (x - ENUM_SH_TYPE_BASE['SHT_LOOS']) |
| else: |
| return _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) |
| elif arch == 'ARM': |
| return _DESCR_RELOC_TYPE_ARM.get(x, _unknown) |
| elif arch == 'AArch64': |
| return _DESCR_RELOC_TYPE_AARCH64.get(x, _unknown) |
| elif arch == 'MIPS': |
| return _DESCR_RELOC_TYPE_MIPS.get(x, _unknown) |
| else: |
| return 'unrecognized: %-7x' % (x & 0xFFFFFFFF) |
| |
| |
| def describe_dyn_tag(x): |
| return _DESCR_D_TAG.get(x, _unknown) |
| |
| |
| def describe_syminfo_flags(x): |
| return ''.join(_DESCR_SYMINFO_FLAGS[flag] for flag in ( |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_CAP, |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECT, |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_FILTER, |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_AUXILIARY, |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECTBIND, |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_COPY, |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_LAZYLOAD, |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_NOEXTDIRECT, |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_INTERPOSE, |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DEFERRED) if x & flag) |
| |
| |
| def describe_symbol_boundto(x): |
| return _DESCR_SYMINFO_BOUNDTO.get(x, '%3s' % x) |
| |
| |
| def describe_ver_flags(x): |
| return ' | '.join(_DESCR_VER_FLAGS[flag] for flag in ( |
| VER_FLAGS.VER_FLG_WEAK, |
| VER_FLAGS.VER_FLG_BASE, |
| VER_FLAGS.VER_FLG_INFO) if x & flag) |
| |
| |
| def describe_note(x): |
| n_desc = x['n_desc'] |
| desc = '' |
| if x['n_type'] == 'NT_GNU_ABI_TAG': |
| desc = '\n OS: %s, ABI: %d.%d.%d' % ( |
| _DESCR_NOTE_ABI_TAG_OS.get(n_desc['abi_os'], _unknown), |
| n_desc['abi_major'], n_desc['abi_minor'], n_desc['abi_tiny']) |
| elif x['n_type'] == 'NT_GNU_BUILD_ID': |
| desc = '\n Build ID: %s' % (n_desc) |
| else: |
| desc = '\n description data: {}'.format(' '.join( |
| '{:02x}'.format(ord(byte)) for byte in n_desc |
| )) |
| |
| note_type = (x['n_type'] if isinstance(x['n_type'], str) |
| else 'Unknown note type:') |
| note_type_desc = ('0x%.8x' % x['n_type'] |
| if isinstance(x['n_type'], int) else |
| _DESCR_NOTE_N_TYPE.get(x['n_type'], _unknown)) |
| return '%s (%s)%s' % (note_type, note_type_desc, desc) |
| |
| |
| def describe_attr_tag_arm(tag, val, extra): |
| idx = ENUM_ATTR_TAG_ARM[tag] - 1 |
| d_entry = _DESCR_ATTR_VAL_ARM[idx] |
| |
| if d_entry is None: |
| if tag == 'TAG_COMPATIBILITY': |
| return (_DESCR_ATTR_TAG_ARM[tag] |
| + 'flag = %d, vendor = %s' % (val, extra)) |
| |
| elif tag == 'TAG_ALSO_COMPATIBLE_WITH': |
| if val.tag == 'TAG_CPU_ARCH': |
| return _DESCR_ATTR_TAG_ARM[tag] + d_entry[val] |
| |
| else: |
| return _DESCR_ATTR_TAG_ARM[tag] + '??? (%d)' % val.tag |
| |
| elif tag == 'TAG_NODEFAULTS': |
| return _DESCR_ATTR_TAG_ARM[tag] + 'True' |
| |
| s = _DESCR_ATTR_TAG_ARM[tag] |
| s += '"%s"' % val if val else '' |
| return s |
| |
| else: |
| return _DESCR_ATTR_TAG_ARM[tag] + d_entry[val] |
| |
| |
| #------------------------------------------------------------------------------- |
| _unknown = '<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_FENIXOS='Fenix OS', |
| ELFOSABI_CLOUD='Nuxi - CloudABI', |
| ELFOSABI_SORTIX='Sortix', |
| ELFOSABI_ARM_AEABI='ARM - EABI', |
| ELFOSABI_ARM='ARM - ABI', |
| 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', |
| EM_ARM='ARM', |
| EM_AARCH64='AArch64', |
| EM_BLACKFIN='Analog Devices Blackfin', |
| EM_PPC='PowerPC', |
| 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', |
| PT_ARM_ARCHEXT='ARM_ARCHEXT', |
| PT_ARM_EXIDX='EXIDX', # binutils calls this EXIDX, not ARM_EXIDX |
| PT_AARCH64_ARCHEXT='AARCH64_ARCHEXT', |
| PT_AARCH64_UNWIND='AARCH64_UNWIND', |
| PT_TLS='TLS', |
| PT_MIPS_ABIFLAGS='ABIFLAGS' |
| ) |
| |
| |
| _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_ATTRIBUTES='GNU_ATTRIBUTES', |
| 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', |
| SHT_ARM_EXIDX='ARM_EXIDX', |
| SHT_ARM_PREEMPTMAP='ARM_PREEMPTMAP', |
| SHT_ARM_ATTRIBUTES='ARM_ATTRIBUTES', |
| SHT_ARM_DEBUGOVERLAY='ARM_DEBUGOVERLAY', |
| SHT_MIPS_LIBLIST='MIPS_LIBLIST', |
| SHT_MIPS_DEBUG='MIPS_DEBUG', |
| SHT_MIPS_REGINFO='MIPS_REGINFO', |
| SHT_MIPS_PACKAGE='MIPS_PACKAGE', |
| SHT_MIPS_PACKSYM='MIPS_PACKSYM', |
| SHT_MIPS_RELD='MIPS_RELD', |
| SHT_MIPS_IFACE='MIPS_IFACE', |
| SHT_MIPS_CONTENT='MIPS_CONTENT', |
| SHT_MIPS_OPTIONS='MIPS_OPTIONS', |
| SHT_MIPS_SHDR='MIPS_SHDR', |
| SHT_MIPS_FDESC='MIPS_FDESC', |
| SHT_MIPS_EXTSYM='MIPS_EXTSYM', |
| SHT_MIPS_DENSE='MIPS_DENSE', |
| SHT_MIPS_PDESC='MIPS_PDESC', |
| SHT_MIPS_LOCSYM='MIPS_LOCSYM', |
| SHT_MIPS_AUXSYM='MIPS_AUXSYM', |
| SHT_MIPS_OPTSYM='MIPS_OPTSYM', |
| SHT_MIPS_LOCSTR='MIPS_LOCSTR', |
| SHT_MIPS_LINE='MIPS_LINE', |
| SHT_MIPS_RFDESC='MIPS_RFDESC', |
| SHT_MIPS_DELTASYM='MIPS_DELTASYM', |
| SHT_MIPS_DELTAINST='MIPS_DELTAINST', |
| SHT_MIPS_DELTACLASS='MIPS_DELTACLASS', |
| SHT_MIPS_DWARF='MIPS_DWARF', |
| SHT_MIPS_DELTADECL='MIPS_DELTADECL', |
| SHT_MIPS_SYMBOL_LIB='MIPS_SYMBOL_LIB', |
| SHT_MIPS_EVENTS='MIPS_EVENTS', |
| SHT_MIPS_TRANSLATE='MIPS_TRANSLATE', |
| SHT_MIPS_PIXIE='MIPS_PIXIE', |
| SHT_MIPS_XLATE='MIPS_XLATE', |
| SHT_MIPS_XLATE_DEBUG='MIPS_XLATE_DEBUG', |
| SHT_MIPS_WHIRL='MIPS_WHIRL', |
| SHT_MIPS_EH_REGION='MIPS_EH_REGION', |
| SHT_MIPS_XLATE_OLD='MIPS_XLATE_OLD', |
| SHT_MIPS_PDR_EXCEPTION='MIPS_PDR_EXCEPTION', |
| ) |
| |
| |
| _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', |
| STV_PROTECTED='PROTECTED', |
| STV_EXPORTED='EXPORTED', |
| STV_SINGLETON='SINGLETON', |
| STV_ELIMINATE='ELIMINATE', |
| ) |
| |
| |
| _DESCR_ST_SHNDX = dict( |
| SHN_UNDEF='UND', |
| SHN_ABS='ABS', |
| SHN_COMMON='COM', |
| ) |
| |
| |
| _DESCR_SYMINFO_FLAGS = { |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECT: 'D', |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECTBIND: 'B', |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_COPY: 'C', |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_LAZYLOAD: 'L', |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_NOEXTDIRECT: 'N', |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_AUXILIARY: 'A', |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_FILTER: 'F', |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_INTERPOSE: 'I', |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_CAP: 'S', |
| SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DEFERRED: 'P', |
| } |
| |
| |
| _DESCR_SYMINFO_BOUNDTO = dict( |
| SYMINFO_BT_SELF='<self>', |
| SYMINFO_BT_PARENT='<parent>', |
| SYMINFO_BT_NONE='', |
| SYMINFO_BT_EXTERN='<extern>', |
| ) |
| |
| |
| _DESCR_VER_FLAGS = { |
| 0: '', |
| VER_FLAGS.VER_FLG_BASE: 'BASE', |
| VER_FLAGS.VER_FLG_WEAK: 'WEAK', |
| VER_FLAGS.VER_FLG_INFO: 'INFO', |
| } |
| |
| |
| # PT_NOTE section types |
| _DESCR_NOTE_N_TYPE = dict( |
| NT_GNU_ABI_TAG='ABI version tag', |
| NT_GNU_HWCAP='DSO-supplied software HWCAP info', |
| NT_GNU_BUILD_ID='unique build ID bitstring', |
| NT_GNU_GOLD_VERSION='gold version', |
| ) |
| |
| |
| # Values in GNU .note.ABI-tag notes (n_type=='NT_GNU_ABI_TAG') |
| _DESCR_NOTE_ABI_TAG_OS = dict( |
| ELF_NOTE_OS_LINUX='Linux', |
| ELF_NOTE_OS_GNU='GNU', |
| ELF_NOTE_OS_SOLARIS2='Solaris 2', |
| ELF_NOTE_OS_FREEBSD='FreeBSD', |
| ELF_NOTE_OS_NETBSD='NetBSD', |
| ELF_NOTE_OS_SYLLABLE='Syllable', |
| ) |
| |
| def _reverse_dict(d, low_priority=()): |
| """ |
| This is a tiny helper function to "reverse" the keys/values of a dictionary |
| provided in the first argument, i.e. {k: v} becomes {v: k}. |
| |
| The second argument (optional) provides primitive control over what to do in |
| the case of conflicting values - if a value is present in this list, it will |
| not override any other entries of the same value. |
| """ |
| out = {} |
| for k, v in iteritems(d): |
| if v in out and k in low_priority: |
| continue |
| out[v] = k |
| return out |
| |
| _DESCR_RELOC_TYPE_i386 = _reverse_dict(ENUM_RELOC_TYPE_i386) |
| _DESCR_RELOC_TYPE_x64 = _reverse_dict(ENUM_RELOC_TYPE_x64) |
| _DESCR_RELOC_TYPE_ARM = _reverse_dict(ENUM_RELOC_TYPE_ARM) |
| _DESCR_RELOC_TYPE_AARCH64 = _reverse_dict(ENUM_RELOC_TYPE_AARCH64) |
| _DESCR_RELOC_TYPE_MIPS = _reverse_dict(ENUM_RELOC_TYPE_MIPS) |
| |
| _low_priority_D_TAG = ( |
| # these are 'meta-tags' marking semantics of numeric ranges of the enum |
| # they should not override other tags with the same numbers |
| # see https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-42444.html |
| 'DT_LOOS', |
| 'DT_HIOS', |
| 'DT_LOPROC', |
| 'DT_HIPROC', |
| 'DT_ENCODING', |
| ) |
| _DESCR_D_TAG = _reverse_dict(ENUM_D_TAG, low_priority=_low_priority_D_TAG) |
| |
| _DESCR_ATTR_TAG_ARM = dict( |
| TAG_FILE='File Attributes', |
| TAG_SECTION='Section Attributes:', |
| TAG_SYMBOL='Symbol Attributes:', |
| TAG_CPU_RAW_NAME='Tag_CPU_raw_name: ', |
| TAG_CPU_NAME='Tag_CPU_name: ', |
| TAG_CPU_ARCH='Tag_CPU_arch: ', |
| TAG_CPU_ARCH_PROFILE='Tag_CPU_arch_profile: ', |
| TAG_ARM_ISA_USE='Tag_ARM_ISA_use: ', |
| TAG_THUMB_ISA_USE='Tag_Thumb_ISA_use: ', |
| TAG_FP_ARCH='Tag_FP_arch: ', |
| TAG_WMMX_ARCH='Tag_WMMX_arch: ', |
| TAG_ADVANCED_SIMD_ARCH='Tag_Advanced_SIMD_arch: ', |
| TAG_PCS_CONFIG='Tag_PCS_config: ', |
| TAG_ABI_PCS_R9_USE='Tag_ABI_PCS_R9_use: ', |
| TAG_ABI_PCS_RW_DATA='Tag_ABI_PCS_RW_use: ', |
| TAG_ABI_PCS_RO_DATA='Tag_ABI_PCS_RO_use: ', |
| TAG_ABI_PCS_GOT_USE='Tag_ABI_PCS_GOT_use: ', |
| TAG_ABI_PCS_WCHAR_T='Tag_ABI_PCS_wchar_t: ', |
| TAG_ABI_FP_ROUNDING='Tag_ABI_FP_rounding: ', |
| TAG_ABI_FP_DENORMAL='Tag_ABI_FP_denormal: ', |
| TAG_ABI_FP_EXCEPTIONS='Tag_ABI_FP_exceptions: ', |
| TAG_ABI_FP_USER_EXCEPTIONS='Tag_ABI_FP_user_exceptions: ', |
| TAG_ABI_FP_NUMBER_MODEL='Tag_ABI_FP_number_model: ', |
| TAG_ABI_ALIGN_NEEDED='Tag_ABI_align_needed: ', |
| TAG_ABI_ALIGN_PRESERVED='Tag_ABI_align_preserved: ', |
| TAG_ABI_ENUM_SIZE='Tag_ABI_enum_size: ', |
| TAG_ABI_HARDFP_USE='Tag_ABI_HardFP_use: ', |
| TAG_ABI_VFP_ARGS='Tag_ABI_VFP_args: ', |
| TAG_ABI_WMMX_ARGS='Tag_ABI_WMMX_args: ', |
| TAG_ABI_OPTIMIZATION_GOALS='Tag_ABI_optimization_goals: ', |
| TAG_ABI_FP_OPTIMIZATION_GOALS='Tag_ABI_FP_optimization_goals: ', |
| TAG_COMPATIBILITY='Tag_compatibility: ', |
| TAG_CPU_UNALIGNED_ACCESS='Tag_CPU_unaligned_access: ', |
| TAG_FP_HP_EXTENSION='Tag_FP_HP_extension: ', |
| TAG_ABI_FP_16BIT_FORMAT='Tag_ABI_FP_16bit_format: ', |
| TAG_MPEXTENSION_USE='Tag_MPextension_use: ', |
| TAG_DIV_USE='Tag_DIV_use: ', |
| TAG_NODEFAULTS='Tag_nodefaults: ', |
| TAG_ALSO_COMPATIBLE_WITH='Tag_also_compatible_with: ', |
| TAG_T2EE_USE='Tag_T2EE_use: ', |
| TAG_CONFORMANCE='Tag_conformance: ', |
| TAG_VIRTUALIZATION_USE='Tag_Virtualization_use: ', |
| TAG_MPEXTENSION_USE_OLD='Tag_MPextension_use_old: ', |
| ) |
| |
| |
| _DESCR_ATTR_VAL_ARM = [ |
| None, #1 |
| None, #2 |
| None, #3 |
| None, #4 |
| None, #5 |
| { #6 TAG_CPU_ARCH |
| 0 : 'Pre-v4', |
| 1 : 'v4', |
| 2 : 'v4T', |
| 3 : 'v5T', |
| 4 : 'v5TE', |
| 5 : 'v5TEJ', |
| 6 : 'v6', |
| 7 : 'v6KZ', |
| 8 : 'v6T2', |
| 9 : 'v6K', |
| 10: 'v7', |
| 11: 'v6-M', |
| 12: 'v6S-M', |
| 13: 'v7E-M', |
| 14: 'v8', |
| 15: 'v8-R', |
| 16: 'v8-M.baseline', |
| 17: 'v8-M.mainline', |
| }, |
| { #7 TAG_CPU_ARCH_PROFILE |
| 0x00: 'None', |
| 0x41: 'Application', |
| 0x52: 'Realtime', |
| 0x4D: 'Microcontroller', |
| 0x53: 'Application or Realtime', |
| }, |
| { #8 TAG_ARM_ISA |
| 0: 'No', |
| 1: 'Yes', |
| }, |
| { #9 TAG_THUMB_ISA |
| 0: 'No', |
| 1: 'Thumb-1', |
| 2: 'Thumb-2', |
| 3: 'Yes', |
| }, |
| { #10 TAG_FP_ARCH |
| 0: 'No', |
| 1: 'VFPv1', |
| 2: 'VFPv2 ', |
| 3: 'VFPv3', |
| 4: 'VFPv3-D16', |
| 5: 'VFPv4', |
| 6: 'VFPv4-D16', |
| 7: 'FP ARM v8', |
| 8: 'FPv5/FP-D16 for ARMv8', |
| }, |
| { #11 TAG_WMMX_ARCH |
| 0: 'No', |
| 1: 'WMMXv1', |
| 2: 'WMMXv2', |
| }, |
| { #12 TAG_ADVANCED_SIMD_ARCH |
| 0: 'No', |
| 1: 'NEONv1', |
| 2: 'NEONv1 with Fused-MAC', |
| 3: 'NEON for ARMv8', |
| 4: 'NEON for ARMv8.1', |
| }, |
| { #13 TAG_PCS_CONFIG |
| 0: 'None', |
| 1: 'Bare platform', |
| 2: 'Linux application', |
| 3: 'Linux DSO', |
| 4: 'PalmOS 2004', |
| 5: 'PalmOS (reserved)', |
| 6: 'SymbianOS 2004', |
| 7: 'SymbianOS (reserved)', |
| }, |
| { #14 TAG_ABI_PCS_R9_USE |
| 0: 'v6', |
| 1: 'SB', |
| 2: 'TLS', |
| 3: 'Unused', |
| }, |
| { #15 TAG_ABI_PCS_RW_DATA |
| 0: 'Absolute', |
| 1: 'PC-relative', |
| 2: 'SB-relative', |
| 3: 'None', |
| }, |
| { #16 TAG_ABI_PCS_RO_DATA |
| 0: 'Absolute', |
| 1: 'PC-relative', |
| 2: 'None', |
| }, |
| { #17 TAG_ABI_PCS_GOT_USE |
| 0: 'None', |
| 1: 'direct', |
| 2: 'GOT-indirect', |
| }, |
| { #18 TAG_ABI_PCS_WCHAR_T |
| 0: 'None', |
| 1: '??? 1', |
| 2: '2', |
| 3: '??? 3', |
| 4: '4', |
| }, |
| { #19 TAG_ABI_FP_ROUNDING |
| 0: 'Unused', |
| 1: 'Needed', |
| }, |
| { #20 TAG_ABI_FP_DENORMAL |
| 0: 'Unused', |
| 1: 'Needed', |
| 2: 'Sign only', |
| }, |
| { #21 TAG_ABI_FP_EXCEPTIONS |
| 0: 'Unused', |
| 1: 'Needed', |
| }, |
| { #22 TAG_ABI_FP_USER_EXCEPTIONS |
| 0: 'Unused', |
| 1: 'Needed', |
| }, |
| { #23 TAG_ABI_FP_NUMBER_MODEL |
| 0: 'Unused', |
| 1: 'Finite', |
| 2: 'RTABI', |
| 3: 'IEEE 754', |
| }, |
| { #24 TAG_ABI_ALIGN_NEEDED |
| 0: 'None', |
| 1: '8-byte', |
| 2: '4-byte', |
| 3: '??? 3', |
| }, |
| { #25 TAG_ABI_ALIGN_PRESERVED |
| 0: 'None', |
| 1: '8-byte, except leaf SP', |
| 2: '8-byte', |
| 3: '??? 3', |
| }, |
| { #26 TAG_ABI_ENUM_SIZE |
| 0: 'Unused', |
| 1: 'small', |
| 2: 'int', |
| 3: 'forced to int', |
| }, |
| { #27 TAG_ABI_HARDFP_USE |
| 0: 'As Tag_FP_arch', |
| 1: 'SP only', |
| 2: 'Reserved', |
| 3: 'Deprecated', |
| }, |
| { #28 TAG_ABI_VFP_ARGS |
| 0: 'AAPCS', |
| 1: 'VFP registers', |
| 2: 'custom', |
| 3: 'compatible', |
| }, |
| { #29 TAG_ABI_WMMX_ARGS |
| 0: 'AAPCS', |
| 1: 'WMMX registers', |
| 2: 'custom', |
| }, |
| { #30 TAG_ABI_OPTIMIZATION_GOALS |
| 0: 'None', |
| 1: 'Prefer Speed', |
| 2: 'Aggressive Speed', |
| 3: 'Prefer Size', |
| 4: 'Aggressive Size', |
| 5: 'Prefer Debug', |
| 6: 'Aggressive Debug', |
| }, |
| { #31 TAG_ABI_FP_OPTIMIZATION_GOALS |
| 0: 'None', |
| 1: 'Prefer Speed', |
| 2: 'Aggressive Speed', |
| 3: 'Prefer Size', |
| 4: 'Aggressive Size', |
| 5: 'Prefer Accuracy', |
| 6: 'Aggressive Accuracy', |
| }, |
| { #32 TAG_COMPATIBILITY |
| 0: 'No', |
| 1: 'Yes', |
| }, |
| None, #33 |
| { #34 TAG_CPU_UNALIGNED_ACCESS |
| 0: 'None', |
| 1: 'v6', |
| }, |
| None, #35 |
| { #36 TAG_FP_HP_EXTENSION |
| 0: 'Not Allowed', |
| 1: 'Allowed', |
| }, |
| None, #37 |
| { #38 TAG_ABI_FP_16BIT_FORMAT |
| 0: 'None', |
| 1: 'IEEE 754', |
| 2: 'Alternative Format', |
| }, |
| None, #39 |
| None, #40 |
| None, #41 |
| { #42 TAG_MPEXTENSION_USE |
| 0: 'Not Allowed', |
| 1: 'Allowed', |
| }, |
| None, #43 |
| { #44 TAG_DIV_USE |
| 0: 'Allowed in Thumb-ISA, v7-R or v7-M', |
| 1: 'Not allowed', |
| 2: 'Allowed in v7-A with integer division extension', |
| }, |
| None, #45 |
| None, #46 |
| None, #47 |
| None, #48 |
| None, #49 |
| None, #50 |
| None, #51 |
| None, #52 |
| None, #53 |
| None, #54 |
| None, #55 |
| None, #56 |
| None, #57 |
| None, #58 |
| None, #59 |
| None, #60 |
| None, #61 |
| None, #62 |
| None, #63 |
| None, #64 |
| None, #65 |
| { #66 TAG_FP_HP_EXTENSION |
| 0: 'Not Allowed', |
| 1: 'Allowed', |
| }, |
| None, #67 |
| { #68 TAG_VIRTUALIZATION_USE |
| 0: 'Not Allowed', |
| 1: 'TrustZone', |
| 2: 'Virtualization Extensions', |
| 3: 'TrustZone and Virtualization Extensions', |
| }, |
| None, #69 |
| { #70 TAG_MPEXTENSION_USE_OLD |
| 0: 'Not Allowed', |
| 1: 'Allowed', |
| }, |
| ] |