1 #-------------------------------------------------------------------------------
2 # elftools: elf/descriptions.py
4 # Textual descriptions of the various enums and flags of ELF
6 # Eli Bendersky (eliben@gmail.com)
7 # This code is in the public domain
8 #-------------------------------------------------------------------------------
10 ENUM_D_TAG
, ENUM_E_VERSION
, ENUM_P_TYPE_BASE
, ENUM_SH_TYPE_BASE
,
11 ENUM_RELOC_TYPE_i386
, ENUM_RELOC_TYPE_x64
,
12 ENUM_RELOC_TYPE_ARM
, ENUM_RELOC_TYPE_AARCH64
, ENUM_RELOC_TYPE_PPC64
,
13 ENUM_RELOC_TYPE_MIPS
, ENUM_ATTR_TAG_ARM
, ENUM_DT_FLAGS
, ENUM_DT_FLAGS_1
)
14 from .constants
import (
15 P_FLAGS
, RH_FLAGS
, SH_FLAGS
, SUNW_SYMINFO_FLAGS
, VER_FLAGS
)
16 from ..common
.py3compat
import iteritems
19 def describe_ei_class(x
):
20 return _DESCR_EI_CLASS
.get(x
, _unknown
)
23 def describe_ei_data(x
):
24 return _DESCR_EI_DATA
.get(x
, _unknown
)
27 def describe_ei_version(x
):
28 s
= '%d' % ENUM_E_VERSION
[x
]
34 def describe_ei_osabi(x
):
35 return _DESCR_EI_OSABI
.get(x
, _unknown
)
38 def describe_e_type(x
):
39 return _DESCR_E_TYPE
.get(x
, _unknown
)
42 def describe_e_machine(x
):
43 return _DESCR_E_MACHINE
.get(x
, _unknown
)
46 def describe_e_version_numeric(x
):
47 return '0x%x' % ENUM_E_VERSION
[x
]
50 def describe_p_type(x
):
51 if x
in _DESCR_P_TYPE
:
52 return _DESCR_P_TYPE
.get(x
)
53 elif x
>= ENUM_P_TYPE_BASE
['PT_LOOS'] and x
<= ENUM_P_TYPE_BASE
['PT_HIOS']:
54 return 'LOOS+%lx' % (x
- ENUM_P_TYPE_BASE
['PT_LOOS'])
59 def describe_p_flags(x
):
61 for flag
in (P_FLAGS
.PF_R
, P_FLAGS
.PF_W
, P_FLAGS
.PF_X
):
62 s
+= _DESCR_P_FLAGS
[flag
] if (x
& flag
) else ' '
66 def describe_rh_flags(x
):
69 for flag
in (RH_FLAGS
.RHF_NONE
, RH_FLAGS
.RHF_QUICKSTART
,
70 RH_FLAGS
.RHF_NOTPOT
, RH_FLAGS
.RHF_NO_LIBRARY_REPLACEMENT
,
71 RH_FLAGS
.RHF_NO_MOVE
, RH_FLAGS
.RHF_SGI_ONLY
,
72 RH_FLAGS
.RHF_GUARANTEE_INIT
,
73 RH_FLAGS
.RHF_DELTA_C_PLUS_PLUS
,
74 RH_FLAGS
.RHF_GUARANTEE_START_INIT
, RH_FLAGS
.RHF_PIXIE
,
75 RH_FLAGS
.RHF_DEFAULT_DELAY_LOAD
,
76 RH_FLAGS
.RHF_REQUICKSTART
, RH_FLAGS
.RHF_REQUICKSTARTED
,
77 RH_FLAGS
.RHF_CORD
, RH_FLAGS
.RHF_NO_UNRES_UNDEF
,
78 RH_FLAGS
.RHF_RLD_ORDER_SAFE
)
82 def describe_sh_type(x
):
83 if x
in _DESCR_SH_TYPE
:
84 return _DESCR_SH_TYPE
.get(x
)
85 elif (x
>= ENUM_SH_TYPE_BASE
['SHT_LOOS'] and
86 x
< ENUM_SH_TYPE_BASE
['SHT_GNU_versym']):
87 return 'loos+0x%lx' % (x
- ENUM_SH_TYPE_BASE
['SHT_LOOS'])
92 def describe_sh_flags(x
):
95 SH_FLAGS
.SHF_WRITE
, SH_FLAGS
.SHF_ALLOC
, SH_FLAGS
.SHF_EXECINSTR
,
96 SH_FLAGS
.SHF_MERGE
, SH_FLAGS
.SHF_STRINGS
, SH_FLAGS
.SHF_INFO_LINK
,
97 SH_FLAGS
.SHF_LINK_ORDER
, SH_FLAGS
.SHF_OS_NONCONFORMING
,
98 SH_FLAGS
.SHF_GROUP
, SH_FLAGS
.SHF_TLS
, SH_FLAGS
.SHF_MASKOS
,
99 SH_FLAGS
.SHF_EXCLUDE
):
100 s
+= _DESCR_SH_FLAGS
[flag
] if (x
& flag
) else ''
101 if not x
& SH_FLAGS
.SHF_EXCLUDE
:
102 if x
& SH_FLAGS
.SHF_MASKPROC
:
107 def describe_symbol_type(x
):
108 return _DESCR_ST_INFO_TYPE
.get(x
, _unknown
)
111 def describe_symbol_bind(x
):
112 return _DESCR_ST_INFO_BIND
.get(x
, _unknown
)
115 def describe_symbol_visibility(x
):
116 return _DESCR_ST_VISIBILITY
.get(x
, _unknown
)
119 def describe_symbol_local(x
):
120 return '[<localentry>: ' + str(1 << x
) + ']'
123 def describe_symbol_other(x
):
124 vis
= describe_symbol_visibility(x
['visibility'])
125 if x
['local'] > 1 and x
['local'] < 7:
126 return vis
+ ' ' + describe_symbol_local(x
['local'])
130 def describe_symbol_shndx(x
):
131 return _DESCR_ST_SHNDX
.get(x
, '%3s' % x
)
134 def describe_reloc_type(x
, elffile
):
135 arch
= elffile
.get_machine_arch()
137 return _DESCR_RELOC_TYPE_i386
.get(x
, _unknown
)
139 return _DESCR_RELOC_TYPE_x64
.get(x
, _unknown
)
141 return _DESCR_RELOC_TYPE_ARM
.get(x
, _unknown
)
142 elif arch
== 'AArch64':
143 return _DESCR_RELOC_TYPE_AARCH64
.get(x
, _unknown
)
144 elif arch
== '64-bit PowerPC':
145 return _DESCR_RELOC_TYPE_PPC64
.get(x
, _unknown
)
147 return _DESCR_RELOC_TYPE_MIPS
.get(x
, _unknown
)
149 return 'unrecognized: %-7x' % (x
& 0xFFFFFFFF)
152 def describe_dyn_tag(x
):
153 return _DESCR_D_TAG
.get(x
, _unknown
)
156 def describe_dt_flags(x
):
157 return ' '.join(key
[3:] for key
, val
in
158 sorted(ENUM_DT_FLAGS
.items(), key
=lambda t
: t
[1]) if x
& val
)
161 def describe_dt_flags_1(x
):
162 return ' '.join(key
[5:] for key
, val
in
163 sorted(ENUM_DT_FLAGS_1
.items(), key
=lambda t
: t
[1]) if x
& val
)
166 def describe_syminfo_flags(x
):
167 return ''.join(_DESCR_SYMINFO_FLAGS
[flag
] for flag
in (
168 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_CAP
,
169 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DIRECT
,
170 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_FILTER
,
171 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_AUXILIARY
,
172 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DIRECTBIND
,
173 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_COPY
,
174 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_LAZYLOAD
,
175 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_NOEXTDIRECT
,
176 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_INTERPOSE
,
177 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DEFERRED
) if x
& flag
)
180 def describe_symbol_boundto(x
):
181 return _DESCR_SYMINFO_BOUNDTO
.get(x
, '%3s' % x
)
184 def describe_ver_flags(x
):
185 return ' | '.join(_DESCR_VER_FLAGS
[flag
] for flag
in (
186 VER_FLAGS
.VER_FLG_WEAK
,
187 VER_FLAGS
.VER_FLG_BASE
,
188 VER_FLAGS
.VER_FLG_INFO
) if x
& flag
)
191 def describe_note(x
):
194 if x
['n_type'] == 'NT_GNU_ABI_TAG':
195 if x
['n_name'] == 'Android':
196 desc
= '\n description data: %s ' % ' '.join("%02x" % ord(b
) for b
in x
['n_descdata'])
198 desc
= '\n OS: %s, ABI: %d.%d.%d' % (
199 _DESCR_NOTE_ABI_TAG_OS
.get(n_desc
['abi_os'], _unknown
),
200 n_desc
['abi_major'], n_desc
['abi_minor'], n_desc
['abi_tiny'])
201 elif x
['n_type'] == 'NT_GNU_BUILD_ID':
202 desc
= '\n Build ID: %s' % (n_desc
)
203 elif x
['n_type'] == 'NT_GNU_GOLD_VERSION':
204 desc
= '\n Version: %s' % (n_desc
)
206 desc
= '\n description data: {}'.format(' '.join(
207 '{:02x}'.format(ord(byte
)) for byte
in n_desc
210 if x
['n_type'] == 'NT_GNU_ABI_TAG' and x
['n_name'] == 'Android':
211 note_type
= 'NT_VERSION'
212 note_type_desc
= 'version'
214 note_type
= (x
['n_type'] if isinstance(x
['n_type'], str)
215 else 'Unknown note type:')
216 note_type_desc
= ('0x%.8x' % x
['n_type']
217 if isinstance(x
['n_type'], int) else
218 _DESCR_NOTE_N_TYPE
.get(x
['n_type'], _unknown
))
219 return '%s (%s)%s' % (note_type
, note_type_desc
, desc
)
222 def describe_attr_tag_arm(tag
, val
, extra
):
223 idx
= ENUM_ATTR_TAG_ARM
[tag
] - 1
224 d_entry
= _DESCR_ATTR_VAL_ARM
[idx
]
227 if tag
== 'TAG_COMPATIBILITY':
228 return (_DESCR_ATTR_TAG_ARM
[tag
]
229 + 'flag = %d, vendor = %s' % (val
, extra
))
231 elif tag
== 'TAG_ALSO_COMPATIBLE_WITH':
232 if val
.tag
== 'TAG_CPU_ARCH':
233 return _DESCR_ATTR_TAG_ARM
[tag
] + d_entry
[val
]
236 return _DESCR_ATTR_TAG_ARM
[tag
] + '??? (%d)' % val
.tag
238 elif tag
== 'TAG_NODEFAULTS':
239 return _DESCR_ATTR_TAG_ARM
[tag
] + 'True'
241 s
= _DESCR_ATTR_TAG_ARM
[tag
]
242 s
+= '"%s"' % val
if val
else ''
246 return _DESCR_ATTR_TAG_ARM
[tag
] + d_entry
[val
]
249 #-------------------------------------------------------------------------------
250 _unknown
= '<unknown>'
253 _DESCR_EI_CLASS
= dict(
260 _DESCR_EI_DATA
= dict(
262 ELFDATA2LSB
="2's complement, little endian",
263 ELFDATA2MSB
="2's complement, big endian",
267 _DESCR_EI_OSABI
= dict(
268 ELFOSABI_SYSV
='UNIX - System V',
269 ELFOSABI_HPUX
='UNIX - HP-UX',
270 ELFOSABI_NETBSD
='UNIX - NetBSD',
271 ELFOSABI_LINUX
='UNIX - Linux',
272 ELFOSABI_HURD
='UNIX - GNU/Hurd',
273 ELFOSABI_SOLARIS
='UNIX - Solaris',
274 ELFOSABI_AIX
='UNIX - AIX',
275 ELFOSABI_IRIX
='UNIX - IRIX',
276 ELFOSABI_FREEBSD
='UNIX - FreeBSD',
277 ELFOSABI_TRU64
='UNIX - TRU64',
278 ELFOSABI_MODESTO
='Novell - Modesto',
279 ELFOSABI_OPENBSD
='UNIX - OpenBSD',
280 ELFOSABI_OPENVMS
='VMS - OpenVMS',
281 ELFOSABI_NSK
='HP - Non-Stop Kernel',
282 ELFOSABI_AROS
='AROS',
283 ELFOSABI_FENIXOS
='Fenix OS',
284 ELFOSABI_CLOUD
='Nuxi - CloudABI',
285 ELFOSABI_SORTIX
='Sortix',
286 ELFOSABI_ARM_AEABI
='ARM - EABI',
287 ELFOSABI_ARM
='ARM - ABI',
288 ELFOSABI_STANDALONE
='Standalone App',
292 _DESCR_E_TYPE
= dict(
293 ET_NONE
='NONE (None)',
294 ET_REL
='REL (Relocatable file)',
295 ET_EXEC
='EXEC (Executable file)',
296 ET_DYN
='DYN (Shared object file)',
297 ET_CORE
='CORE (Core file)',
298 PROC_SPECIFIC
='Processor Specific',
302 _DESCR_E_MACHINE
= dict(
306 EM_386
='Intel 80386',
309 EM_860
='Intel 80860',
310 EM_MIPS
='MIPS R3000',
311 EM_S370
='IBM System/370',
312 EM_MIPS_RS4_BE
='MIPS 4000 big-endian',
313 EM_IA_64
='Intel IA-64',
314 EM_X86_64
='Advanced Micro Devices X86-64',
315 EM_AVR
='Atmel AVR 8-bit microcontroller',
317 EM_AARCH64
='AArch64',
318 EM_BLACKFIN
='Analog Devices Blackfin',
320 EM_PPC64
='PowerPC64',
325 _DESCR_P_TYPE
= dict(
328 PT_DYNAMIC
='DYNAMIC',
333 PT_GNU_EH_FRAME
='GNU_EH_FRAME',
334 PT_GNU_STACK
='GNU_STACK',
335 PT_GNU_RELRO
='GNU_RELRO',
336 PT_ARM_ARCHEXT
='ARM_ARCHEXT',
337 PT_ARM_EXIDX
='EXIDX', # binutils calls this EXIDX, not ARM_EXIDX
338 PT_AARCH64_ARCHEXT
='AARCH64_ARCHEXT',
339 PT_AARCH64_UNWIND
='AARCH64_UNWIND',
341 PT_MIPS_ABIFLAGS
='ABIFLAGS'
352 _DESCR_SH_TYPE
= dict(
354 SHT_PROGBITS
='PROGBITS',
359 SHT_DYNAMIC
='DYNAMIC',
365 SHT_INIT_ARRAY
='INIT_ARRAY',
366 SHT_FINI_ARRAY
='FINI_ARRAY',
367 SHT_PREINIT_ARRAY
='PREINIT_ARRAY',
368 SHT_GNU_ATTRIBUTES
='GNU_ATTRIBUTES',
369 SHT_GNU_HASH
='GNU_HASH',
371 SHT_SYMTAB_SHNDX
='SYMTAB SECTION INDICIES',
372 SHT_GNU_verdef
='VERDEF',
373 SHT_GNU_verneed
='VERNEED',
374 SHT_GNU_versym
='VERSYM',
375 SHT_GNU_LIBLIST
='GNU_LIBLIST',
376 SHT_ARM_EXIDX
='ARM_EXIDX',
377 SHT_ARM_PREEMPTMAP
='ARM_PREEMPTMAP',
378 SHT_ARM_ATTRIBUTES
='ARM_ATTRIBUTES',
379 SHT_ARM_DEBUGOVERLAY
='ARM_DEBUGOVERLAY',
380 SHT_MIPS_LIBLIST
='MIPS_LIBLIST',
381 SHT_MIPS_DEBUG
='MIPS_DEBUG',
382 SHT_MIPS_REGINFO
='MIPS_REGINFO',
383 SHT_MIPS_PACKAGE
='MIPS_PACKAGE',
384 SHT_MIPS_PACKSYM
='MIPS_PACKSYM',
385 SHT_MIPS_RELD
='MIPS_RELD',
386 SHT_MIPS_IFACE
='MIPS_IFACE',
387 SHT_MIPS_CONTENT
='MIPS_CONTENT',
388 SHT_MIPS_OPTIONS
='MIPS_OPTIONS',
389 SHT_MIPS_SHDR
='MIPS_SHDR',
390 SHT_MIPS_FDESC
='MIPS_FDESC',
391 SHT_MIPS_EXTSYM
='MIPS_EXTSYM',
392 SHT_MIPS_DENSE
='MIPS_DENSE',
393 SHT_MIPS_PDESC
='MIPS_PDESC',
394 SHT_MIPS_LOCSYM
='MIPS_LOCSYM',
395 SHT_MIPS_AUXSYM
='MIPS_AUXSYM',
396 SHT_MIPS_OPTSYM
='MIPS_OPTSYM',
397 SHT_MIPS_LOCSTR
='MIPS_LOCSTR',
398 SHT_MIPS_LINE
='MIPS_LINE',
399 SHT_MIPS_RFDESC
='MIPS_RFDESC',
400 SHT_MIPS_DELTASYM
='MIPS_DELTASYM',
401 SHT_MIPS_DELTAINST
='MIPS_DELTAINST',
402 SHT_MIPS_DELTACLASS
='MIPS_DELTACLASS',
403 SHT_MIPS_DWARF
='MIPS_DWARF',
404 SHT_MIPS_DELTADECL
='MIPS_DELTADECL',
405 SHT_MIPS_SYMBOL_LIB
='MIPS_SYMBOL_LIB',
406 SHT_MIPS_EVENTS
='MIPS_EVENTS',
407 SHT_MIPS_TRANSLATE
='MIPS_TRANSLATE',
408 SHT_MIPS_PIXIE
='MIPS_PIXIE',
409 SHT_MIPS_XLATE
='MIPS_XLATE',
410 SHT_MIPS_XLATE_DEBUG
='MIPS_XLATE_DEBUG',
411 SHT_MIPS_WHIRL
='MIPS_WHIRL',
412 SHT_MIPS_EH_REGION
='MIPS_EH_REGION',
413 SHT_MIPS_XLATE_OLD
='MIPS_XLATE_OLD',
414 SHT_MIPS_PDR_EXCEPTION
='MIPS_PDR_EXCEPTION',
415 SHT_MIPS_ABIFLAGS
='MIPS_ABIFLAGS',
420 SH_FLAGS
.SHF_WRITE
: 'W',
421 SH_FLAGS
.SHF_ALLOC
: 'A',
422 SH_FLAGS
.SHF_EXECINSTR
: 'X',
423 SH_FLAGS
.SHF_MERGE
: 'M',
424 SH_FLAGS
.SHF_STRINGS
: 'S',
425 SH_FLAGS
.SHF_INFO_LINK
: 'I',
426 SH_FLAGS
.SHF_LINK_ORDER
: 'L',
427 SH_FLAGS
.SHF_OS_NONCONFORMING
: 'O',
428 SH_FLAGS
.SHF_GROUP
: 'G',
429 SH_FLAGS
.SHF_TLS
: 'T',
430 SH_FLAGS
.SHF_MASKOS
: 'o',
431 SH_FLAGS
.SHF_EXCLUDE
: 'E',
436 RH_FLAGS
.RHF_NONE
: 'NONE',
437 RH_FLAGS
.RHF_QUICKSTART
: 'QUICKSTART',
438 RH_FLAGS
.RHF_NOTPOT
: 'NOTPOT',
439 RH_FLAGS
.RHF_NO_LIBRARY_REPLACEMENT
: 'NO_LIBRARY_REPLACEMENT',
440 RH_FLAGS
.RHF_NO_MOVE
: 'NO_MOVE',
441 RH_FLAGS
.RHF_SGI_ONLY
: 'SGI_ONLY',
442 RH_FLAGS
.RHF_GUARANTEE_INIT
: 'GUARANTEE_INIT',
443 RH_FLAGS
.RHF_DELTA_C_PLUS_PLUS
: 'DELTA_C_PLUS_PLUS',
444 RH_FLAGS
.RHF_GUARANTEE_START_INIT
: 'GUARANTEE_START_INIT',
445 RH_FLAGS
.RHF_PIXIE
: 'PIXIE',
446 RH_FLAGS
.RHF_DEFAULT_DELAY_LOAD
: 'DEFAULT_DELAY_LOAD',
447 RH_FLAGS
.RHF_REQUICKSTART
: 'REQUICKSTART',
448 RH_FLAGS
.RHF_REQUICKSTARTED
: 'REQUICKSTARTED',
449 RH_FLAGS
.RHF_CORD
: 'CORD',
450 RH_FLAGS
.RHF_NO_UNRES_UNDEF
: 'NO_UNRES_UNDEF',
451 RH_FLAGS
.RHF_RLD_ORDER_SAFE
: 'RLD_ORDER_SAFE',
455 _DESCR_ST_INFO_TYPE
= dict(
459 STT_SECTION
='SECTION',
469 _DESCR_ST_INFO_BIND
= dict(
476 _DESCR_ST_VISIBILITY
= dict(
477 STV_DEFAULT
='DEFAULT',
478 STV_INTERNAL
='INTERNAL',
480 STV_PROTECTED
='PROTECTED',
481 STV_EXPORTED
='EXPORTED',
482 STV_SINGLETON
='SINGLETON',
483 STV_ELIMINATE
='ELIMINATE',
487 _DESCR_ST_SHNDX
= dict(
494 _DESCR_SYMINFO_FLAGS
= {
495 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DIRECT
: 'D',
496 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DIRECTBIND
: 'B',
497 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_COPY
: 'C',
498 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_LAZYLOAD
: 'L',
499 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_NOEXTDIRECT
: 'N',
500 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_AUXILIARY
: 'A',
501 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_FILTER
: 'F',
502 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_INTERPOSE
: 'I',
503 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_CAP
: 'S',
504 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DEFERRED
: 'P',
508 _DESCR_SYMINFO_BOUNDTO
= dict(
509 SYMINFO_BT_SELF
='<self>',
510 SYMINFO_BT_PARENT
='<parent>',
512 SYMINFO_BT_EXTERN
='<extern>',
518 VER_FLAGS
.VER_FLG_BASE
: 'BASE',
519 VER_FLAGS
.VER_FLG_WEAK
: 'WEAK',
520 VER_FLAGS
.VER_FLG_INFO
: 'INFO',
524 # PT_NOTE section types
525 _DESCR_NOTE_N_TYPE
= dict(
526 NT_GNU_ABI_TAG
='ABI version tag',
527 NT_GNU_HWCAP
='DSO-supplied software HWCAP info',
528 NT_GNU_BUILD_ID
='unique build ID bitstring',
529 NT_GNU_GOLD_VERSION
='gold version',
533 # Values in GNU .note.ABI-tag notes (n_type=='NT_GNU_ABI_TAG')
534 _DESCR_NOTE_ABI_TAG_OS
= dict(
535 ELF_NOTE_OS_LINUX
='Linux',
536 ELF_NOTE_OS_GNU
='GNU',
537 ELF_NOTE_OS_SOLARIS2
='Solaris 2',
538 ELF_NOTE_OS_FREEBSD
='FreeBSD',
539 ELF_NOTE_OS_NETBSD
='NetBSD',
540 ELF_NOTE_OS_SYLLABLE
='Syllable',
543 def _reverse_dict(d
, low_priority
=()):
545 This is a tiny helper function to "reverse" the keys/values of a dictionary
546 provided in the first argument, i.e. {k: v} becomes {v: k}.
548 The second argument (optional) provides primitive control over what to do in
549 the case of conflicting values - if a value is present in this list, it will
550 not override any other entries of the same value.
553 for k
, v
in iteritems(d
):
554 if v
in out
and k
in low_priority
:
559 _DESCR_RELOC_TYPE_i386
= _reverse_dict(ENUM_RELOC_TYPE_i386
)
560 _DESCR_RELOC_TYPE_x64
= _reverse_dict(ENUM_RELOC_TYPE_x64
)
561 _DESCR_RELOC_TYPE_ARM
= _reverse_dict(ENUM_RELOC_TYPE_ARM
)
562 _DESCR_RELOC_TYPE_AARCH64
= _reverse_dict(ENUM_RELOC_TYPE_AARCH64
)
563 _DESCR_RELOC_TYPE_PPC64
= _reverse_dict(ENUM_RELOC_TYPE_PPC64
)
564 _DESCR_RELOC_TYPE_MIPS
= _reverse_dict(ENUM_RELOC_TYPE_MIPS
)
566 _low_priority_D_TAG
= (
567 # these are 'meta-tags' marking semantics of numeric ranges of the enum
568 # they should not override other tags with the same numbers
569 # see https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-42444.html
576 _DESCR_D_TAG
= _reverse_dict(ENUM_D_TAG
, low_priority
=_low_priority_D_TAG
)
578 _DESCR_ATTR_TAG_ARM
= dict(
579 TAG_FILE
='File Attributes',
580 TAG_SECTION
='Section Attributes:',
581 TAG_SYMBOL
='Symbol Attributes:',
582 TAG_CPU_RAW_NAME
='Tag_CPU_raw_name: ',
583 TAG_CPU_NAME
='Tag_CPU_name: ',
584 TAG_CPU_ARCH
='Tag_CPU_arch: ',
585 TAG_CPU_ARCH_PROFILE
='Tag_CPU_arch_profile: ',
586 TAG_ARM_ISA_USE
='Tag_ARM_ISA_use: ',
587 TAG_THUMB_ISA_USE
='Tag_Thumb_ISA_use: ',
588 TAG_FP_ARCH
='Tag_FP_arch: ',
589 TAG_WMMX_ARCH
='Tag_WMMX_arch: ',
590 TAG_ADVANCED_SIMD_ARCH
='Tag_Advanced_SIMD_arch: ',
591 TAG_PCS_CONFIG
='Tag_PCS_config: ',
592 TAG_ABI_PCS_R9_USE
='Tag_ABI_PCS_R9_use: ',
593 TAG_ABI_PCS_RW_DATA
='Tag_ABI_PCS_RW_use: ',
594 TAG_ABI_PCS_RO_DATA
='Tag_ABI_PCS_RO_use: ',
595 TAG_ABI_PCS_GOT_USE
='Tag_ABI_PCS_GOT_use: ',
596 TAG_ABI_PCS_WCHAR_T
='Tag_ABI_PCS_wchar_t: ',
597 TAG_ABI_FP_ROUNDING
='Tag_ABI_FP_rounding: ',
598 TAG_ABI_FP_DENORMAL
='Tag_ABI_FP_denormal: ',
599 TAG_ABI_FP_EXCEPTIONS
='Tag_ABI_FP_exceptions: ',
600 TAG_ABI_FP_USER_EXCEPTIONS
='Tag_ABI_FP_user_exceptions: ',
601 TAG_ABI_FP_NUMBER_MODEL
='Tag_ABI_FP_number_model: ',
602 TAG_ABI_ALIGN_NEEDED
='Tag_ABI_align_needed: ',
603 TAG_ABI_ALIGN_PRESERVED
='Tag_ABI_align_preserved: ',
604 TAG_ABI_ENUM_SIZE
='Tag_ABI_enum_size: ',
605 TAG_ABI_HARDFP_USE
='Tag_ABI_HardFP_use: ',
606 TAG_ABI_VFP_ARGS
='Tag_ABI_VFP_args: ',
607 TAG_ABI_WMMX_ARGS
='Tag_ABI_WMMX_args: ',
608 TAG_ABI_OPTIMIZATION_GOALS
='Tag_ABI_optimization_goals: ',
609 TAG_ABI_FP_OPTIMIZATION_GOALS
='Tag_ABI_FP_optimization_goals: ',
610 TAG_COMPATIBILITY
='Tag_compatibility: ',
611 TAG_CPU_UNALIGNED_ACCESS
='Tag_CPU_unaligned_access: ',
612 TAG_FP_HP_EXTENSION
='Tag_FP_HP_extension: ',
613 TAG_ABI_FP_16BIT_FORMAT
='Tag_ABI_FP_16bit_format: ',
614 TAG_MPEXTENSION_USE
='Tag_MPextension_use: ',
615 TAG_DIV_USE
='Tag_DIV_use: ',
616 TAG_NODEFAULTS
='Tag_nodefaults: ',
617 TAG_ALSO_COMPATIBLE_WITH
='Tag_also_compatible_with: ',
618 TAG_T2EE_USE
='Tag_T2EE_use: ',
619 TAG_CONFORMANCE
='Tag_conformance: ',
620 TAG_VIRTUALIZATION_USE
='Tag_Virtualization_use: ',
621 TAG_MPEXTENSION_USE_OLD
='Tag_MPextension_use_old: ',
625 _DESCR_ATTR_VAL_ARM
= [
651 { #7 TAG_CPU_ARCH_PROFILE
655 0x4D: 'Microcontroller',
656 0x53: 'Application or Realtime',
677 8: 'FPv5/FP-D16 for ARMv8',
684 { #12 TAG_ADVANCED_SIMD_ARCH
687 2: 'NEONv1 with Fused-MAC',
689 4: 'NEON for ARMv8.1',
694 2: 'Linux application',
697 5: 'PalmOS (reserved)',
699 7: 'SymbianOS (reserved)',
701 { #14 TAG_ABI_PCS_R9_USE
707 { #15 TAG_ABI_PCS_RW_DATA
713 { #16 TAG_ABI_PCS_RO_DATA
718 { #17 TAG_ABI_PCS_GOT_USE
723 { #18 TAG_ABI_PCS_WCHAR_T
730 { #19 TAG_ABI_FP_ROUNDING
734 { #20 TAG_ABI_FP_DENORMAL
739 { #21 TAG_ABI_FP_EXCEPTIONS
743 { #22 TAG_ABI_FP_USER_EXCEPTIONS
747 { #23 TAG_ABI_FP_NUMBER_MODEL
753 { #24 TAG_ABI_ALIGN_NEEDED
759 { #25 TAG_ABI_ALIGN_PRESERVED
761 1: '8-byte, except leaf SP',
765 { #26 TAG_ABI_ENUM_SIZE
771 { #27 TAG_ABI_HARDFP_USE
777 { #28 TAG_ABI_VFP_ARGS
783 { #29 TAG_ABI_WMMX_ARGS
788 { #30 TAG_ABI_OPTIMIZATION_GOALS
791 2: 'Aggressive Speed',
793 4: 'Aggressive Size',
795 6: 'Aggressive Debug',
797 { #31 TAG_ABI_FP_OPTIMIZATION_GOALS
800 2: 'Aggressive Speed',
802 4: 'Aggressive Size',
803 5: 'Prefer Accuracy',
804 6: 'Aggressive Accuracy',
806 { #32 TAG_COMPATIBILITY
811 { #34 TAG_CPU_UNALIGNED_ACCESS
816 { #36 TAG_FP_HP_EXTENSION
821 { #38 TAG_ABI_FP_16BIT_FORMAT
824 2: 'Alternative Format',
829 { #42 TAG_MPEXTENSION_USE
835 0: 'Allowed in Thumb-ISA, v7-R or v7-M',
837 2: 'Allowed in v7-A with integer division extension',
860 { #66 TAG_FP_HP_EXTENSION
865 { #68 TAG_VIRTUALIZATION_USE
868 2: 'Virtualization Extensions',
869 3: 'TrustZone and Virtualization Extensions',
872 { #70 TAG_MPEXTENSION_USE_OLD