8458461a5857d1bd1ee98054f7ade314b8262339
[pyelftools.git] / elftools / elf / descriptions.py
1 #-------------------------------------------------------------------------------
2 # elftools: elf/descriptions.py
3 #
4 # Textual descriptions of the various enums and flags of ELF
5 #
6 # Eli Bendersky (eliben@gmail.com)
7 # This code is in the public domain
8 #-------------------------------------------------------------------------------
9 from .enums import (
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
18
19
20 def describe_ei_class(x):
21 return _DESCR_EI_CLASS.get(x, _unknown)
22
23
24 def describe_ei_data(x):
25 return _DESCR_EI_DATA.get(x, _unknown)
26
27
28 def describe_ei_version(x):
29 s = '%d' % ENUM_E_VERSION[x]
30 if x == 'EV_CURRENT':
31 s += ' (current)'
32 return s
33
34
35 def describe_ei_osabi(x):
36 return _DESCR_EI_OSABI.get(x, _unknown)
37
38
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)
47
48
49 def describe_e_machine(x):
50 return _DESCR_E_MACHINE.get(x, _unknown)
51
52
53 def describe_e_version_numeric(x):
54 return '0x%x' % ENUM_E_VERSION[x]
55
56
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'])
62 else:
63 return _unknown
64
65
66 def describe_p_flags(x):
67 s = ''
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 ' '
70 return s
71
72
73 def describe_rh_flags(x):
74 return ' '.join(
75 _DESCR_RH_FLAGS[flag]
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)
86 if x & flag)
87
88
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'])
95 else:
96 return _unknown
97
98
99 def describe_sh_flags(x):
100 s = ''
101 for flag in (
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:
110 s += 'p'
111 return s
112
113
114 def describe_symbol_type(x):
115 return _DESCR_ST_INFO_TYPE.get(x, _unknown)
116
117
118 def describe_symbol_bind(x):
119 return _DESCR_ST_INFO_BIND.get(x, _unknown)
120
121
122 def describe_symbol_visibility(x):
123 return _DESCR_ST_VISIBILITY.get(x, _unknown)
124
125
126 def describe_symbol_local(x):
127 return '[<localentry>: ' + str(1 << x) + ']'
128
129
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'])
134 return vis
135
136
137 def describe_symbol_shndx(x):
138 return _DESCR_ST_SHNDX.get(x, '%3s' % x)
139
140
141 def describe_reloc_type(x, elffile):
142 arch = elffile.get_machine_arch()
143 if arch == 'x86':
144 return _DESCR_RELOC_TYPE_i386.get(x, _unknown)
145 elif arch == 'x64':
146 return _DESCR_RELOC_TYPE_x64.get(x, _unknown)
147 elif arch == 'ARM':
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)
153 elif arch == 'MIPS':
154 return _DESCR_RELOC_TYPE_MIPS.get(x, _unknown)
155 elif arch == 'LoongArch':
156 return _DESCR_RELOC_TYPE_LOONGARCH.get(x, _unknown)
157 else:
158 return 'unrecognized: %-7x' % (x & 0xFFFFFFFF)
159
160
161 def describe_dyn_tag(x):
162 return _DESCR_D_TAG.get(x, _unknown)
163
164
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)
168
169
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)
173
174
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)
187
188
189 def describe_symbol_boundto(x):
190 return _DESCR_SYMINFO_BOUNDTO.get(x, '%3s' % x)
191
192
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)
198
199
200 def describe_note(x):
201 n_desc = x['n_desc']
202 desc = ''
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'])
206 else:
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'])
216 else:
217 desc = '\n description data: {}'.format(bytes2hex(n_desc))
218
219 if x['n_type'] == 'NT_GNU_ABI_TAG' and x['n_name'] == 'Android':
220 note_type = 'NT_VERSION'
221 note_type_desc = 'version'
222 else:
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)
229
230
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]
234
235 if d_entry is None:
236 if tag == 'TAG_COMPATIBILITY':
237 return (_DESCR_ATTR_TAG_ARM[tag]
238 + 'flag = %d, vendor = %s' % (val, extra))
239
240 elif tag == 'TAG_ALSO_COMPATIBLE_WITH':
241 if val.tag == 'TAG_CPU_ARCH':
242 return _DESCR_ATTR_TAG_ARM[tag] + d_entry[val]
243
244 else:
245 return _DESCR_ATTR_TAG_ARM[tag] + '??? (%d)' % val.tag
246
247 elif tag == 'TAG_NODEFAULTS':
248 return _DESCR_ATTR_TAG_ARM[tag] + 'True'
249
250 s = _DESCR_ATTR_TAG_ARM[tag]
251 s += '"%s"' % val if val else ''
252 return s
253
254 else:
255 return _DESCR_ATTR_TAG_ARM[tag] + d_entry[val]
256
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]
260
261 if d_entry is None:
262 s = _DESCR_ATTR_TAG_RISCV[tag]
263 s += '"%s"' % val if val else ''
264 return s
265
266 else:
267 return _DESCR_ATTR_TAG_RISCV[tag] + d_entry[val]
268
269
270
271 def describe_note_gnu_property_x86_feature_1(value):
272 descs = []
273 for mask, desc in _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_1_FLAGS:
274 if value & mask:
275 descs.append(desc)
276 return 'x86 feature: ' + ', '.join(descs)
277
278 def describe_note_gnu_property_x86_feature_2_used(value):
279 descs = []
280 for mask, desc in _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_2_FLAGS:
281 if value & mask:
282 descs.append(desc)
283 return 'x86 feature used: ' + ', '.join(descs)
284
285 def describe_note_gnu_property_x86_isa_1(value, verb):
286 descs = []
287 for mask, desc in _DESCR_NOTE_GNU_PROPERTY_X86_ISA_1_FLAGS:
288 if value & mask:
289 descs.append(desc)
290 return 'x86 ISA %s: %s' % (verb, ', '.join(descs))
291
292 def describe_note_gnu_properties(properties):
293 descriptions = []
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':
297 if type(d) is int:
298 prop_desc = 'stack size: 0x%x' % d
299 else:
300 prop_desc = 'stack size: <corrupt length: 0x%x>' % sz
301 elif t == 'GNU_PROPERTY_NO_COPY_ON_PROTECTED':
302 if sz != 0:
303 prop_desc = ' <corrupt length: 0x%x>' % sz
304 else:
305 prop_desc = 'no copy on protected'
306 elif t == 'GNU_PROPERTY_X86_FEATURE_1_AND':
307 if sz != 4:
308 prop_desc = ' <corrupt length: 0x%x>' % sz
309 else:
310 prop_desc = describe_note_gnu_property_x86_feature_1(d)
311 elif t == 'GNU_PROPERTY_X86_FEATURE_2_USED':
312 if sz != 4:
313 prop_desc = ' <corrupt length: 0x%x>' % sz
314 else:
315 prop_desc = describe_note_gnu_property_x86_feature_2_used(d)
316 elif t == 'GNU_PROPERTY_X86_ISA_1_NEEDED':
317 if sz != 4:
318 prop_desc = ' <corrupt length: 0x%x>' % sz
319 else:
320 prop_desc = describe_note_gnu_property_x86_isa_1(d, "needed")
321 elif t == 'GNU_PROPERTY_X86_ISA_1_USED':
322 if sz != 4:
323 prop_desc = ' <corrupt length: 0x%x>' % sz
324 else:
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=' '))
330 else:
331 prop_desc = '<unknown type 0x%x data: %s >' % (t, bytes2hex(d, sep=' '))
332 descriptions.append(prop_desc)
333 return '\n '.join(descriptions)
334
335 #-------------------------------------------------------------------------------
336 _unknown = '<unknown>'
337
338
339 _DESCR_EI_CLASS = dict(
340 ELFCLASSNONE='none',
341 ELFCLASS32='ELF32',
342 ELFCLASS64='ELF64',
343 )
344
345
346 _DESCR_EI_DATA = dict(
347 ELFDATANONE='none',
348 ELFDATA2LSB="2's complement, little endian",
349 ELFDATA2MSB="2's complement, big endian",
350 )
351
352
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',
376 )
377
378
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',
386 )
387
388
389 _DESCR_E_MACHINE = dict(
390 EM_NONE='None',
391 EM_M32='WE32100',
392 EM_SPARC='Sparc',
393 EM_386='Intel 80386',
394 EM_68K='MC68000',
395 EM_88K='MC88000',
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',
403 EM_ARM='ARM',
404 EM_AARCH64='AArch64',
405 EM_BLACKFIN='Analog Devices Blackfin',
406 EM_PPC='PowerPC',
407 EM_PPC64='PowerPC64',
408 EM_RISCV='RISC-V',
409 EM_LOONGARCH='LoongArch',
410 RESERVED='RESERVED',
411 )
412
413
414 _DESCR_P_TYPE = dict(
415 PT_NULL='NULL',
416 PT_LOAD='LOAD',
417 PT_DYNAMIC='DYNAMIC',
418 PT_INTERP='INTERP',
419 PT_NOTE='NOTE',
420 PT_SHLIB='SHLIB',
421 PT_PHDR='PHDR',
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',
430 PT_TLS='TLS',
431 PT_MIPS_ABIFLAGS='ABIFLAGS',
432 PT_RISCV_ATTRIBUTES='RISCV_ATTRIBUT',
433 )
434
435
436 _DESCR_P_FLAGS = {
437 P_FLAGS.PF_X: 'E',
438 P_FLAGS.PF_R: 'R',
439 P_FLAGS.PF_W: 'W',
440 }
441
442
443 _DESCR_SH_TYPE = dict(
444 SHT_NULL='NULL',
445 SHT_PROGBITS='PROGBITS',
446 SHT_SYMTAB='SYMTAB',
447 SHT_STRTAB='STRTAB',
448 SHT_RELA='RELA',
449 SHT_HASH='HASH',
450 SHT_DYNAMIC='DYNAMIC',
451 SHT_NOTE='NOTE',
452 SHT_NOBITS='NOBITS',
453 SHT_REL='REL',
454 SHT_SHLIB='SHLIB',
455 SHT_DYNSYM='DYNSYM',
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',
461 SHT_GROUP='GROUP',
462 SHT_SYMTAB_SHNDX='SYMTAB SECTION INDICIES',
463 SHT_RELR='RELR',
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',
509 )
510
511
512 _DESCR_SH_FLAGS = {
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',
525 }
526
527
528 _DESCR_RH_FLAGS = {
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',
545 }
546
547
548 _DESCR_ST_INFO_TYPE = dict(
549 STT_NOTYPE='NOTYPE',
550 STT_OBJECT='OBJECT',
551 STT_FUNC='FUNC',
552 STT_SECTION='SECTION',
553 STT_FILE='FILE',
554 STT_COMMON='COMMON',
555 STT_TLS='TLS',
556 STT_NUM='NUM',
557 STT_RELC='RELC',
558 STT_SRELC='SRELC',
559 )
560
561
562 _DESCR_ST_INFO_BIND = dict(
563 STB_LOCAL='LOCAL',
564 STB_GLOBAL='GLOBAL',
565 STB_WEAK='WEAK',
566 )
567
568
569 _DESCR_ST_VISIBILITY = dict(
570 STV_DEFAULT='DEFAULT',
571 STV_INTERNAL='INTERNAL',
572 STV_HIDDEN='HIDDEN',
573 STV_PROTECTED='PROTECTED',
574 STV_EXPORTED='EXPORTED',
575 STV_SINGLETON='SINGLETON',
576 STV_ELIMINATE='ELIMINATE',
577 )
578
579
580 _DESCR_ST_SHNDX = dict(
581 SHN_UNDEF='UND',
582 SHN_ABS='ABS',
583 SHN_COMMON='COM',
584 )
585
586
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',
598 }
599
600
601 _DESCR_SYMINFO_BOUNDTO = dict(
602 SYMINFO_BT_SELF='<self>',
603 SYMINFO_BT_PARENT='<parent>',
604 SYMINFO_BT_NONE='',
605 SYMINFO_BT_EXTERN='<extern>',
606 )
607
608
609 _DESCR_VER_FLAGS = {
610 0: '',
611 VER_FLAGS.VER_FLG_BASE: 'BASE',
612 VER_FLAGS.VER_FLG_WEAK: 'WEAK',
613 VER_FLAGS.VER_FLG_INFO: 'INFO',
614 }
615
616
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'
624 )
625
626
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',
635 )
636
637
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
644
645
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 = (
649 (1, 'IBT'),
650 (2, 'SHSTK'),
651 (4, 'LAM_U48'),
652 (8, 'LAM_U57'),
653 )
654
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 = (
658 (1, 'x86'),
659 (2, 'x87'),
660 (4, 'MMX'),
661 (8, 'XMM'),
662 (16, 'YMM'),
663 (32, 'ZMM'),
664 )
665
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
670 )
671
672
673 def _reverse_dict(d, low_priority=()):
674 """
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}.
677
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.
681 """
682 out = {}
683 for k, v in d.items():
684 if v in out and k in low_priority:
685 continue
686 out[v] = k
687 return out
688
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)
696
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
701 'DT_LOOS',
702 'DT_HIOS',
703 'DT_LOPROC',
704 'DT_HIPROC',
705 'DT_ENCODING',
706 )
707 _DESCR_D_TAG = _reverse_dict(ENUM_D_TAG, low_priority=_low_priority_D_TAG)
708
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: ',
753 )
754
755 _DESCR_ATTR_VAL_ARM = [
756 None, #1
757 None, #2
758 None, #3
759 None, #4
760 None, #5
761 { #6 TAG_CPU_ARCH
762 0 : 'Pre-v4',
763 1 : 'v4',
764 2 : 'v4T',
765 3 : 'v5T',
766 4 : 'v5TE',
767 5 : 'v5TEJ',
768 6 : 'v6',
769 7 : 'v6KZ',
770 8 : 'v6T2',
771 9 : 'v6K',
772 10: 'v7',
773 11: 'v6-M',
774 12: 'v6S-M',
775 13: 'v7E-M',
776 14: 'v8',
777 15: 'v8-R',
778 16: 'v8-M.baseline',
779 17: 'v8-M.mainline',
780 },
781 { #7 TAG_CPU_ARCH_PROFILE
782 0x00: 'None',
783 0x41: 'Application',
784 0x52: 'Realtime',
785 0x4D: 'Microcontroller',
786 0x53: 'Application or Realtime',
787 },
788 { #8 TAG_ARM_ISA
789 0: 'No',
790 1: 'Yes',
791 },
792 { #9 TAG_THUMB_ISA
793 0: 'No',
794 1: 'Thumb-1',
795 2: 'Thumb-2',
796 3: 'Yes',
797 },
798 { #10 TAG_FP_ARCH
799 0: 'No',
800 1: 'VFPv1',
801 2: 'VFPv2 ',
802 3: 'VFPv3',
803 4: 'VFPv3-D16',
804 5: 'VFPv4',
805 6: 'VFPv4-D16',
806 7: 'FP ARM v8',
807 8: 'FPv5/FP-D16 for ARMv8',
808 },
809 { #11 TAG_WMMX_ARCH
810 0: 'No',
811 1: 'WMMXv1',
812 2: 'WMMXv2',
813 },
814 { #12 TAG_ADVANCED_SIMD_ARCH
815 0: 'No',
816 1: 'NEONv1',
817 2: 'NEONv1 with Fused-MAC',
818 3: 'NEON for ARMv8',
819 4: 'NEON for ARMv8.1',
820 },
821 { #13 TAG_PCS_CONFIG
822 0: 'None',
823 1: 'Bare platform',
824 2: 'Linux application',
825 3: 'Linux DSO',
826 4: 'PalmOS 2004',
827 5: 'PalmOS (reserved)',
828 6: 'SymbianOS 2004',
829 7: 'SymbianOS (reserved)',
830 },
831 { #14 TAG_ABI_PCS_R9_USE
832 0: 'v6',
833 1: 'SB',
834 2: 'TLS',
835 3: 'Unused',
836 },
837 { #15 TAG_ABI_PCS_RW_DATA
838 0: 'Absolute',
839 1: 'PC-relative',
840 2: 'SB-relative',
841 3: 'None',
842 },
843 { #16 TAG_ABI_PCS_RO_DATA
844 0: 'Absolute',
845 1: 'PC-relative',
846 2: 'None',
847 },
848 { #17 TAG_ABI_PCS_GOT_USE
849 0: 'None',
850 1: 'direct',
851 2: 'GOT-indirect',
852 },
853 { #18 TAG_ABI_PCS_WCHAR_T
854 0: 'None',
855 1: '??? 1',
856 2: '2',
857 3: '??? 3',
858 4: '4',
859 },
860 { #19 TAG_ABI_FP_ROUNDING
861 0: 'Unused',
862 1: 'Needed',
863 },
864 { #20 TAG_ABI_FP_DENORMAL
865 0: 'Unused',
866 1: 'Needed',
867 2: 'Sign only',
868 },
869 { #21 TAG_ABI_FP_EXCEPTIONS
870 0: 'Unused',
871 1: 'Needed',
872 },
873 { #22 TAG_ABI_FP_USER_EXCEPTIONS
874 0: 'Unused',
875 1: 'Needed',
876 },
877 { #23 TAG_ABI_FP_NUMBER_MODEL
878 0: 'Unused',
879 1: 'Finite',
880 2: 'RTABI',
881 3: 'IEEE 754',
882 },
883 { #24 TAG_ABI_ALIGN_NEEDED
884 0: 'None',
885 1: '8-byte',
886 2: '4-byte',
887 3: '??? 3',
888 },
889 { #25 TAG_ABI_ALIGN_PRESERVED
890 0: 'None',
891 1: '8-byte, except leaf SP',
892 2: '8-byte',
893 3: '??? 3',
894 },
895 { #26 TAG_ABI_ENUM_SIZE
896 0: 'Unused',
897 1: 'small',
898 2: 'int',
899 3: 'forced to int',
900 },
901 { #27 TAG_ABI_HARDFP_USE
902 0: 'As Tag_FP_arch',
903 1: 'SP only',
904 2: 'Reserved',
905 3: 'Deprecated',
906 },
907 { #28 TAG_ABI_VFP_ARGS
908 0: 'AAPCS',
909 1: 'VFP registers',
910 2: 'custom',
911 3: 'compatible',
912 },
913 { #29 TAG_ABI_WMMX_ARGS
914 0: 'AAPCS',
915 1: 'WMMX registers',
916 2: 'custom',
917 },
918 { #30 TAG_ABI_OPTIMIZATION_GOALS
919 0: 'None',
920 1: 'Prefer Speed',
921 2: 'Aggressive Speed',
922 3: 'Prefer Size',
923 4: 'Aggressive Size',
924 5: 'Prefer Debug',
925 6: 'Aggressive Debug',
926 },
927 { #31 TAG_ABI_FP_OPTIMIZATION_GOALS
928 0: 'None',
929 1: 'Prefer Speed',
930 2: 'Aggressive Speed',
931 3: 'Prefer Size',
932 4: 'Aggressive Size',
933 5: 'Prefer Accuracy',
934 6: 'Aggressive Accuracy',
935 },
936 { #32 TAG_COMPATIBILITY
937 0: 'No',
938 1: 'Yes',
939 },
940 None, #33
941 { #34 TAG_CPU_UNALIGNED_ACCESS
942 0: 'None',
943 1: 'v6',
944 },
945 None, #35
946 { #36 TAG_FP_HP_EXTENSION
947 0: 'Not Allowed',
948 1: 'Allowed',
949 },
950 None, #37
951 { #38 TAG_ABI_FP_16BIT_FORMAT
952 0: 'None',
953 1: 'IEEE 754',
954 2: 'Alternative Format',
955 },
956 None, #39
957 None, #40
958 None, #41
959 { #42 TAG_MPEXTENSION_USE
960 0: 'Not Allowed',
961 1: 'Allowed',
962 },
963 None, #43
964 { #44 TAG_DIV_USE
965 0: 'Allowed in Thumb-ISA, v7-R or v7-M',
966 1: 'Not allowed',
967 2: 'Allowed in v7-A with integer division extension',
968 },
969 None, #45
970 None, #46
971 None, #47
972 None, #48
973 None, #49
974 None, #50
975 None, #51
976 None, #52
977 None, #53
978 None, #54
979 None, #55
980 None, #56
981 None, #57
982 None, #58
983 None, #59
984 None, #60
985 None, #61
986 None, #62
987 None, #63
988 None, #64
989 None, #65
990 { #66 TAG_FP_HP_EXTENSION
991 0: 'Not Allowed',
992 1: 'Allowed',
993 },
994 None, #67
995 { #68 TAG_VIRTUALIZATION_USE
996 0: 'Not Allowed',
997 1: 'TrustZone',
998 2: 'Virtualization Extensions',
999 3: 'TrustZone and Virtualization Extensions',
1000 },
1001 None, #69
1002 { #70 TAG_MPEXTENSION_USE_OLD
1003 0: 'Not Allowed',
1004 1: 'Allowed',
1005 },
1006 ]
1007
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: ',
1015 )
1016
1017 _DESCR_ATTR_VAL_RISCV = [
1018 None, #1
1019 None, #2
1020 None, #3
1021 { #4 TAG_RISCV_stack_align
1022 4: '4-bytes',
1023 16: '16-bytes',
1024 },
1025 None, #5 TAG_RISCV_arch
1026 { #6 TAG_RISCV_unaligned_access
1027 0: 'Not Allowed',
1028 1: 'Allowed',
1029 },
1030 ]