Add support for LoongArch (#470)
[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_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 else:
156 return 'unrecognized: %-7x' % (x & 0xFFFFFFFF)
157
158
159 def describe_dyn_tag(x):
160 return _DESCR_D_TAG.get(x, _unknown)
161
162
163 def describe_dt_flags(x):
164 return ' '.join(key[3:] for key, val in
165 sorted(ENUM_DT_FLAGS.items(), key=lambda t: t[1]) if x & val)
166
167
168 def describe_dt_flags_1(x):
169 return ' '.join(key[5:] for key, val in
170 sorted(ENUM_DT_FLAGS_1.items(), key=lambda t: t[1]) if x & val)
171
172
173 def describe_syminfo_flags(x):
174 return ''.join(_DESCR_SYMINFO_FLAGS[flag] for flag in (
175 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_CAP,
176 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECT,
177 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_FILTER,
178 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_AUXILIARY,
179 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECTBIND,
180 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_COPY,
181 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_LAZYLOAD,
182 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_NOEXTDIRECT,
183 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_INTERPOSE,
184 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DEFERRED) if x & flag)
185
186
187 def describe_symbol_boundto(x):
188 return _DESCR_SYMINFO_BOUNDTO.get(x, '%3s' % x)
189
190
191 def describe_ver_flags(x):
192 return ' | '.join(_DESCR_VER_FLAGS[flag] for flag in (
193 VER_FLAGS.VER_FLG_WEAK,
194 VER_FLAGS.VER_FLG_BASE,
195 VER_FLAGS.VER_FLG_INFO) if x & flag)
196
197
198 def describe_note(x):
199 n_desc = x['n_desc']
200 desc = ''
201 if x['n_type'] == 'NT_GNU_ABI_TAG':
202 if x['n_name'] == 'Android':
203 desc = '\n description data: %s ' % bytes2hex(x['n_descdata'])
204 else:
205 desc = '\n OS: %s, ABI: %d.%d.%d' % (
206 _DESCR_NOTE_ABI_TAG_OS.get(n_desc['abi_os'], _unknown),
207 n_desc['abi_major'], n_desc['abi_minor'], n_desc['abi_tiny'])
208 elif x['n_type'] == 'NT_GNU_BUILD_ID':
209 desc = '\n Build ID: %s' % (n_desc)
210 elif x['n_type'] == 'NT_GNU_GOLD_VERSION':
211 desc = '\n Version: %s' % (n_desc)
212 elif x['n_type'] == 'NT_GNU_PROPERTY_TYPE_0':
213 desc = '\n Properties: ' + describe_note_gnu_properties(x['n_desc'])
214 else:
215 desc = '\n description data: {}'.format(bytes2hex(n_desc))
216
217 if x['n_type'] == 'NT_GNU_ABI_TAG' and x['n_name'] == 'Android':
218 note_type = 'NT_VERSION'
219 note_type_desc = 'version'
220 else:
221 note_type = (x['n_type'] if isinstance(x['n_type'], str)
222 else 'Unknown note type:')
223 note_type_desc = ('0x%.8x' % x['n_type']
224 if isinstance(x['n_type'], int) else
225 _DESCR_NOTE_N_TYPE.get(x['n_type'], _unknown))
226 return '%s (%s)%s' % (note_type, note_type_desc, desc)
227
228
229 def describe_attr_tag_arm(tag, val, extra):
230 idx = ENUM_ATTR_TAG_ARM[tag] - 1
231 d_entry = _DESCR_ATTR_VAL_ARM[idx]
232
233 if d_entry is None:
234 if tag == 'TAG_COMPATIBILITY':
235 return (_DESCR_ATTR_TAG_ARM[tag]
236 + 'flag = %d, vendor = %s' % (val, extra))
237
238 elif tag == 'TAG_ALSO_COMPATIBLE_WITH':
239 if val.tag == 'TAG_CPU_ARCH':
240 return _DESCR_ATTR_TAG_ARM[tag] + d_entry[val]
241
242 else:
243 return _DESCR_ATTR_TAG_ARM[tag] + '??? (%d)' % val.tag
244
245 elif tag == 'TAG_NODEFAULTS':
246 return _DESCR_ATTR_TAG_ARM[tag] + 'True'
247
248 s = _DESCR_ATTR_TAG_ARM[tag]
249 s += '"%s"' % val if val else ''
250 return s
251
252 else:
253 return _DESCR_ATTR_TAG_ARM[tag] + d_entry[val]
254
255 def describe_attr_tag_riscv(tag, val, extra):
256 idx = ENUM_ATTR_TAG_RISCV[tag] - 1
257 d_entry = _DESCR_ATTR_VAL_RISCV[idx]
258
259 if d_entry is None:
260 s = _DESCR_ATTR_TAG_RISCV[tag]
261 s += '"%s"' % val if val else ''
262 return s
263
264 else:
265 return _DESCR_ATTR_TAG_RISCV[tag] + d_entry[val]
266
267
268
269 def describe_note_gnu_property_x86_feature_1(value):
270 descs = []
271 for mask, desc in _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_1_FLAGS:
272 if value & mask:
273 descs.append(desc)
274 return 'x86 feature: ' + ', '.join(descs)
275
276 def describe_note_gnu_property_x86_feature_2_used(value):
277 descs = []
278 for mask, desc in _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_2_FLAGS:
279 if value & mask:
280 descs.append(desc)
281 return 'x86 feature used: ' + ', '.join(descs)
282
283 def describe_note_gnu_property_x86_isa_1(value, verb):
284 descs = []
285 for mask, desc in _DESCR_NOTE_GNU_PROPERTY_X86_ISA_1_FLAGS:
286 if value & mask:
287 descs.append(desc)
288 return 'x86 ISA %s: %s' % (verb, ', '.join(descs))
289
290 def describe_note_gnu_properties(properties):
291 descriptions = []
292 for prop in properties:
293 t, d, sz = prop.pr_type, prop.pr_data, prop.pr_datasz
294 if t == 'GNU_PROPERTY_STACK_SIZE':
295 if type(d) is int:
296 prop_desc = 'stack size: 0x%x' % d
297 else:
298 prop_desc = 'stack size: <corrupt length: 0x%x>' % sz
299 elif t == 'GNU_PROPERTY_NO_COPY_ON_PROTECTED':
300 if sz != 0:
301 prop_desc = ' <corrupt length: 0x%x>' % sz
302 else:
303 prop_desc = 'no copy on protected'
304 elif t == 'GNU_PROPERTY_X86_FEATURE_1_AND':
305 if sz != 4:
306 prop_desc = ' <corrupt length: 0x%x>' % sz
307 else:
308 prop_desc = describe_note_gnu_property_x86_feature_1(d)
309 elif t == 'GNU_PROPERTY_X86_FEATURE_2_USED':
310 if sz != 4:
311 prop_desc = ' <corrupt length: 0x%x>' % sz
312 else:
313 prop_desc = describe_note_gnu_property_x86_feature_2_used(d)
314 elif t == 'GNU_PROPERTY_X86_ISA_1_NEEDED':
315 if sz != 4:
316 prop_desc = ' <corrupt length: 0x%x>' % sz
317 else:
318 prop_desc = describe_note_gnu_property_x86_isa_1(d, "needed")
319 elif t == 'GNU_PROPERTY_X86_ISA_1_USED':
320 if sz != 4:
321 prop_desc = ' <corrupt length: 0x%x>' % sz
322 else:
323 prop_desc = describe_note_gnu_property_x86_isa_1(d, "used")
324 elif _DESCR_NOTE_GNU_PROPERTY_TYPE_LOPROC <= t <= _DESCR_NOTE_GNU_PROPERTY_TYPE_HIPROC:
325 prop_desc = '<processor-specific type 0x%x data: %s >' % (t, bytes2hex(d, sep=' '))
326 elif _DESCR_NOTE_GNU_PROPERTY_TYPE_LOUSER <= t <= _DESCR_NOTE_GNU_PROPERTY_TYPE_HIUSER:
327 prop_desc = '<application-specific type 0x%x data: %s >' % (t, bytes2hex(d, sep=' '))
328 else:
329 prop_desc = '<unknown type 0x%x data: %s >' % (t, bytes2hex(d, sep=' '))
330 descriptions.append(prop_desc)
331 return '\n '.join(descriptions)
332
333 #-------------------------------------------------------------------------------
334 _unknown = '<unknown>'
335
336
337 _DESCR_EI_CLASS = dict(
338 ELFCLASSNONE='none',
339 ELFCLASS32='ELF32',
340 ELFCLASS64='ELF64',
341 )
342
343
344 _DESCR_EI_DATA = dict(
345 ELFDATANONE='none',
346 ELFDATA2LSB="2's complement, little endian",
347 ELFDATA2MSB="2's complement, big endian",
348 )
349
350
351 _DESCR_EI_OSABI = dict(
352 ELFOSABI_SYSV='UNIX - System V',
353 ELFOSABI_HPUX='UNIX - HP-UX',
354 ELFOSABI_NETBSD='UNIX - NetBSD',
355 ELFOSABI_LINUX='UNIX - Linux',
356 ELFOSABI_HURD='UNIX - GNU/Hurd',
357 ELFOSABI_SOLARIS='UNIX - Solaris',
358 ELFOSABI_AIX='UNIX - AIX',
359 ELFOSABI_IRIX='UNIX - IRIX',
360 ELFOSABI_FREEBSD='UNIX - FreeBSD',
361 ELFOSABI_TRU64='UNIX - TRU64',
362 ELFOSABI_MODESTO='Novell - Modesto',
363 ELFOSABI_OPENBSD='UNIX - OpenBSD',
364 ELFOSABI_OPENVMS='VMS - OpenVMS',
365 ELFOSABI_NSK='HP - Non-Stop Kernel',
366 ELFOSABI_AROS='AROS',
367 ELFOSABI_FENIXOS='Fenix OS',
368 ELFOSABI_CLOUD='Nuxi - CloudABI',
369 ELFOSABI_SORTIX='Sortix',
370 ELFOSABI_ARM_AEABI='ARM - EABI',
371 ELFOSABI_ARM='ARM - ABI',
372 ELFOSABI_CELL_LV2='CellOS Lv-2',
373 ELFOSABI_STANDALONE='Standalone App',
374 )
375
376
377 _DESCR_E_TYPE = dict(
378 ET_NONE='NONE (None)',
379 ET_REL='REL (Relocatable file)',
380 ET_EXEC='EXEC (Executable file)',
381 ET_DYN='DYN (Shared object file)',
382 ET_CORE='CORE (Core file)',
383 PROC_SPECIFIC='Processor Specific',
384 )
385
386
387 _DESCR_E_MACHINE = dict(
388 EM_NONE='None',
389 EM_M32='WE32100',
390 EM_SPARC='Sparc',
391 EM_386='Intel 80386',
392 EM_68K='MC68000',
393 EM_88K='MC88000',
394 EM_860='Intel 80860',
395 EM_MIPS='MIPS R3000',
396 EM_S370='IBM System/370',
397 EM_MIPS_RS4_BE='MIPS 4000 big-endian',
398 EM_IA_64='Intel IA-64',
399 EM_X86_64='Advanced Micro Devices X86-64',
400 EM_AVR='Atmel AVR 8-bit microcontroller',
401 EM_ARM='ARM',
402 EM_AARCH64='AArch64',
403 EM_BLACKFIN='Analog Devices Blackfin',
404 EM_PPC='PowerPC',
405 EM_PPC64='PowerPC64',
406 EM_RISCV='RISC-V',
407 EM_LOONGARCH='LoongArch',
408 RESERVED='RESERVED',
409 )
410
411
412 _DESCR_P_TYPE = dict(
413 PT_NULL='NULL',
414 PT_LOAD='LOAD',
415 PT_DYNAMIC='DYNAMIC',
416 PT_INTERP='INTERP',
417 PT_NOTE='NOTE',
418 PT_SHLIB='SHLIB',
419 PT_PHDR='PHDR',
420 PT_GNU_EH_FRAME='GNU_EH_FRAME',
421 PT_GNU_STACK='GNU_STACK',
422 PT_GNU_RELRO='GNU_RELRO',
423 PT_GNU_PROPERTY='GNU_PROPERTY',
424 PT_ARM_ARCHEXT='ARM_ARCHEXT',
425 PT_ARM_EXIDX='EXIDX', # binutils calls this EXIDX, not ARM_EXIDX
426 PT_AARCH64_ARCHEXT='AARCH64_ARCHEXT',
427 PT_AARCH64_UNWIND='AARCH64_UNWIND',
428 PT_TLS='TLS',
429 PT_MIPS_ABIFLAGS='ABIFLAGS',
430 PT_RISCV_ATTRIBUTES='RISCV_ATTRIBUT',
431 )
432
433
434 _DESCR_P_FLAGS = {
435 P_FLAGS.PF_X: 'E',
436 P_FLAGS.PF_R: 'R',
437 P_FLAGS.PF_W: 'W',
438 }
439
440
441 _DESCR_SH_TYPE = dict(
442 SHT_NULL='NULL',
443 SHT_PROGBITS='PROGBITS',
444 SHT_SYMTAB='SYMTAB',
445 SHT_STRTAB='STRTAB',
446 SHT_RELA='RELA',
447 SHT_HASH='HASH',
448 SHT_DYNAMIC='DYNAMIC',
449 SHT_NOTE='NOTE',
450 SHT_NOBITS='NOBITS',
451 SHT_REL='REL',
452 SHT_SHLIB='SHLIB',
453 SHT_DYNSYM='DYNSYM',
454 SHT_INIT_ARRAY='INIT_ARRAY',
455 SHT_FINI_ARRAY='FINI_ARRAY',
456 SHT_PREINIT_ARRAY='PREINIT_ARRAY',
457 SHT_GNU_ATTRIBUTES='GNU_ATTRIBUTES',
458 SHT_GNU_HASH='GNU_HASH',
459 SHT_GROUP='GROUP',
460 SHT_SYMTAB_SHNDX='SYMTAB SECTION INDICIES',
461 SHT_RELR='RELR',
462 SHT_GNU_verdef='VERDEF',
463 SHT_GNU_verneed='VERNEED',
464 SHT_GNU_versym='VERSYM',
465 SHT_GNU_LIBLIST='GNU_LIBLIST',
466 SHT_ARM_EXIDX='ARM_EXIDX',
467 SHT_ARM_PREEMPTMAP='ARM_PREEMPTMAP',
468 SHT_ARM_ATTRIBUTES='ARM_ATTRIBUTES',
469 SHT_ARM_DEBUGOVERLAY='ARM_DEBUGOVERLAY',
470 SHT_RISCV_ATTRIBUTES='RISCV_ATTRIBUTES',
471 SHT_MIPS_LIBLIST='MIPS_LIBLIST',
472 SHT_MIPS_DEBUG='MIPS_DEBUG',
473 SHT_MIPS_REGINFO='MIPS_REGINFO',
474 SHT_MIPS_PACKAGE='MIPS_PACKAGE',
475 SHT_MIPS_PACKSYM='MIPS_PACKSYM',
476 SHT_MIPS_RELD='MIPS_RELD',
477 SHT_MIPS_IFACE='MIPS_IFACE',
478 SHT_MIPS_CONTENT='MIPS_CONTENT',
479 SHT_MIPS_OPTIONS='MIPS_OPTIONS',
480 SHT_MIPS_SHDR='MIPS_SHDR',
481 SHT_MIPS_FDESC='MIPS_FDESC',
482 SHT_MIPS_EXTSYM='MIPS_EXTSYM',
483 SHT_MIPS_DENSE='MIPS_DENSE',
484 SHT_MIPS_PDESC='MIPS_PDESC',
485 SHT_MIPS_LOCSYM='MIPS_LOCSYM',
486 SHT_MIPS_AUXSYM='MIPS_AUXSYM',
487 SHT_MIPS_OPTSYM='MIPS_OPTSYM',
488 SHT_MIPS_LOCSTR='MIPS_LOCSTR',
489 SHT_MIPS_LINE='MIPS_LINE',
490 SHT_MIPS_RFDESC='MIPS_RFDESC',
491 SHT_MIPS_DELTASYM='MIPS_DELTASYM',
492 SHT_MIPS_DELTAINST='MIPS_DELTAINST',
493 SHT_MIPS_DELTACLASS='MIPS_DELTACLASS',
494 SHT_MIPS_DWARF='MIPS_DWARF',
495 SHT_MIPS_DELTADECL='MIPS_DELTADECL',
496 SHT_MIPS_SYMBOL_LIB='MIPS_SYMBOL_LIB',
497 SHT_MIPS_EVENTS='MIPS_EVENTS',
498 SHT_MIPS_TRANSLATE='MIPS_TRANSLATE',
499 SHT_MIPS_PIXIE='MIPS_PIXIE',
500 SHT_MIPS_XLATE='MIPS_XLATE',
501 SHT_MIPS_XLATE_DEBUG='MIPS_XLATE_DEBUG',
502 SHT_MIPS_WHIRL='MIPS_WHIRL',
503 SHT_MIPS_EH_REGION='MIPS_EH_REGION',
504 SHT_MIPS_XLATE_OLD='MIPS_XLATE_OLD',
505 SHT_MIPS_PDR_EXCEPTION='MIPS_PDR_EXCEPTION',
506 SHT_MIPS_ABIFLAGS='MIPS_ABIFLAGS',
507 )
508
509
510 _DESCR_SH_FLAGS = {
511 SH_FLAGS.SHF_WRITE: 'W',
512 SH_FLAGS.SHF_ALLOC: 'A',
513 SH_FLAGS.SHF_EXECINSTR: 'X',
514 SH_FLAGS.SHF_MERGE: 'M',
515 SH_FLAGS.SHF_STRINGS: 'S',
516 SH_FLAGS.SHF_INFO_LINK: 'I',
517 SH_FLAGS.SHF_LINK_ORDER: 'L',
518 SH_FLAGS.SHF_OS_NONCONFORMING: 'O',
519 SH_FLAGS.SHF_GROUP: 'G',
520 SH_FLAGS.SHF_TLS: 'T',
521 SH_FLAGS.SHF_MASKOS: 'o',
522 SH_FLAGS.SHF_EXCLUDE: 'E',
523 }
524
525
526 _DESCR_RH_FLAGS = {
527 RH_FLAGS.RHF_NONE: 'NONE',
528 RH_FLAGS.RHF_QUICKSTART: 'QUICKSTART',
529 RH_FLAGS.RHF_NOTPOT: 'NOTPOT',
530 RH_FLAGS.RHF_NO_LIBRARY_REPLACEMENT: 'NO_LIBRARY_REPLACEMENT',
531 RH_FLAGS.RHF_NO_MOVE: 'NO_MOVE',
532 RH_FLAGS.RHF_SGI_ONLY: 'SGI_ONLY',
533 RH_FLAGS.RHF_GUARANTEE_INIT: 'GUARANTEE_INIT',
534 RH_FLAGS.RHF_DELTA_C_PLUS_PLUS: 'DELTA_C_PLUS_PLUS',
535 RH_FLAGS.RHF_GUARANTEE_START_INIT: 'GUARANTEE_START_INIT',
536 RH_FLAGS.RHF_PIXIE: 'PIXIE',
537 RH_FLAGS.RHF_DEFAULT_DELAY_LOAD: 'DEFAULT_DELAY_LOAD',
538 RH_FLAGS.RHF_REQUICKSTART: 'REQUICKSTART',
539 RH_FLAGS.RHF_REQUICKSTARTED: 'REQUICKSTARTED',
540 RH_FLAGS.RHF_CORD: 'CORD',
541 RH_FLAGS.RHF_NO_UNRES_UNDEF: 'NO_UNRES_UNDEF',
542 RH_FLAGS.RHF_RLD_ORDER_SAFE: 'RLD_ORDER_SAFE',
543 }
544
545
546 _DESCR_ST_INFO_TYPE = dict(
547 STT_NOTYPE='NOTYPE',
548 STT_OBJECT='OBJECT',
549 STT_FUNC='FUNC',
550 STT_SECTION='SECTION',
551 STT_FILE='FILE',
552 STT_COMMON='COMMON',
553 STT_TLS='TLS',
554 STT_NUM='NUM',
555 STT_RELC='RELC',
556 STT_SRELC='SRELC',
557 )
558
559
560 _DESCR_ST_INFO_BIND = dict(
561 STB_LOCAL='LOCAL',
562 STB_GLOBAL='GLOBAL',
563 STB_WEAK='WEAK',
564 )
565
566
567 _DESCR_ST_VISIBILITY = dict(
568 STV_DEFAULT='DEFAULT',
569 STV_INTERNAL='INTERNAL',
570 STV_HIDDEN='HIDDEN',
571 STV_PROTECTED='PROTECTED',
572 STV_EXPORTED='EXPORTED',
573 STV_SINGLETON='SINGLETON',
574 STV_ELIMINATE='ELIMINATE',
575 )
576
577
578 _DESCR_ST_SHNDX = dict(
579 SHN_UNDEF='UND',
580 SHN_ABS='ABS',
581 SHN_COMMON='COM',
582 )
583
584
585 _DESCR_SYMINFO_FLAGS = {
586 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECT: 'D',
587 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECTBIND: 'B',
588 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_COPY: 'C',
589 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_LAZYLOAD: 'L',
590 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_NOEXTDIRECT: 'N',
591 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_AUXILIARY: 'A',
592 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_FILTER: 'F',
593 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_INTERPOSE: 'I',
594 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_CAP: 'S',
595 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DEFERRED: 'P',
596 }
597
598
599 _DESCR_SYMINFO_BOUNDTO = dict(
600 SYMINFO_BT_SELF='<self>',
601 SYMINFO_BT_PARENT='<parent>',
602 SYMINFO_BT_NONE='',
603 SYMINFO_BT_EXTERN='<extern>',
604 )
605
606
607 _DESCR_VER_FLAGS = {
608 0: '',
609 VER_FLAGS.VER_FLG_BASE: 'BASE',
610 VER_FLAGS.VER_FLG_WEAK: 'WEAK',
611 VER_FLAGS.VER_FLG_INFO: 'INFO',
612 }
613
614
615 # PT_NOTE section types
616 _DESCR_NOTE_N_TYPE = dict(
617 NT_GNU_ABI_TAG='ABI version tag',
618 NT_GNU_HWCAP='DSO-supplied software HWCAP info',
619 NT_GNU_BUILD_ID='unique build ID bitstring',
620 NT_GNU_GOLD_VERSION='gold version',
621 NT_GNU_PROPERTY_TYPE_0='program properties'
622 )
623
624
625 # Values in GNU .note.ABI-tag notes (n_type=='NT_GNU_ABI_TAG')
626 _DESCR_NOTE_ABI_TAG_OS = dict(
627 ELF_NOTE_OS_LINUX='Linux',
628 ELF_NOTE_OS_GNU='GNU',
629 ELF_NOTE_OS_SOLARIS2='Solaris 2',
630 ELF_NOTE_OS_FREEBSD='FreeBSD',
631 ELF_NOTE_OS_NETBSD='NetBSD',
632 ELF_NOTE_OS_SYLLABLE='Syllable',
633 )
634
635
636 # Values in GNU .note.gnu.property notes (n_type=='NT_GNU_PROPERTY_TYPE_0') have
637 # different formats which need to be parsed/described differently
638 _DESCR_NOTE_GNU_PROPERTY_TYPE_LOPROC=0xc0000000
639 _DESCR_NOTE_GNU_PROPERTY_TYPE_HIPROC=0xdfffffff
640 _DESCR_NOTE_GNU_PROPERTY_TYPE_LOUSER=0xe0000000
641 _DESCR_NOTE_GNU_PROPERTY_TYPE_HIUSER=0xffffffff
642
643
644 # Bit masks for GNU_PROPERTY_X86_FEATURE_1_xxx flags in the form
645 # (mask, flag_description) in the desired output order
646 _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_1_FLAGS = (
647 (1, 'IBT'),
648 (2, 'SHSTK'),
649 (4, 'LAM_U48'),
650 (8, 'LAM_U57'),
651 )
652
653 # Bit masks for GNU_PROPERTY_X86_FEATURE_2_xxx flags in the form
654 # (mask, flag_description) in the desired output order
655 _DESCR_NOTE_GNU_PROPERTY_X86_FEATURE_2_FLAGS = (
656 (1, 'x86'),
657 (2, 'x87'),
658 (4, 'MMX'),
659 (8, 'XMM'),
660 (16, 'YMM'),
661 (32, 'ZMM'),
662 )
663
664 # Same for GNU_PROPERTY_X86_SET_1_xxx
665 _DESCR_NOTE_GNU_PROPERTY_X86_ISA_1_FLAGS = (
666 (1, 'x86-64-baseline'),
667 # TODO; there is a long list
668 )
669
670
671 def _reverse_dict(d, low_priority=()):
672 """
673 This is a tiny helper function to "reverse" the keys/values of a dictionary
674 provided in the first argument, i.e. {k: v} becomes {v: k}.
675
676 The second argument (optional) provides primitive control over what to do in
677 the case of conflicting values - if a value is present in this list, it will
678 not override any other entries of the same value.
679 """
680 out = {}
681 for k, v in d.items():
682 if v in out and k in low_priority:
683 continue
684 out[v] = k
685 return out
686
687 _DESCR_RELOC_TYPE_i386 = _reverse_dict(ENUM_RELOC_TYPE_i386)
688 _DESCR_RELOC_TYPE_x64 = _reverse_dict(ENUM_RELOC_TYPE_x64)
689 _DESCR_RELOC_TYPE_ARM = _reverse_dict(ENUM_RELOC_TYPE_ARM)
690 _DESCR_RELOC_TYPE_AARCH64 = _reverse_dict(ENUM_RELOC_TYPE_AARCH64)
691 _DESCR_RELOC_TYPE_PPC64 = _reverse_dict(ENUM_RELOC_TYPE_PPC64)
692 _DESCR_RELOC_TYPE_MIPS = _reverse_dict(ENUM_RELOC_TYPE_MIPS)
693
694 _low_priority_D_TAG = (
695 # these are 'meta-tags' marking semantics of numeric ranges of the enum
696 # they should not override other tags with the same numbers
697 # see https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-42444.html
698 'DT_LOOS',
699 'DT_HIOS',
700 'DT_LOPROC',
701 'DT_HIPROC',
702 'DT_ENCODING',
703 )
704 _DESCR_D_TAG = _reverse_dict(ENUM_D_TAG, low_priority=_low_priority_D_TAG)
705
706 _DESCR_ATTR_TAG_ARM = dict(
707 TAG_FILE='File Attributes',
708 TAG_SECTION='Section Attributes:',
709 TAG_SYMBOL='Symbol Attributes:',
710 TAG_CPU_RAW_NAME='Tag_CPU_raw_name: ',
711 TAG_CPU_NAME='Tag_CPU_name: ',
712 TAG_CPU_ARCH='Tag_CPU_arch: ',
713 TAG_CPU_ARCH_PROFILE='Tag_CPU_arch_profile: ',
714 TAG_ARM_ISA_USE='Tag_ARM_ISA_use: ',
715 TAG_THUMB_ISA_USE='Tag_Thumb_ISA_use: ',
716 TAG_FP_ARCH='Tag_FP_arch: ',
717 TAG_WMMX_ARCH='Tag_WMMX_arch: ',
718 TAG_ADVANCED_SIMD_ARCH='Tag_Advanced_SIMD_arch: ',
719 TAG_PCS_CONFIG='Tag_PCS_config: ',
720 TAG_ABI_PCS_R9_USE='Tag_ABI_PCS_R9_use: ',
721 TAG_ABI_PCS_RW_DATA='Tag_ABI_PCS_RW_use: ',
722 TAG_ABI_PCS_RO_DATA='Tag_ABI_PCS_RO_use: ',
723 TAG_ABI_PCS_GOT_USE='Tag_ABI_PCS_GOT_use: ',
724 TAG_ABI_PCS_WCHAR_T='Tag_ABI_PCS_wchar_t: ',
725 TAG_ABI_FP_ROUNDING='Tag_ABI_FP_rounding: ',
726 TAG_ABI_FP_DENORMAL='Tag_ABI_FP_denormal: ',
727 TAG_ABI_FP_EXCEPTIONS='Tag_ABI_FP_exceptions: ',
728 TAG_ABI_FP_USER_EXCEPTIONS='Tag_ABI_FP_user_exceptions: ',
729 TAG_ABI_FP_NUMBER_MODEL='Tag_ABI_FP_number_model: ',
730 TAG_ABI_ALIGN_NEEDED='Tag_ABI_align_needed: ',
731 TAG_ABI_ALIGN_PRESERVED='Tag_ABI_align_preserved: ',
732 TAG_ABI_ENUM_SIZE='Tag_ABI_enum_size: ',
733 TAG_ABI_HARDFP_USE='Tag_ABI_HardFP_use: ',
734 TAG_ABI_VFP_ARGS='Tag_ABI_VFP_args: ',
735 TAG_ABI_WMMX_ARGS='Tag_ABI_WMMX_args: ',
736 TAG_ABI_OPTIMIZATION_GOALS='Tag_ABI_optimization_goals: ',
737 TAG_ABI_FP_OPTIMIZATION_GOALS='Tag_ABI_FP_optimization_goals: ',
738 TAG_COMPATIBILITY='Tag_compatibility: ',
739 TAG_CPU_UNALIGNED_ACCESS='Tag_CPU_unaligned_access: ',
740 TAG_FP_HP_EXTENSION='Tag_FP_HP_extension: ',
741 TAG_ABI_FP_16BIT_FORMAT='Tag_ABI_FP_16bit_format: ',
742 TAG_MPEXTENSION_USE='Tag_MPextension_use: ',
743 TAG_DIV_USE='Tag_DIV_use: ',
744 TAG_NODEFAULTS='Tag_nodefaults: ',
745 TAG_ALSO_COMPATIBLE_WITH='Tag_also_compatible_with: ',
746 TAG_T2EE_USE='Tag_T2EE_use: ',
747 TAG_CONFORMANCE='Tag_conformance: ',
748 TAG_VIRTUALIZATION_USE='Tag_Virtualization_use: ',
749 TAG_MPEXTENSION_USE_OLD='Tag_MPextension_use_old: ',
750 )
751
752 _DESCR_ATTR_VAL_ARM = [
753 None, #1
754 None, #2
755 None, #3
756 None, #4
757 None, #5
758 { #6 TAG_CPU_ARCH
759 0 : 'Pre-v4',
760 1 : 'v4',
761 2 : 'v4T',
762 3 : 'v5T',
763 4 : 'v5TE',
764 5 : 'v5TEJ',
765 6 : 'v6',
766 7 : 'v6KZ',
767 8 : 'v6T2',
768 9 : 'v6K',
769 10: 'v7',
770 11: 'v6-M',
771 12: 'v6S-M',
772 13: 'v7E-M',
773 14: 'v8',
774 15: 'v8-R',
775 16: 'v8-M.baseline',
776 17: 'v8-M.mainline',
777 },
778 { #7 TAG_CPU_ARCH_PROFILE
779 0x00: 'None',
780 0x41: 'Application',
781 0x52: 'Realtime',
782 0x4D: 'Microcontroller',
783 0x53: 'Application or Realtime',
784 },
785 { #8 TAG_ARM_ISA
786 0: 'No',
787 1: 'Yes',
788 },
789 { #9 TAG_THUMB_ISA
790 0: 'No',
791 1: 'Thumb-1',
792 2: 'Thumb-2',
793 3: 'Yes',
794 },
795 { #10 TAG_FP_ARCH
796 0: 'No',
797 1: 'VFPv1',
798 2: 'VFPv2 ',
799 3: 'VFPv3',
800 4: 'VFPv3-D16',
801 5: 'VFPv4',
802 6: 'VFPv4-D16',
803 7: 'FP ARM v8',
804 8: 'FPv5/FP-D16 for ARMv8',
805 },
806 { #11 TAG_WMMX_ARCH
807 0: 'No',
808 1: 'WMMXv1',
809 2: 'WMMXv2',
810 },
811 { #12 TAG_ADVANCED_SIMD_ARCH
812 0: 'No',
813 1: 'NEONv1',
814 2: 'NEONv1 with Fused-MAC',
815 3: 'NEON for ARMv8',
816 4: 'NEON for ARMv8.1',
817 },
818 { #13 TAG_PCS_CONFIG
819 0: 'None',
820 1: 'Bare platform',
821 2: 'Linux application',
822 3: 'Linux DSO',
823 4: 'PalmOS 2004',
824 5: 'PalmOS (reserved)',
825 6: 'SymbianOS 2004',
826 7: 'SymbianOS (reserved)',
827 },
828 { #14 TAG_ABI_PCS_R9_USE
829 0: 'v6',
830 1: 'SB',
831 2: 'TLS',
832 3: 'Unused',
833 },
834 { #15 TAG_ABI_PCS_RW_DATA
835 0: 'Absolute',
836 1: 'PC-relative',
837 2: 'SB-relative',
838 3: 'None',
839 },
840 { #16 TAG_ABI_PCS_RO_DATA
841 0: 'Absolute',
842 1: 'PC-relative',
843 2: 'None',
844 },
845 { #17 TAG_ABI_PCS_GOT_USE
846 0: 'None',
847 1: 'direct',
848 2: 'GOT-indirect',
849 },
850 { #18 TAG_ABI_PCS_WCHAR_T
851 0: 'None',
852 1: '??? 1',
853 2: '2',
854 3: '??? 3',
855 4: '4',
856 },
857 { #19 TAG_ABI_FP_ROUNDING
858 0: 'Unused',
859 1: 'Needed',
860 },
861 { #20 TAG_ABI_FP_DENORMAL
862 0: 'Unused',
863 1: 'Needed',
864 2: 'Sign only',
865 },
866 { #21 TAG_ABI_FP_EXCEPTIONS
867 0: 'Unused',
868 1: 'Needed',
869 },
870 { #22 TAG_ABI_FP_USER_EXCEPTIONS
871 0: 'Unused',
872 1: 'Needed',
873 },
874 { #23 TAG_ABI_FP_NUMBER_MODEL
875 0: 'Unused',
876 1: 'Finite',
877 2: 'RTABI',
878 3: 'IEEE 754',
879 },
880 { #24 TAG_ABI_ALIGN_NEEDED
881 0: 'None',
882 1: '8-byte',
883 2: '4-byte',
884 3: '??? 3',
885 },
886 { #25 TAG_ABI_ALIGN_PRESERVED
887 0: 'None',
888 1: '8-byte, except leaf SP',
889 2: '8-byte',
890 3: '??? 3',
891 },
892 { #26 TAG_ABI_ENUM_SIZE
893 0: 'Unused',
894 1: 'small',
895 2: 'int',
896 3: 'forced to int',
897 },
898 { #27 TAG_ABI_HARDFP_USE
899 0: 'As Tag_FP_arch',
900 1: 'SP only',
901 2: 'Reserved',
902 3: 'Deprecated',
903 },
904 { #28 TAG_ABI_VFP_ARGS
905 0: 'AAPCS',
906 1: 'VFP registers',
907 2: 'custom',
908 3: 'compatible',
909 },
910 { #29 TAG_ABI_WMMX_ARGS
911 0: 'AAPCS',
912 1: 'WMMX registers',
913 2: 'custom',
914 },
915 { #30 TAG_ABI_OPTIMIZATION_GOALS
916 0: 'None',
917 1: 'Prefer Speed',
918 2: 'Aggressive Speed',
919 3: 'Prefer Size',
920 4: 'Aggressive Size',
921 5: 'Prefer Debug',
922 6: 'Aggressive Debug',
923 },
924 { #31 TAG_ABI_FP_OPTIMIZATION_GOALS
925 0: 'None',
926 1: 'Prefer Speed',
927 2: 'Aggressive Speed',
928 3: 'Prefer Size',
929 4: 'Aggressive Size',
930 5: 'Prefer Accuracy',
931 6: 'Aggressive Accuracy',
932 },
933 { #32 TAG_COMPATIBILITY
934 0: 'No',
935 1: 'Yes',
936 },
937 None, #33
938 { #34 TAG_CPU_UNALIGNED_ACCESS
939 0: 'None',
940 1: 'v6',
941 },
942 None, #35
943 { #36 TAG_FP_HP_EXTENSION
944 0: 'Not Allowed',
945 1: 'Allowed',
946 },
947 None, #37
948 { #38 TAG_ABI_FP_16BIT_FORMAT
949 0: 'None',
950 1: 'IEEE 754',
951 2: 'Alternative Format',
952 },
953 None, #39
954 None, #40
955 None, #41
956 { #42 TAG_MPEXTENSION_USE
957 0: 'Not Allowed',
958 1: 'Allowed',
959 },
960 None, #43
961 { #44 TAG_DIV_USE
962 0: 'Allowed in Thumb-ISA, v7-R or v7-M',
963 1: 'Not allowed',
964 2: 'Allowed in v7-A with integer division extension',
965 },
966 None, #45
967 None, #46
968 None, #47
969 None, #48
970 None, #49
971 None, #50
972 None, #51
973 None, #52
974 None, #53
975 None, #54
976 None, #55
977 None, #56
978 None, #57
979 None, #58
980 None, #59
981 None, #60
982 None, #61
983 None, #62
984 None, #63
985 None, #64
986 None, #65
987 { #66 TAG_FP_HP_EXTENSION
988 0: 'Not Allowed',
989 1: 'Allowed',
990 },
991 None, #67
992 { #68 TAG_VIRTUALIZATION_USE
993 0: 'Not Allowed',
994 1: 'TrustZone',
995 2: 'Virtualization Extensions',
996 3: 'TrustZone and Virtualization Extensions',
997 },
998 None, #69
999 { #70 TAG_MPEXTENSION_USE_OLD
1000 0: 'Not Allowed',
1001 1: 'Allowed',
1002 },
1003 ]
1004
1005 _DESCR_ATTR_TAG_RISCV = dict(
1006 TAG_FILE='File Attributes',
1007 TAG_SECTION='Section Attributes:',
1008 TAG_SYMBOL='Symbol Attributes:',
1009 TAG_STACK_ALIGN='Tag_RISCV_stack_align: ',
1010 TAG_ARCH='Tag_RISCV_arch: ',
1011 TAG_UNALIGNED='Tag_RISCV_unaligned_access: ',
1012 )
1013
1014 _DESCR_ATTR_VAL_RISCV = [
1015 None, #1
1016 None, #2
1017 None, #3
1018 { #4 TAG_RISCV_stack_align
1019 4: '4-bytes',
1020 16: '16-bytes',
1021 },
1022 None, #5 TAG_RISCV_arch
1023 { #6 TAG_RISCV_unaligned_access
1024 0: 'Not Allowed',
1025 1: 'Allowed',
1026 },
1027 ]