1 #-------------------------------------------------------------------------------
2 # elftools: elf/descriptions.py
4 # Textual descriptions of the various enums and flags of ELF
6 # Eli Bendersky (eliben@gmail.com)
7 # This code is in the public domain
8 #-------------------------------------------------------------------------------
9 from .enums import ENUM_E_VERSION, ENUM_RELOC_TYPE_i386, ENUM_RELOC_TYPE_x64
10 from .constants import P_FLAGS, SH_FLAGS
11 from ..common.py3compat import iteritems
14 def describe_ei_class(x):
15 return _DESCR_EI_CLASS.get(x, _unknown)
17 def describe_ei_data(x):
18 return _DESCR_EI_DATA.get(x, _unknown)
20 def describe_ei_version(x):
21 s = '%d' % ENUM_E_VERSION[x]
26 def describe_ei_osabi(x):
27 return _DESCR_EI_OSABI.get(x, _unknown)
29 def describe_e_type(x):
30 return _DESCR_E_TYPE.get(x, _unknown)
32 def describe_e_machine(x):
33 return _DESCR_E_MACHINE.get(x, _unknown)
35 def describe_e_version_numeric(x):
36 return '0x%x' % ENUM_E_VERSION[x]
38 def describe_p_type(x):
39 return _DESCR_P_TYPE.get(x, _unknown)
41 def describe_p_flags(x):
43 for flag in (P_FLAGS.PF_R, P_FLAGS.PF_W, P_FLAGS.PF_X):
44 s += _DESCR_P_FLAGS[flag] if (x & flag) else ' '
47 def describe_sh_type(x):
48 return _DESCR_SH_TYPE.get(x, _unknown)
50 def describe_sh_flags(x):
53 SH_FLAGS.SHF_WRITE, SH_FLAGS.SHF_ALLOC, SH_FLAGS.SHF_EXECINSTR,
54 SH_FLAGS.SHF_MERGE, SH_FLAGS.SHF_STRINGS, SH_FLAGS.SHF_INFO_LINK,
55 SH_FLAGS.SHF_LINK_ORDER, SH_FLAGS.SHF_OS_NONCONFORMING,
56 SH_FLAGS.SHF_GROUP, SH_FLAGS.SHF_TLS, SH_FLAGS.SHF_EXCLUDE):
57 s += _DESCR_SH_FLAGS[flag] if (x & flag) else ''
60 def describe_symbol_type(x):
61 return _DESCR_ST_INFO_TYPE.get(x, _unknown)
63 def describe_symbol_bind(x):
64 return _DESCR_ST_INFO_BIND.get(x, _unknown)
66 def describe_symbol_visibility(x):
67 return _DESCR_ST_VISIBILITY.get(x, _unknown)
69 def describe_symbol_shndx(x):
70 return _DESCR_ST_SHNDX.get(x, '%3s' % x)
72 def describe_reloc_type(x, elffile):
73 arch = elffile.get_machine_arch()
75 return _DESCR_RELOC_TYPE_i386.get(x, _unknown)
77 return _DESCR_RELOC_TYPE_x64.get(x, _unknown)
79 return 'unrecognized: %-7x' % (x & 0xFFFFFFFF)
82 #-------------------------------------------------------------------------------
83 _unknown = '<unknown>'
86 _DESCR_EI_CLASS = dict(
92 _DESCR_EI_DATA = dict(
94 ELFDATA2LSB="2's complement, little endian",
95 ELFDATA2MSB="2's complement, big endian",
98 _DESCR_EI_OSABI = dict(
99 ELFOSABI_SYSV='UNIX - System V',
100 ELFOSABI_HPUX='UNIX - HP-UX',
101 ELFOSABI_NETBSD='UNIX - NetBSD',
102 ELFOSABI_LINUX='UNIX - Linux',
103 ELFOSABI_HURD='UNIX - GNU/Hurd',
104 ELFOSABI_SOLARIS='UNIX - Solaris',
105 ELFOSABI_AIX='UNIX - AIX',
106 ELFOSABI_IRIX='UNIX - IRIX',
107 ELFOSABI_FREEBSD='UNIX - FreeBSD',
108 ELFOSABI_TRU64='UNIX - TRU64',
109 ELFOSABI_MODESTO='Novell - Modesto',
110 ELFOSABI_OPENBSD='UNIX - OpenBSD',
111 ELFOSABI_OPENVMS='VMS - OpenVMS',
112 ELFOSABI_NSK='HP - Non-Stop Kernel',
113 ELFOSABI_AROS='AROS',
115 ELFOSABI_STANDALONE='Standalone App',
118 _DESCR_E_TYPE = dict(
119 ET_NONE='NONE (None)',
120 ET_REL='REL (Relocatable file)',
121 ET_EXEC='EXEC (Executable file)',
122 ET_DYN='DYN (Shared object file)',
123 ET_CORE='CORE (Core file)',
124 PROC_SPECIFIC='Processor Specific',
127 _DESCR_E_MACHINE = dict(
131 EM_386='Intel 80386',
134 EM_860='Intel 80860',
135 EM_MIPS='MIPS R3000',
136 EM_S370='IBM System/370',
137 EM_MIPS_RS4_BE='MIPS 4000 big-endian',
138 EM_IA_64='Intel IA-64',
139 EM_X86_64='Advanced Micro Devices X86-64',
140 EM_AVR='Atmel AVR 8-bit microcontroller',
144 _DESCR_P_TYPE = dict(
147 PT_DYNAMIC='DYNAMIC',
152 PT_GNU_EH_FRAME='GNU_EH_FRAME',
153 PT_GNU_STACK='GNU_STACK',
154 PT_GNU_RELRO='GNU_RELRO',
163 _DESCR_SH_TYPE = dict(
165 SHT_PROGBITS='PROGBITS',
170 SHT_DYNAMIC='DYNAMIC',
176 SHT_INIT_ARRAY='INIT_ARRAY',
177 SHT_FINI_ARRAY='FINI_ARRAY',
178 SHT_PREINIT_ARRAY='PREINIT_ARRAY',
179 SHT_GNU_HASH='GNU_HASH',
181 SHT_SYMTAB_SHNDX='SYMTAB SECTION INDICIES',
182 SHT_GNU_verdef='VERDEF',
183 SHT_GNU_verneed='VERNEED',
184 SHT_GNU_versym='VERSYM',
185 SHT_GNU_LIBLIST='GNU_LIBLIST',
189 SH_FLAGS.SHF_WRITE: 'W',
190 SH_FLAGS.SHF_ALLOC: 'A',
191 SH_FLAGS.SHF_EXECINSTR: 'X',
192 SH_FLAGS.SHF_MERGE: 'M',
193 SH_FLAGS.SHF_STRINGS: 'S',
194 SH_FLAGS.SHF_INFO_LINK: 'I',
195 SH_FLAGS.SHF_LINK_ORDER: 'L',
196 SH_FLAGS.SHF_OS_NONCONFORMING: 'O',
197 SH_FLAGS.SHF_GROUP: 'G',
198 SH_FLAGS.SHF_TLS: 'T',
199 SH_FLAGS.SHF_EXCLUDE: 'E',
202 _DESCR_ST_INFO_TYPE = dict(
206 STT_SECTION='SECTION',
215 _DESCR_ST_INFO_BIND = dict(
221 _DESCR_ST_VISIBILITY = dict(
222 STV_DEFAULT='DEFAULT',
223 STV_INTERNAL='INTERNAL',
225 STD_PROTECTED='PROTECTED',
228 _DESCR_ST_SHNDX = dict(
234 _DESCR_RELOC_TYPE_i386 = dict(
235 (v, k) for k, v in iteritems(ENUM_RELOC_TYPE_i386))
237 _DESCR_RELOC_TYPE_x64 = dict(
238 (v, k) for k, v in iteritems(ENUM_RELOC_TYPE_x64))