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_ATTR_TAG_RISCV
,
14 ENUM_RELOC_TYPE_LOONGARCH
, ENUM_DT_FLAGS
, ENUM_DT_FLAGS_1
)
15 from .constants
import (
16 P_FLAGS
, RH_FLAGS
, SH_FLAGS
, SUNW_SYMINFO_FLAGS
, VER_FLAGS
)
17 from ..common
.utils
import bytes2hex
20 def describe_ei_class(x
):
21 return _DESCR_EI_CLASS
.get(x
, _unknown
)
24 def describe_ei_data(x
):
25 return _DESCR_EI_DATA
.get(x
, _unknown
)
28 def describe_ei_version(x
):
29 s
= '%d' % ENUM_E_VERSION
[x
]
35 def describe_ei_osabi(x
):
36 return _DESCR_EI_OSABI
.get(x
, _unknown
)
39 def describe_e_type(x
, elffile
=None):
40 if elffile
is not None and x
== 'ET_DYN':
41 # Detect whether this is a normal SO or a PIE executable
42 dynamic
= elffile
.get_section_by_name('.dynamic')
43 for t
in dynamic
.iter_tags('DT_FLAGS_1'):
44 if t
.entry
.d_val
& ENUM_DT_FLAGS_1
['DF_1_PIE']:
45 return 'DYN (Position-Independent Executable file)'
46 return _DESCR_E_TYPE
.get(x
, _unknown
)
49 def describe_e_machine(x
):
50 return _DESCR_E_MACHINE
.get(x
, _unknown
)
53 def describe_e_version_numeric(x
):
54 return '0x%x' % ENUM_E_VERSION
[x
]
57 def describe_p_type(x
):
58 if x
in _DESCR_P_TYPE
:
59 return _DESCR_P_TYPE
.get(x
)
60 elif x
>= ENUM_P_TYPE_BASE
['PT_LOOS'] and x
<= ENUM_P_TYPE_BASE
['PT_HIOS']:
61 return 'LOOS+%lx' % (x
- ENUM_P_TYPE_BASE
['PT_LOOS'])
66 def describe_p_flags(x
):
68 for flag
in (P_FLAGS
.PF_R
, P_FLAGS
.PF_W
, P_FLAGS
.PF_X
):
69 s
+= _DESCR_P_FLAGS
[flag
] if (x
& flag
) else ' '
73 def describe_rh_flags(x
):
76 for flag
in (RH_FLAGS
.RHF_NONE
, RH_FLAGS
.RHF_QUICKSTART
,
77 RH_FLAGS
.RHF_NOTPOT
, RH_FLAGS
.RHF_NO_LIBRARY_REPLACEMENT
,
78 RH_FLAGS
.RHF_NO_MOVE
, RH_FLAGS
.RHF_SGI_ONLY
,
79 RH_FLAGS
.RHF_GUARANTEE_INIT
,
80 RH_FLAGS
.RHF_DELTA_C_PLUS_PLUS
,
81 RH_FLAGS
.RHF_GUARANTEE_START_INIT
, RH_FLAGS
.RHF_PIXIE
,
82 RH_FLAGS
.RHF_DEFAULT_DELAY_LOAD
,
83 RH_FLAGS
.RHF_REQUICKSTART
, RH_FLAGS
.RHF_REQUICKSTARTED
,
84 RH_FLAGS
.RHF_CORD
, RH_FLAGS
.RHF_NO_UNRES_UNDEF
,
85 RH_FLAGS
.RHF_RLD_ORDER_SAFE
)
89 def describe_sh_type(x
):
90 if x
in _DESCR_SH_TYPE
:
91 return _DESCR_SH_TYPE
.get(x
)
92 elif (x
>= ENUM_SH_TYPE_BASE
['SHT_LOOS'] and
93 x
< ENUM_SH_TYPE_BASE
['SHT_GNU_versym']):
94 return 'loos+0x%lx' % (x
- ENUM_SH_TYPE_BASE
['SHT_LOOS'])
99 def describe_sh_flags(x
):
102 SH_FLAGS
.SHF_WRITE
, SH_FLAGS
.SHF_ALLOC
, SH_FLAGS
.SHF_EXECINSTR
,
103 SH_FLAGS
.SHF_MERGE
, SH_FLAGS
.SHF_STRINGS
, SH_FLAGS
.SHF_INFO_LINK
,
104 SH_FLAGS
.SHF_LINK_ORDER
, SH_FLAGS
.SHF_OS_NONCONFORMING
,
105 SH_FLAGS
.SHF_GROUP
, SH_FLAGS
.SHF_TLS
, SH_FLAGS
.SHF_MASKOS
,
106 SH_FLAGS
.SHF_EXCLUDE
):
107 s
+= _DESCR_SH_FLAGS
[flag
] if (x
& flag
) else ''
108 if not x
& SH_FLAGS
.SHF_EXCLUDE
:
109 if x
& SH_FLAGS
.SHF_MASKPROC
:
114 def describe_symbol_type(x
):
115 return _DESCR_ST_INFO_TYPE
.get(x
, _unknown
)
118 def describe_symbol_bind(x
):
119 return _DESCR_ST_INFO_BIND
.get(x
, _unknown
)
122 def describe_symbol_visibility(x
):
123 return _DESCR_ST_VISIBILITY
.get(x
, _unknown
)
126 def describe_symbol_local(x
):
127 return '[<localentry>: ' + str(1 << x
) + ']'
130 def describe_symbol_other(x
):
131 vis
= describe_symbol_visibility(x
['visibility'])
132 if x
['local'] > 1 and x
['local'] < 7:
133 return vis
+ ' ' + describe_symbol_local(x
['local'])
137 def describe_symbol_shndx(x
):
138 return _DESCR_ST_SHNDX
.get(x
, '%3s' % x
)
141 def describe_reloc_type(x
, elffile
):
142 arch
= elffile
.get_machine_arch()
144 return _DESCR_RELOC_TYPE_i386
.get(x
, _unknown
)
146 return _DESCR_RELOC_TYPE_x64
.get(x
, _unknown
)
148 return _DESCR_RELOC_TYPE_ARM
.get(x
, _unknown
)
149 elif arch
== 'AArch64':
150 return _DESCR_RELOC_TYPE_AARCH64
.get(x
, _unknown
)
151 elif arch
== '64-bit PowerPC':
152 return _DESCR_RELOC_TYPE_PPC64
.get(x
, _unknown
)
154 return _DESCR_RELOC_TYPE_MIPS
.get(x
, _unknown
)
155 elif arch
== 'LoongArch':
156 return _DESCR_RELOC_TYPE_LOONGARCH
.get(x
, _unknown
)
158 return 'unrecognized: %-7x' % (x
& 0xFFFFFFFF)
161 def describe_dyn_tag(x
):
162 return _DESCR_D_TAG
.get(x
, _unknown
)
165 def describe_dt_flags(x
):
166 return ' '.join(key
[3:] for key
, val
in
167 sorted(ENUM_DT_FLAGS
.items(), key
=lambda t
: t
[1]) if x
& val
)
170 def describe_dt_flags_1(x
):
171 return ' '.join(key
[5:] for key
, val
in
172 sorted(ENUM_DT_FLAGS_1
.items(), key
=lambda t
: t
[1]) if x
& val
)
175 def describe_syminfo_flags(x
):
176 return ''.join(_DESCR_SYMINFO_FLAGS
[flag
] for flag
in (
177 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_CAP
,
178 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DIRECT
,
179 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_FILTER
,
180 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_AUXILIARY
,
181 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DIRECTBIND
,
182 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_COPY
,
183 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_LAZYLOAD
,
184 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_NOEXTDIRECT
,
185 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_INTERPOSE
,
186 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DEFERRED
) if x
& flag
)
189 def describe_symbol_boundto(x
):
190 return _DESCR_SYMINFO_BOUNDTO
.get(x
, '%3s' % x
)
193 def describe_ver_flags(x
):
194 return ' | '.join(_DESCR_VER_FLAGS
[flag
] for flag
in (
195 VER_FLAGS
.VER_FLG_WEAK
,
196 VER_FLAGS
.VER_FLG_BASE
,
197 VER_FLAGS
.VER_FLG_INFO
) if x
& flag
)
200 def describe_note(x
):
203 if x
['n_type'] == 'NT_GNU_ABI_TAG':
204 if x
['n_name'] == 'Android':
205 desc
= '\n description data: %s ' % bytes2hex(x
['n_descdata'])
207 desc
= '\n OS: %s, ABI: %d.%d.%d' % (
208 _DESCR_NOTE_ABI_TAG_OS
.get(n_desc
['abi_os'], _unknown
),
209 n_desc
['abi_major'], n_desc
['abi_minor'], n_desc
['abi_tiny'])
210 elif x
['n_type'] == 'NT_GNU_BUILD_ID':
211 desc
= '\n Build ID: %s' % (n_desc
)
212 elif x
['n_type'] == 'NT_GNU_GOLD_VERSION':
213 desc
= '\n Version: %s' % (n_desc
)
214 elif x
['n_type'] == 'NT_GNU_PROPERTY_TYPE_0':
215 desc
= '\n Properties: ' + describe_note_gnu_properties(x
['n_desc'])
217 desc
= '\n description data: {}'.format(bytes2hex(n_desc
))
219 if x
['n_type'] == 'NT_GNU_ABI_TAG' and x
['n_name'] == 'Android':
220 note_type
= 'NT_VERSION'
221 note_type_desc
= 'version'
223 note_type
= (x
['n_type'] if isinstance(x
['n_type'], str)
224 else 'Unknown note type:')
225 note_type_desc
= ('0x%.8x' % x
['n_type']
226 if isinstance(x
['n_type'], int) else
227 _DESCR_NOTE_N_TYPE
.get(x
['n_type'], _unknown
))
228 return '%s (%s)%s' % (note_type
, note_type_desc
, desc
)
231 def describe_attr_tag_arm(tag
, val
, extra
):
232 idx
= ENUM_ATTR_TAG_ARM
[tag
] - 1
233 d_entry
= _DESCR_ATTR_VAL_ARM
[idx
]
236 if tag
== 'TAG_COMPATIBILITY':
237 return (_DESCR_ATTR_TAG_ARM
[tag
]
238 + 'flag = %d, vendor = %s' % (val
, extra
))
240 elif tag
== 'TAG_ALSO_COMPATIBLE_WITH':
241 if val
.tag
== 'TAG_CPU_ARCH':
242 return _DESCR_ATTR_TAG_ARM
[tag
] + d_entry
[val
]
245 return _DESCR_ATTR_TAG_ARM
[tag
] + '??? (%d)' % val
.tag
247 elif tag
== 'TAG_NODEFAULTS':
248 return _DESCR_ATTR_TAG_ARM
[tag
] + 'True'
250 s
= _DESCR_ATTR_TAG_ARM
[tag
]
251 s
+= '"%s"' % val
if val
else ''
255 return _DESCR_ATTR_TAG_ARM
[tag
] + d_entry
[val
]
257 def describe_attr_tag_riscv(tag
, val
, extra
):
258 idx
= ENUM_ATTR_TAG_RISCV
[tag
] - 1
259 d_entry
= _DESCR_ATTR_VAL_RISCV
[idx
]
262 s
= _DESCR_ATTR_TAG_RISCV
[tag
]
263 s
+= '"%s"' % val
if val
else ''
267 return _DESCR_ATTR_TAG_RISCV
[tag
] + d_entry
[val
]
271 def describe_note_gnu_property_x86_feature_1(value
):
273 for mask
, desc
in _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_1_FLAGS
:
276 return 'x86 feature: ' + ', '.join(descs
)
278 def describe_note_gnu_property_x86_feature_2_used(value
):
280 for mask
, desc
in _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_2_FLAGS
:
283 return 'x86 feature used: ' + ', '.join(descs
)
285 def describe_note_gnu_property_x86_isa_1(value
, verb
):
287 for mask
, desc
in _DESCR_NOTE_GNU_PROPERTY_X86_ISA_1_FLAGS
:
290 return 'x86 ISA %s: %s' % (verb
, ', '.join(descs
))
292 def describe_note_gnu_properties(properties
):
294 for prop
in properties
:
295 t
, d
, sz
= prop
.pr_type
, prop
.pr_data
, prop
.pr_datasz
296 if t
== 'GNU_PROPERTY_STACK_SIZE':
298 prop_desc
= 'stack size: 0x%x' % d
300 prop_desc
= 'stack size: <corrupt length: 0x%x>' % sz
301 elif t
== 'GNU_PROPERTY_NO_COPY_ON_PROTECTED':
303 prop_desc
= ' <corrupt length: 0x%x>' % sz
305 prop_desc
= 'no copy on protected'
306 elif t
== 'GNU_PROPERTY_X86_FEATURE_1_AND':
308 prop_desc
= ' <corrupt length: 0x%x>' % sz
310 prop_desc
= describe_note_gnu_property_x86_feature_1(d
)
311 elif t
== 'GNU_PROPERTY_X86_FEATURE_2_USED':
313 prop_desc
= ' <corrupt length: 0x%x>' % sz
315 prop_desc
= describe_note_gnu_property_x86_feature_2_used(d
)
316 elif t
== 'GNU_PROPERTY_X86_ISA_1_NEEDED':
318 prop_desc
= ' <corrupt length: 0x%x>' % sz
320 prop_desc
= describe_note_gnu_property_x86_isa_1(d
, "needed")
321 elif t
== 'GNU_PROPERTY_X86_ISA_1_USED':
323 prop_desc
= ' <corrupt length: 0x%x>' % sz
325 prop_desc
= describe_note_gnu_property_x86_isa_1(d
, "used")
326 elif _DESCR_NOTE_GNU_PROPERTY_TYPE_LOPROC
<= t
<= _DESCR_NOTE_GNU_PROPERTY_TYPE_HIPROC
:
327 prop_desc
= '<processor-specific type 0x%x data: %s >' % (t
, bytes2hex(d
, sep
=' '))
328 elif _DESCR_NOTE_GNU_PROPERTY_TYPE_LOUSER
<= t
<= _DESCR_NOTE_GNU_PROPERTY_TYPE_HIUSER
:
329 prop_desc
= '<application-specific type 0x%x data: %s >' % (t
, bytes2hex(d
, sep
=' '))
331 prop_desc
= '<unknown type 0x%x data: %s >' % (t
, bytes2hex(d
, sep
=' '))
332 descriptions
.append(prop_desc
)
333 return '\n '.join(descriptions
)
335 #-------------------------------------------------------------------------------
336 _unknown
= '<unknown>'
339 _DESCR_EI_CLASS
= dict(
346 _DESCR_EI_DATA
= dict(
348 ELFDATA2LSB
="2's complement, little endian",
349 ELFDATA2MSB
="2's complement, big endian",
353 _DESCR_EI_OSABI
= dict(
354 ELFOSABI_SYSV
='UNIX - System V',
355 ELFOSABI_HPUX
='UNIX - HP-UX',
356 ELFOSABI_NETBSD
='UNIX - NetBSD',
357 ELFOSABI_LINUX
='UNIX - Linux',
358 ELFOSABI_HURD
='UNIX - GNU/Hurd',
359 ELFOSABI_SOLARIS
='UNIX - Solaris',
360 ELFOSABI_AIX
='UNIX - AIX',
361 ELFOSABI_IRIX
='UNIX - IRIX',
362 ELFOSABI_FREEBSD
='UNIX - FreeBSD',
363 ELFOSABI_TRU64
='UNIX - TRU64',
364 ELFOSABI_MODESTO
='Novell - Modesto',
365 ELFOSABI_OPENBSD
='UNIX - OpenBSD',
366 ELFOSABI_OPENVMS
='VMS - OpenVMS',
367 ELFOSABI_NSK
='HP - Non-Stop Kernel',
368 ELFOSABI_AROS
='AROS',
369 ELFOSABI_FENIXOS
='Fenix OS',
370 ELFOSABI_CLOUD
='Nuxi - CloudABI',
371 ELFOSABI_SORTIX
='Sortix',
372 ELFOSABI_ARM_AEABI
='ARM - EABI',
373 ELFOSABI_ARM
='ARM - ABI',
374 ELFOSABI_CELL_LV2
='CellOS Lv-2',
375 ELFOSABI_STANDALONE
='Standalone App',
379 _DESCR_E_TYPE
= dict(
380 ET_NONE
='NONE (None)',
381 ET_REL
='REL (Relocatable file)',
382 ET_EXEC
='EXEC (Executable file)',
383 ET_DYN
='DYN (Shared object file)',
384 ET_CORE
='CORE (Core file)',
385 PROC_SPECIFIC
='Processor Specific',
389 _DESCR_E_MACHINE
= dict(
393 EM_386
='Intel 80386',
396 EM_860
='Intel 80860',
397 EM_MIPS
='MIPS R3000',
398 EM_S370
='IBM System/370',
399 EM_MIPS_RS4_BE
='MIPS 4000 big-endian',
400 EM_IA_64
='Intel IA-64',
401 EM_X86_64
='Advanced Micro Devices X86-64',
402 EM_AVR
='Atmel AVR 8-bit microcontroller',
404 EM_AARCH64
='AArch64',
405 EM_BLACKFIN
='Analog Devices Blackfin',
407 EM_PPC64
='PowerPC64',
409 EM_LOONGARCH
='LoongArch',
414 _DESCR_P_TYPE
= dict(
417 PT_DYNAMIC
='DYNAMIC',
422 PT_GNU_EH_FRAME
='GNU_EH_FRAME',
423 PT_GNU_STACK
='GNU_STACK',
424 PT_GNU_RELRO
='GNU_RELRO',
425 PT_GNU_PROPERTY
='GNU_PROPERTY',
426 PT_ARM_ARCHEXT
='ARM_ARCHEXT',
427 PT_ARM_EXIDX
='EXIDX', # binutils calls this EXIDX, not ARM_EXIDX
428 PT_AARCH64_ARCHEXT
='AARCH64_ARCHEXT',
429 PT_AARCH64_UNWIND
='AARCH64_UNWIND',
431 PT_MIPS_ABIFLAGS
='ABIFLAGS',
432 PT_RISCV_ATTRIBUTES
='RISCV_ATTRIBUT',
443 _DESCR_SH_TYPE
= dict(
445 SHT_PROGBITS
='PROGBITS',
450 SHT_DYNAMIC
='DYNAMIC',
456 SHT_INIT_ARRAY
='INIT_ARRAY',
457 SHT_FINI_ARRAY
='FINI_ARRAY',
458 SHT_PREINIT_ARRAY
='PREINIT_ARRAY',
459 SHT_GNU_ATTRIBUTES
='GNU_ATTRIBUTES',
460 SHT_GNU_HASH
='GNU_HASH',
462 SHT_SYMTAB_SHNDX
='SYMTAB SECTION INDICIES',
464 SHT_GNU_verdef
='VERDEF',
465 SHT_GNU_verneed
='VERNEED',
466 SHT_GNU_versym
='VERSYM',
467 SHT_GNU_LIBLIST
='GNU_LIBLIST',
468 SHT_ARM_EXIDX
='ARM_EXIDX',
469 SHT_ARM_PREEMPTMAP
='ARM_PREEMPTMAP',
470 SHT_ARM_ATTRIBUTES
='ARM_ATTRIBUTES',
471 SHT_ARM_DEBUGOVERLAY
='ARM_DEBUGOVERLAY',
472 SHT_RISCV_ATTRIBUTES
='RISCV_ATTRIBUTES',
473 SHT_MIPS_LIBLIST
='MIPS_LIBLIST',
474 SHT_MIPS_DEBUG
='MIPS_DEBUG',
475 SHT_MIPS_REGINFO
='MIPS_REGINFO',
476 SHT_MIPS_PACKAGE
='MIPS_PACKAGE',
477 SHT_MIPS_PACKSYM
='MIPS_PACKSYM',
478 SHT_MIPS_RELD
='MIPS_RELD',
479 SHT_MIPS_IFACE
='MIPS_IFACE',
480 SHT_MIPS_CONTENT
='MIPS_CONTENT',
481 SHT_MIPS_OPTIONS
='MIPS_OPTIONS',
482 SHT_MIPS_SHDR
='MIPS_SHDR',
483 SHT_MIPS_FDESC
='MIPS_FDESC',
484 SHT_MIPS_EXTSYM
='MIPS_EXTSYM',
485 SHT_MIPS_DENSE
='MIPS_DENSE',
486 SHT_MIPS_PDESC
='MIPS_PDESC',
487 SHT_MIPS_LOCSYM
='MIPS_LOCSYM',
488 SHT_MIPS_AUXSYM
='MIPS_AUXSYM',
489 SHT_MIPS_OPTSYM
='MIPS_OPTSYM',
490 SHT_MIPS_LOCSTR
='MIPS_LOCSTR',
491 SHT_MIPS_LINE
='MIPS_LINE',
492 SHT_MIPS_RFDESC
='MIPS_RFDESC',
493 SHT_MIPS_DELTASYM
='MIPS_DELTASYM',
494 SHT_MIPS_DELTAINST
='MIPS_DELTAINST',
495 SHT_MIPS_DELTACLASS
='MIPS_DELTACLASS',
496 SHT_MIPS_DWARF
='MIPS_DWARF',
497 SHT_MIPS_DELTADECL
='MIPS_DELTADECL',
498 SHT_MIPS_SYMBOL_LIB
='MIPS_SYMBOL_LIB',
499 SHT_MIPS_EVENTS
='MIPS_EVENTS',
500 SHT_MIPS_TRANSLATE
='MIPS_TRANSLATE',
501 SHT_MIPS_PIXIE
='MIPS_PIXIE',
502 SHT_MIPS_XLATE
='MIPS_XLATE',
503 SHT_MIPS_XLATE_DEBUG
='MIPS_XLATE_DEBUG',
504 SHT_MIPS_WHIRL
='MIPS_WHIRL',
505 SHT_MIPS_EH_REGION
='MIPS_EH_REGION',
506 SHT_MIPS_XLATE_OLD
='MIPS_XLATE_OLD',
507 SHT_MIPS_PDR_EXCEPTION
='MIPS_PDR_EXCEPTION',
508 SHT_MIPS_ABIFLAGS
='MIPS_ABIFLAGS',
513 SH_FLAGS
.SHF_WRITE
: 'W',
514 SH_FLAGS
.SHF_ALLOC
: 'A',
515 SH_FLAGS
.SHF_EXECINSTR
: 'X',
516 SH_FLAGS
.SHF_MERGE
: 'M',
517 SH_FLAGS
.SHF_STRINGS
: 'S',
518 SH_FLAGS
.SHF_INFO_LINK
: 'I',
519 SH_FLAGS
.SHF_LINK_ORDER
: 'L',
520 SH_FLAGS
.SHF_OS_NONCONFORMING
: 'O',
521 SH_FLAGS
.SHF_GROUP
: 'G',
522 SH_FLAGS
.SHF_TLS
: 'T',
523 SH_FLAGS
.SHF_MASKOS
: 'o',
524 SH_FLAGS
.SHF_EXCLUDE
: 'E',
529 RH_FLAGS
.RHF_NONE
: 'NONE',
530 RH_FLAGS
.RHF_QUICKSTART
: 'QUICKSTART',
531 RH_FLAGS
.RHF_NOTPOT
: 'NOTPOT',
532 RH_FLAGS
.RHF_NO_LIBRARY_REPLACEMENT
: 'NO_LIBRARY_REPLACEMENT',
533 RH_FLAGS
.RHF_NO_MOVE
: 'NO_MOVE',
534 RH_FLAGS
.RHF_SGI_ONLY
: 'SGI_ONLY',
535 RH_FLAGS
.RHF_GUARANTEE_INIT
: 'GUARANTEE_INIT',
536 RH_FLAGS
.RHF_DELTA_C_PLUS_PLUS
: 'DELTA_C_PLUS_PLUS',
537 RH_FLAGS
.RHF_GUARANTEE_START_INIT
: 'GUARANTEE_START_INIT',
538 RH_FLAGS
.RHF_PIXIE
: 'PIXIE',
539 RH_FLAGS
.RHF_DEFAULT_DELAY_LOAD
: 'DEFAULT_DELAY_LOAD',
540 RH_FLAGS
.RHF_REQUICKSTART
: 'REQUICKSTART',
541 RH_FLAGS
.RHF_REQUICKSTARTED
: 'REQUICKSTARTED',
542 RH_FLAGS
.RHF_CORD
: 'CORD',
543 RH_FLAGS
.RHF_NO_UNRES_UNDEF
: 'NO_UNRES_UNDEF',
544 RH_FLAGS
.RHF_RLD_ORDER_SAFE
: 'RLD_ORDER_SAFE',
548 _DESCR_ST_INFO_TYPE
= dict(
552 STT_SECTION
='SECTION',
562 _DESCR_ST_INFO_BIND
= dict(
569 _DESCR_ST_VISIBILITY
= dict(
570 STV_DEFAULT
='DEFAULT',
571 STV_INTERNAL
='INTERNAL',
573 STV_PROTECTED
='PROTECTED',
574 STV_EXPORTED
='EXPORTED',
575 STV_SINGLETON
='SINGLETON',
576 STV_ELIMINATE
='ELIMINATE',
580 _DESCR_ST_SHNDX
= dict(
587 _DESCR_SYMINFO_FLAGS
= {
588 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DIRECT
: 'D',
589 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DIRECTBIND
: 'B',
590 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_COPY
: 'C',
591 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_LAZYLOAD
: 'L',
592 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_NOEXTDIRECT
: 'N',
593 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_AUXILIARY
: 'A',
594 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_FILTER
: 'F',
595 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_INTERPOSE
: 'I',
596 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_CAP
: 'S',
597 SUNW_SYMINFO_FLAGS
.SYMINFO_FLG_DEFERRED
: 'P',
601 _DESCR_SYMINFO_BOUNDTO
= dict(
602 SYMINFO_BT_SELF
='<self>',
603 SYMINFO_BT_PARENT
='<parent>',
605 SYMINFO_BT_EXTERN
='<extern>',
611 VER_FLAGS
.VER_FLG_BASE
: 'BASE',
612 VER_FLAGS
.VER_FLG_WEAK
: 'WEAK',
613 VER_FLAGS
.VER_FLG_INFO
: 'INFO',
617 # PT_NOTE section types
618 _DESCR_NOTE_N_TYPE
= dict(
619 NT_GNU_ABI_TAG
='ABI version tag',
620 NT_GNU_HWCAP
='DSO-supplied software HWCAP info',
621 NT_GNU_BUILD_ID
='unique build ID bitstring',
622 NT_GNU_GOLD_VERSION
='gold version',
623 NT_GNU_PROPERTY_TYPE_0
='program properties'
627 # Values in GNU .note.ABI-tag notes (n_type=='NT_GNU_ABI_TAG')
628 _DESCR_NOTE_ABI_TAG_OS
= dict(
629 ELF_NOTE_OS_LINUX
='Linux',
630 ELF_NOTE_OS_GNU
='GNU',
631 ELF_NOTE_OS_SOLARIS2
='Solaris 2',
632 ELF_NOTE_OS_FREEBSD
='FreeBSD',
633 ELF_NOTE_OS_NETBSD
='NetBSD',
634 ELF_NOTE_OS_SYLLABLE
='Syllable',
638 # Values in GNU .note.gnu.property notes (n_type=='NT_GNU_PROPERTY_TYPE_0') have
639 # different formats which need to be parsed/described differently
640 _DESCR_NOTE_GNU_PROPERTY_TYPE_LOPROC
=0xc0000000
641 _DESCR_NOTE_GNU_PROPERTY_TYPE_HIPROC
=0xdfffffff
642 _DESCR_NOTE_GNU_PROPERTY_TYPE_LOUSER
=0xe0000000
643 _DESCR_NOTE_GNU_PROPERTY_TYPE_HIUSER
=0xffffffff
646 # Bit masks for GNU_PROPERTY_X86_FEATURE_1_xxx flags in the form
647 # (mask, flag_description) in the desired output order
648 _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_1_FLAGS
= (
655 # Bit masks for GNU_PROPERTY_X86_FEATURE_2_xxx flags in the form
656 # (mask, flag_description) in the desired output order
657 _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_2_FLAGS
= (
666 # Same for GNU_PROPERTY_X86_SET_1_xxx
667 _DESCR_NOTE_GNU_PROPERTY_X86_ISA_1_FLAGS
= (
668 (1, 'x86-64-baseline'),
669 # TODO; there is a long list
673 def _reverse_dict(d
, low_priority
=()):
675 This is a tiny helper function to "reverse" the keys/values of a dictionary
676 provided in the first argument, i.e. {k: v} becomes {v: k}.
678 The second argument (optional) provides primitive control over what to do in
679 the case of conflicting values - if a value is present in this list, it will
680 not override any other entries of the same value.
683 for k
, v
in d
.items():
684 if v
in out
and k
in low_priority
:
689 _DESCR_RELOC_TYPE_i386
= _reverse_dict(ENUM_RELOC_TYPE_i386
)
690 _DESCR_RELOC_TYPE_x64
= _reverse_dict(ENUM_RELOC_TYPE_x64
)
691 _DESCR_RELOC_TYPE_ARM
= _reverse_dict(ENUM_RELOC_TYPE_ARM
)
692 _DESCR_RELOC_TYPE_AARCH64
= _reverse_dict(ENUM_RELOC_TYPE_AARCH64
)
693 _DESCR_RELOC_TYPE_PPC64
= _reverse_dict(ENUM_RELOC_TYPE_PPC64
)
694 _DESCR_RELOC_TYPE_MIPS
= _reverse_dict(ENUM_RELOC_TYPE_MIPS
)
695 _DESCR_RELOC_TYPE_LOONGARCH
= _reverse_dict(ENUM_RELOC_TYPE_LOONGARCH
)
697 _low_priority_D_TAG
= (
698 # these are 'meta-tags' marking semantics of numeric ranges of the enum
699 # they should not override other tags with the same numbers
700 # see https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-42444.html
707 _DESCR_D_TAG
= _reverse_dict(ENUM_D_TAG
, low_priority
=_low_priority_D_TAG
)
709 _DESCR_ATTR_TAG_ARM
= dict(
710 TAG_FILE
='File Attributes',
711 TAG_SECTION
='Section Attributes:',
712 TAG_SYMBOL
='Symbol Attributes:',
713 TAG_CPU_RAW_NAME
='Tag_CPU_raw_name: ',
714 TAG_CPU_NAME
='Tag_CPU_name: ',
715 TAG_CPU_ARCH
='Tag_CPU_arch: ',
716 TAG_CPU_ARCH_PROFILE
='Tag_CPU_arch_profile: ',
717 TAG_ARM_ISA_USE
='Tag_ARM_ISA_use: ',
718 TAG_THUMB_ISA_USE
='Tag_Thumb_ISA_use: ',
719 TAG_FP_ARCH
='Tag_FP_arch: ',
720 TAG_WMMX_ARCH
='Tag_WMMX_arch: ',
721 TAG_ADVANCED_SIMD_ARCH
='Tag_Advanced_SIMD_arch: ',
722 TAG_PCS_CONFIG
='Tag_PCS_config: ',
723 TAG_ABI_PCS_R9_USE
='Tag_ABI_PCS_R9_use: ',
724 TAG_ABI_PCS_RW_DATA
='Tag_ABI_PCS_RW_use: ',
725 TAG_ABI_PCS_RO_DATA
='Tag_ABI_PCS_RO_use: ',
726 TAG_ABI_PCS_GOT_USE
='Tag_ABI_PCS_GOT_use: ',
727 TAG_ABI_PCS_WCHAR_T
='Tag_ABI_PCS_wchar_t: ',
728 TAG_ABI_FP_ROUNDING
='Tag_ABI_FP_rounding: ',
729 TAG_ABI_FP_DENORMAL
='Tag_ABI_FP_denormal: ',
730 TAG_ABI_FP_EXCEPTIONS
='Tag_ABI_FP_exceptions: ',
731 TAG_ABI_FP_USER_EXCEPTIONS
='Tag_ABI_FP_user_exceptions: ',
732 TAG_ABI_FP_NUMBER_MODEL
='Tag_ABI_FP_number_model: ',
733 TAG_ABI_ALIGN_NEEDED
='Tag_ABI_align_needed: ',
734 TAG_ABI_ALIGN_PRESERVED
='Tag_ABI_align_preserved: ',
735 TAG_ABI_ENUM_SIZE
='Tag_ABI_enum_size: ',
736 TAG_ABI_HARDFP_USE
='Tag_ABI_HardFP_use: ',
737 TAG_ABI_VFP_ARGS
='Tag_ABI_VFP_args: ',
738 TAG_ABI_WMMX_ARGS
='Tag_ABI_WMMX_args: ',
739 TAG_ABI_OPTIMIZATION_GOALS
='Tag_ABI_optimization_goals: ',
740 TAG_ABI_FP_OPTIMIZATION_GOALS
='Tag_ABI_FP_optimization_goals: ',
741 TAG_COMPATIBILITY
='Tag_compatibility: ',
742 TAG_CPU_UNALIGNED_ACCESS
='Tag_CPU_unaligned_access: ',
743 TAG_FP_HP_EXTENSION
='Tag_FP_HP_extension: ',
744 TAG_ABI_FP_16BIT_FORMAT
='Tag_ABI_FP_16bit_format: ',
745 TAG_MPEXTENSION_USE
='Tag_MPextension_use: ',
746 TAG_DIV_USE
='Tag_DIV_use: ',
747 TAG_NODEFAULTS
='Tag_nodefaults: ',
748 TAG_ALSO_COMPATIBLE_WITH
='Tag_also_compatible_with: ',
749 TAG_T2EE_USE
='Tag_T2EE_use: ',
750 TAG_CONFORMANCE
='Tag_conformance: ',
751 TAG_VIRTUALIZATION_USE
='Tag_Virtualization_use: ',
752 TAG_MPEXTENSION_USE_OLD
='Tag_MPextension_use_old: ',
755 _DESCR_ATTR_VAL_ARM
= [
781 { #7 TAG_CPU_ARCH_PROFILE
785 0x4D: 'Microcontroller',
786 0x53: 'Application or Realtime',
807 8: 'FPv5/FP-D16 for ARMv8',
814 { #12 TAG_ADVANCED_SIMD_ARCH
817 2: 'NEONv1 with Fused-MAC',
819 4: 'NEON for ARMv8.1',
824 2: 'Linux application',
827 5: 'PalmOS (reserved)',
829 7: 'SymbianOS (reserved)',
831 { #14 TAG_ABI_PCS_R9_USE
837 { #15 TAG_ABI_PCS_RW_DATA
843 { #16 TAG_ABI_PCS_RO_DATA
848 { #17 TAG_ABI_PCS_GOT_USE
853 { #18 TAG_ABI_PCS_WCHAR_T
860 { #19 TAG_ABI_FP_ROUNDING
864 { #20 TAG_ABI_FP_DENORMAL
869 { #21 TAG_ABI_FP_EXCEPTIONS
873 { #22 TAG_ABI_FP_USER_EXCEPTIONS
877 { #23 TAG_ABI_FP_NUMBER_MODEL
883 { #24 TAG_ABI_ALIGN_NEEDED
889 { #25 TAG_ABI_ALIGN_PRESERVED
891 1: '8-byte, except leaf SP',
895 { #26 TAG_ABI_ENUM_SIZE
901 { #27 TAG_ABI_HARDFP_USE
907 { #28 TAG_ABI_VFP_ARGS
913 { #29 TAG_ABI_WMMX_ARGS
918 { #30 TAG_ABI_OPTIMIZATION_GOALS
921 2: 'Aggressive Speed',
923 4: 'Aggressive Size',
925 6: 'Aggressive Debug',
927 { #31 TAG_ABI_FP_OPTIMIZATION_GOALS
930 2: 'Aggressive Speed',
932 4: 'Aggressive Size',
933 5: 'Prefer Accuracy',
934 6: 'Aggressive Accuracy',
936 { #32 TAG_COMPATIBILITY
941 { #34 TAG_CPU_UNALIGNED_ACCESS
946 { #36 TAG_FP_HP_EXTENSION
951 { #38 TAG_ABI_FP_16BIT_FORMAT
954 2: 'Alternative Format',
959 { #42 TAG_MPEXTENSION_USE
965 0: 'Allowed in Thumb-ISA, v7-R or v7-M',
967 2: 'Allowed in v7-A with integer division extension',
990 { #66 TAG_FP_HP_EXTENSION
995 { #68 TAG_VIRTUALIZATION_USE
998 2: 'Virtualization Extensions',
999 3: 'TrustZone and Virtualization Extensions',
1002 { #70 TAG_MPEXTENSION_USE_OLD
1008 _DESCR_ATTR_TAG_RISCV
= dict(
1009 TAG_FILE
='File Attributes',
1010 TAG_SECTION
='Section Attributes:',
1011 TAG_SYMBOL
='Symbol Attributes:',
1012 TAG_STACK_ALIGN
='Tag_RISCV_stack_align: ',
1013 TAG_ARCH
='Tag_RISCV_arch: ',
1014 TAG_UNALIGNED
='Tag_RISCV_unaligned_access: ',
1017 _DESCR_ATTR_VAL_RISCV
= [
1021 { #4 TAG_RISCV_stack_align
1025 None, #5 TAG_RISCV_arch
1026 { #6 TAG_RISCV_unaligned_access