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