82fdff65c43849d0279d36c0f396ab72679fc814
[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_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
17
18
19 def describe_ei_class(x):
20 return _DESCR_EI_CLASS.get(x, _unknown)
21
22
23 def describe_ei_data(x):
24 return _DESCR_EI_DATA.get(x, _unknown)
25
26
27 def describe_ei_version(x):
28 s = '%d' % ENUM_E_VERSION[x]
29 if x == 'EV_CURRENT':
30 s += ' (current)'
31 return s
32
33
34 def describe_ei_osabi(x):
35 return _DESCR_EI_OSABI.get(x, _unknown)
36
37
38 def describe_e_type(x):
39 return _DESCR_E_TYPE.get(x, _unknown)
40
41
42 def describe_e_machine(x):
43 return _DESCR_E_MACHINE.get(x, _unknown)
44
45
46 def describe_e_version_numeric(x):
47 return '0x%x' % ENUM_E_VERSION[x]
48
49
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'])
55 else:
56 return _unknown
57
58
59 def describe_p_flags(x):
60 s = ''
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 ' '
63 return s
64
65
66 def describe_rh_flags(x):
67 return ' '.join(
68 _DESCR_RH_FLAGS[flag]
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)
79 if x & flag)
80
81
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'])
88 else:
89 return _unknown
90
91
92 def describe_sh_flags(x):
93 s = ''
94 for flag in (
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:
103 s += 'p'
104 return s
105
106
107 def describe_symbol_type(x):
108 return _DESCR_ST_INFO_TYPE.get(x, _unknown)
109
110
111 def describe_symbol_bind(x):
112 return _DESCR_ST_INFO_BIND.get(x, _unknown)
113
114
115 def describe_symbol_visibility(x):
116 return _DESCR_ST_VISIBILITY.get(x, _unknown)
117
118
119 def describe_symbol_local(x):
120 return '[<localentry>: ' + str(1 << x) + ']'
121
122
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'])
127 return vis
128
129
130 def describe_symbol_shndx(x):
131 return _DESCR_ST_SHNDX.get(x, '%3s' % x)
132
133
134 def describe_reloc_type(x, elffile):
135 arch = elffile.get_machine_arch()
136 if arch == 'x86':
137 return _DESCR_RELOC_TYPE_i386.get(x, _unknown)
138 elif arch == 'x64':
139 return _DESCR_RELOC_TYPE_x64.get(x, _unknown)
140 elif arch == 'ARM':
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)
146 elif arch == 'MIPS':
147 return _DESCR_RELOC_TYPE_MIPS.get(x, _unknown)
148 else:
149 return 'unrecognized: %-7x' % (x & 0xFFFFFFFF)
150
151
152 def describe_dyn_tag(x):
153 return _DESCR_D_TAG.get(x, _unknown)
154
155
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)
159
160
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)
164
165
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)
178
179
180 def describe_symbol_boundto(x):
181 return _DESCR_SYMINFO_BOUNDTO.get(x, '%3s' % x)
182
183
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)
189
190
191 def describe_note(x):
192 n_desc = x['n_desc']
193 desc = ''
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'])
197 else:
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)
205 else:
206 desc = '\n description data: {}'.format(' '.join(
207 '{:02x}'.format(ord(byte)) for byte in n_desc
208 ))
209
210 if x['n_type'] == 'NT_GNU_ABI_TAG' and x['n_name'] == 'Android':
211 note_type = 'NT_VERSION'
212 note_type_desc = 'version'
213 else:
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)
220
221
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]
225
226 if d_entry is None:
227 if tag == 'TAG_COMPATIBILITY':
228 return (_DESCR_ATTR_TAG_ARM[tag]
229 + 'flag = %d, vendor = %s' % (val, extra))
230
231 elif tag == 'TAG_ALSO_COMPATIBLE_WITH':
232 if val.tag == 'TAG_CPU_ARCH':
233 return _DESCR_ATTR_TAG_ARM[tag] + d_entry[val]
234
235 else:
236 return _DESCR_ATTR_TAG_ARM[tag] + '??? (%d)' % val.tag
237
238 elif tag == 'TAG_NODEFAULTS':
239 return _DESCR_ATTR_TAG_ARM[tag] + 'True'
240
241 s = _DESCR_ATTR_TAG_ARM[tag]
242 s += '"%s"' % val if val else ''
243 return s
244
245 else:
246 return _DESCR_ATTR_TAG_ARM[tag] + d_entry[val]
247
248
249 #-------------------------------------------------------------------------------
250 _unknown = '<unknown>'
251
252
253 _DESCR_EI_CLASS = dict(
254 ELFCLASSNONE='none',
255 ELFCLASS32='ELF32',
256 ELFCLASS64='ELF64',
257 )
258
259
260 _DESCR_EI_DATA = dict(
261 ELFDATANONE='none',
262 ELFDATA2LSB="2's complement, little endian",
263 ELFDATA2MSB="2's complement, big endian",
264 )
265
266
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',
289 )
290
291
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',
299 )
300
301
302 _DESCR_E_MACHINE = dict(
303 EM_NONE='None',
304 EM_M32='WE32100',
305 EM_SPARC='Sparc',
306 EM_386='Intel 80386',
307 EM_68K='MC68000',
308 EM_88K='MC88000',
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',
316 EM_ARM='ARM',
317 EM_AARCH64='AArch64',
318 EM_BLACKFIN='Analog Devices Blackfin',
319 EM_PPC='PowerPC',
320 EM_PPC64='PowerPC64',
321 RESERVED='RESERVED',
322 )
323
324
325 _DESCR_P_TYPE = dict(
326 PT_NULL='NULL',
327 PT_LOAD='LOAD',
328 PT_DYNAMIC='DYNAMIC',
329 PT_INTERP='INTERP',
330 PT_NOTE='NOTE',
331 PT_SHLIB='SHLIB',
332 PT_PHDR='PHDR',
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',
340 PT_TLS='TLS',
341 PT_MIPS_ABIFLAGS='ABIFLAGS'
342 )
343
344
345 _DESCR_P_FLAGS = {
346 P_FLAGS.PF_X: 'E',
347 P_FLAGS.PF_R: 'R',
348 P_FLAGS.PF_W: 'W',
349 }
350
351
352 _DESCR_SH_TYPE = dict(
353 SHT_NULL='NULL',
354 SHT_PROGBITS='PROGBITS',
355 SHT_SYMTAB='SYMTAB',
356 SHT_STRTAB='STRTAB',
357 SHT_RELA='RELA',
358 SHT_HASH='HASH',
359 SHT_DYNAMIC='DYNAMIC',
360 SHT_NOTE='NOTE',
361 SHT_NOBITS='NOBITS',
362 SHT_REL='REL',
363 SHT_SHLIB='SHLIB',
364 SHT_DYNSYM='DYNSYM',
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',
370 SHT_GROUP='GROUP',
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',
416 )
417
418
419 _DESCR_SH_FLAGS = {
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',
432 }
433
434
435 _DESCR_RH_FLAGS = {
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',
452 }
453
454
455 _DESCR_ST_INFO_TYPE = dict(
456 STT_NOTYPE='NOTYPE',
457 STT_OBJECT='OBJECT',
458 STT_FUNC='FUNC',
459 STT_SECTION='SECTION',
460 STT_FILE='FILE',
461 STT_COMMON='COMMON',
462 STT_TLS='TLS',
463 STT_NUM='NUM',
464 STT_RELC='RELC',
465 STT_SRELC='SRELC',
466 )
467
468
469 _DESCR_ST_INFO_BIND = dict(
470 STB_LOCAL='LOCAL',
471 STB_GLOBAL='GLOBAL',
472 STB_WEAK='WEAK',
473 )
474
475
476 _DESCR_ST_VISIBILITY = dict(
477 STV_DEFAULT='DEFAULT',
478 STV_INTERNAL='INTERNAL',
479 STV_HIDDEN='HIDDEN',
480 STV_PROTECTED='PROTECTED',
481 STV_EXPORTED='EXPORTED',
482 STV_SINGLETON='SINGLETON',
483 STV_ELIMINATE='ELIMINATE',
484 )
485
486
487 _DESCR_ST_SHNDX = dict(
488 SHN_UNDEF='UND',
489 SHN_ABS='ABS',
490 SHN_COMMON='COM',
491 )
492
493
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',
505 }
506
507
508 _DESCR_SYMINFO_BOUNDTO = dict(
509 SYMINFO_BT_SELF='<self>',
510 SYMINFO_BT_PARENT='<parent>',
511 SYMINFO_BT_NONE='',
512 SYMINFO_BT_EXTERN='<extern>',
513 )
514
515
516 _DESCR_VER_FLAGS = {
517 0: '',
518 VER_FLAGS.VER_FLG_BASE: 'BASE',
519 VER_FLAGS.VER_FLG_WEAK: 'WEAK',
520 VER_FLAGS.VER_FLG_INFO: 'INFO',
521 }
522
523
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',
530 )
531
532
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',
541 )
542
543 def _reverse_dict(d, low_priority=()):
544 """
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}.
547
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.
551 """
552 out = {}
553 for k, v in iteritems(d):
554 if v in out and k in low_priority:
555 continue
556 out[v] = k
557 return out
558
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)
565
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
570 'DT_LOOS',
571 'DT_HIOS',
572 'DT_LOPROC',
573 'DT_HIPROC',
574 'DT_ENCODING',
575 )
576 _DESCR_D_TAG = _reverse_dict(ENUM_D_TAG, low_priority=_low_priority_D_TAG)
577
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: ',
622 )
623
624
625 _DESCR_ATTR_VAL_ARM = [
626 None, #1
627 None, #2
628 None, #3
629 None, #4
630 None, #5
631 { #6 TAG_CPU_ARCH
632 0 : 'Pre-v4',
633 1 : 'v4',
634 2 : 'v4T',
635 3 : 'v5T',
636 4 : 'v5TE',
637 5 : 'v5TEJ',
638 6 : 'v6',
639 7 : 'v6KZ',
640 8 : 'v6T2',
641 9 : 'v6K',
642 10: 'v7',
643 11: 'v6-M',
644 12: 'v6S-M',
645 13: 'v7E-M',
646 14: 'v8',
647 15: 'v8-R',
648 16: 'v8-M.baseline',
649 17: 'v8-M.mainline',
650 },
651 { #7 TAG_CPU_ARCH_PROFILE
652 0x00: 'None',
653 0x41: 'Application',
654 0x52: 'Realtime',
655 0x4D: 'Microcontroller',
656 0x53: 'Application or Realtime',
657 },
658 { #8 TAG_ARM_ISA
659 0: 'No',
660 1: 'Yes',
661 },
662 { #9 TAG_THUMB_ISA
663 0: 'No',
664 1: 'Thumb-1',
665 2: 'Thumb-2',
666 3: 'Yes',
667 },
668 { #10 TAG_FP_ARCH
669 0: 'No',
670 1: 'VFPv1',
671 2: 'VFPv2 ',
672 3: 'VFPv3',
673 4: 'VFPv3-D16',
674 5: 'VFPv4',
675 6: 'VFPv4-D16',
676 7: 'FP ARM v8',
677 8: 'FPv5/FP-D16 for ARMv8',
678 },
679 { #11 TAG_WMMX_ARCH
680 0: 'No',
681 1: 'WMMXv1',
682 2: 'WMMXv2',
683 },
684 { #12 TAG_ADVANCED_SIMD_ARCH
685 0: 'No',
686 1: 'NEONv1',
687 2: 'NEONv1 with Fused-MAC',
688 3: 'NEON for ARMv8',
689 4: 'NEON for ARMv8.1',
690 },
691 { #13 TAG_PCS_CONFIG
692 0: 'None',
693 1: 'Bare platform',
694 2: 'Linux application',
695 3: 'Linux DSO',
696 4: 'PalmOS 2004',
697 5: 'PalmOS (reserved)',
698 6: 'SymbianOS 2004',
699 7: 'SymbianOS (reserved)',
700 },
701 { #14 TAG_ABI_PCS_R9_USE
702 0: 'v6',
703 1: 'SB',
704 2: 'TLS',
705 3: 'Unused',
706 },
707 { #15 TAG_ABI_PCS_RW_DATA
708 0: 'Absolute',
709 1: 'PC-relative',
710 2: 'SB-relative',
711 3: 'None',
712 },
713 { #16 TAG_ABI_PCS_RO_DATA
714 0: 'Absolute',
715 1: 'PC-relative',
716 2: 'None',
717 },
718 { #17 TAG_ABI_PCS_GOT_USE
719 0: 'None',
720 1: 'direct',
721 2: 'GOT-indirect',
722 },
723 { #18 TAG_ABI_PCS_WCHAR_T
724 0: 'None',
725 1: '??? 1',
726 2: '2',
727 3: '??? 3',
728 4: '4',
729 },
730 { #19 TAG_ABI_FP_ROUNDING
731 0: 'Unused',
732 1: 'Needed',
733 },
734 { #20 TAG_ABI_FP_DENORMAL
735 0: 'Unused',
736 1: 'Needed',
737 2: 'Sign only',
738 },
739 { #21 TAG_ABI_FP_EXCEPTIONS
740 0: 'Unused',
741 1: 'Needed',
742 },
743 { #22 TAG_ABI_FP_USER_EXCEPTIONS
744 0: 'Unused',
745 1: 'Needed',
746 },
747 { #23 TAG_ABI_FP_NUMBER_MODEL
748 0: 'Unused',
749 1: 'Finite',
750 2: 'RTABI',
751 3: 'IEEE 754',
752 },
753 { #24 TAG_ABI_ALIGN_NEEDED
754 0: 'None',
755 1: '8-byte',
756 2: '4-byte',
757 3: '??? 3',
758 },
759 { #25 TAG_ABI_ALIGN_PRESERVED
760 0: 'None',
761 1: '8-byte, except leaf SP',
762 2: '8-byte',
763 3: '??? 3',
764 },
765 { #26 TAG_ABI_ENUM_SIZE
766 0: 'Unused',
767 1: 'small',
768 2: 'int',
769 3: 'forced to int',
770 },
771 { #27 TAG_ABI_HARDFP_USE
772 0: 'As Tag_FP_arch',
773 1: 'SP only',
774 2: 'Reserved',
775 3: 'Deprecated',
776 },
777 { #28 TAG_ABI_VFP_ARGS
778 0: 'AAPCS',
779 1: 'VFP registers',
780 2: 'custom',
781 3: 'compatible',
782 },
783 { #29 TAG_ABI_WMMX_ARGS
784 0: 'AAPCS',
785 1: 'WMMX registers',
786 2: 'custom',
787 },
788 { #30 TAG_ABI_OPTIMIZATION_GOALS
789 0: 'None',
790 1: 'Prefer Speed',
791 2: 'Aggressive Speed',
792 3: 'Prefer Size',
793 4: 'Aggressive Size',
794 5: 'Prefer Debug',
795 6: 'Aggressive Debug',
796 },
797 { #31 TAG_ABI_FP_OPTIMIZATION_GOALS
798 0: 'None',
799 1: 'Prefer Speed',
800 2: 'Aggressive Speed',
801 3: 'Prefer Size',
802 4: 'Aggressive Size',
803 5: 'Prefer Accuracy',
804 6: 'Aggressive Accuracy',
805 },
806 { #32 TAG_COMPATIBILITY
807 0: 'No',
808 1: 'Yes',
809 },
810 None, #33
811 { #34 TAG_CPU_UNALIGNED_ACCESS
812 0: 'None',
813 1: 'v6',
814 },
815 None, #35
816 { #36 TAG_FP_HP_EXTENSION
817 0: 'Not Allowed',
818 1: 'Allowed',
819 },
820 None, #37
821 { #38 TAG_ABI_FP_16BIT_FORMAT
822 0: 'None',
823 1: 'IEEE 754',
824 2: 'Alternative Format',
825 },
826 None, #39
827 None, #40
828 None, #41
829 { #42 TAG_MPEXTENSION_USE
830 0: 'Not Allowed',
831 1: 'Allowed',
832 },
833 None, #43
834 { #44 TAG_DIV_USE
835 0: 'Allowed in Thumb-ISA, v7-R or v7-M',
836 1: 'Not allowed',
837 2: 'Allowed in v7-A with integer division extension',
838 },
839 None, #45
840 None, #46
841 None, #47
842 None, #48
843 None, #49
844 None, #50
845 None, #51
846 None, #52
847 None, #53
848 None, #54
849 None, #55
850 None, #56
851 None, #57
852 None, #58
853 None, #59
854 None, #60
855 None, #61
856 None, #62
857 None, #63
858 None, #64
859 None, #65
860 { #66 TAG_FP_HP_EXTENSION
861 0: 'Not Allowed',
862 1: 'Allowed',
863 },
864 None, #67
865 { #68 TAG_VIRTUALIZATION_USE
866 0: 'Not Allowed',
867 1: 'TrustZone',
868 2: 'Virtualization Extensions',
869 3: 'TrustZone and Virtualization Extensions',
870 },
871 None, #69
872 { #70 TAG_MPEXTENSION_USE_OLD
873 0: 'Not Allowed',
874 1: 'Allowed',
875 },
876 ]