relocation output working in readelf comparison
[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 ENUM_E_VERSION, ENUM_RELOC_TYPE_i386, ENUM_RELOC_TYPE_x64
10 from .constants import P_FLAGS, SH_FLAGS
11
12
13 def describe_ei_class(x):
14 return _DESCR_EI_CLASS.get(x, _unknown)
15
16 def describe_ei_data(x):
17 return _DESCR_EI_DATA.get(x, _unknown)
18
19 def describe_ei_version(x):
20 s = '%d' % ENUM_E_VERSION[x]
21 if x == 'EV_CURRENT':
22 s += ' (current)'
23 return s
24
25 def describe_ei_osabi(x):
26 return _DESCR_EI_OSABI.get(x, _unknown)
27
28 def describe_e_type(x):
29 return _DESCR_E_TYPE.get(x, _unknown)
30
31 def describe_e_machine(x):
32 return _DESCR_E_MACHINE.get(x, _unknown)
33
34 def describe_e_version_numeric(x):
35 return '0x%x' % ENUM_E_VERSION[x]
36
37 def describe_p_type(x):
38 return _DESCR_P_TYPE.get(x, _unknown)
39
40 def describe_p_flags(x):
41 s = ''
42 for flag in (P_FLAGS.PF_R, P_FLAGS.PF_W, P_FLAGS.PF_X):
43 s += _DESCR_P_FLAGS[flag] if (x & flag) else ' '
44 return s
45
46 def describe_sh_type(x):
47 return _DESCR_SH_TYPE.get(x, _unknown)
48
49 def describe_sh_flags(x):
50 s = ''
51 for flag in (
52 SH_FLAGS.SHF_WRITE, SH_FLAGS.SHF_ALLOC, SH_FLAGS.SHF_EXECINSTR,
53 SH_FLAGS.SHF_MERGE, SH_FLAGS.SHF_STRINGS, SH_FLAGS.SHF_INFO_LINK,
54 SH_FLAGS.SHF_LINK_ORDER, SH_FLAGS.SHF_OS_NONCONFORMING,
55 SH_FLAGS.SHF_GROUP, SH_FLAGS.SHF_TLS, SH_FLAGS.SHF_EXCLUDE):
56 s += _DESCR_SH_FLAGS[flag] if (x & flag) else ''
57 return s
58
59 def describe_symbol_type(x):
60 return _DESCR_ST_INFO_TYPE.get(x, _unknown)
61
62 def describe_symbol_bind(x):
63 return _DESCR_ST_INFO_BIND.get(x, _unknown)
64
65 def describe_symbol_visibility(x):
66 return _DESCR_ST_VISIBILITY.get(x, _unknown)
67
68 def describe_symbol_shndx(x):
69 return _DESCR_ST_SHNDX.get(x, '%3s' % x)
70
71 def describe_reloc_type(x, e_machine):
72 if e_machine in ('EM_386', 'EM_486'):
73 return _DESCR_RELOC_TYPE_i386.get(x, _unknown)
74 elif e_machine in ('EM_X86_64', 'EM_L10M'):
75 return _DESCR_RELOC_TYPE_x64.get(x, _unknown)
76 else:
77 return 'unrecognized: %-7x' % (x & 0xFFFFFFFF)
78
79
80 #-------------------------------------------------------------------------------
81 _unknown = '<unknown>'
82
83
84 _DESCR_EI_CLASS = dict(
85 ELFCLASSNONE='none',
86 ELFCLASS32='ELF32',
87 ELFCLASS64='ELF64',
88 )
89
90 _DESCR_EI_DATA = dict(
91 ELFDATANONE='none',
92 ELFDATA2LSB="2's complement, little endian",
93 ELFDATA2MSB="2's complement, big endian",
94 )
95
96 _DESCR_EI_OSABI = dict(
97 ELFOSABI_SYSV='UNIX - System V',
98 ELFOSABI_HPUX='UNIX - HP-UX',
99 ELFOSABI_NETBSD='UNIX - NetBSD',
100 ELFOSABI_LINUX='UNIX - Linux',
101 ELFOSABI_HURD='UNIX - GNU/Hurd',
102 ELFOSABI_SOLARIS='UNIX - Solaris',
103 ELFOSABI_AIX='UNIX - AIX',
104 ELFOSABI_IRIX='UNIX - IRIX',
105 ELFOSABI_FREEBSD='UNIX - FreeBSD',
106 ELFOSABI_TRU64='UNIX - TRU64',
107 ELFOSABI_MODESTO='Novell - Modesto',
108 ELFOSABI_OPENBSD='UNIX - OpenBSD',
109 ELFOSABI_OPENVMS='VMS - OpenVMS',
110 ELFOSABI_NSK='HP - Non-Stop Kernel',
111 ELFOSABI_AROS='AROS',
112 ELFOSABI_ARM='ARM',
113 ELFOSABI_STANDALONE='Standalone App',
114 )
115
116 _DESCR_E_TYPE = dict(
117 ET_NONE='NONE (None)',
118 ET_REL='REL (Relocatable file)',
119 ET_EXEC='EXEC (Executable file)',
120 ET_DYN='DYN (Shared object file)',
121 ET_CORE='CORE (Core file)',
122 PROC_SPECIFIC='Processor Specific',
123 )
124
125 _DESCR_E_MACHINE = dict(
126 EM_NONE='None',
127 EM_M32='WE32100',
128 EM_SPARC='Sparc',
129 EM_386='Intel 80386',
130 EM_68K='MC68000',
131 EM_88K='MC88000',
132 EM_860='Intel 80860',
133 EM_MIPS='MIPS R3000',
134 EM_S370='IBM System/370',
135 EM_MIPS_RS4_BE='MIPS 4000 big-endian',
136 EM_IA_64='Intel IA-64',
137 EM_X86_64='Advanced Micro Devices X86-64',
138 EM_AVR='Atmel AVR 8-bit microcontroller',
139 RESERVED='RESERVED',
140 )
141
142 _DESCR_P_TYPE = dict(
143 PT_NULL='NULL',
144 PT_LOAD='LOAD',
145 PT_DYNAMIC='DYNAMIC',
146 PT_INTERP='INTERP',
147 PT_NOTE='NOTE',
148 PT_SHLIB='SHLIB',
149 PT_PHDR='PHDR',
150 PT_GNU_EH_FRAME='GNU_EH_FRAME',
151 PT_GNU_STACK='GNU_STACK',
152 PT_GNU_RELRO='GNU_RELRO',
153 )
154
155 _DESCR_P_FLAGS = {
156 P_FLAGS.PF_X: 'E',
157 P_FLAGS.PF_R: 'R',
158 P_FLAGS.PF_W: 'W',
159 }
160
161 _DESCR_SH_TYPE = dict(
162 SHT_NULL='NULL',
163 SHT_PROGBITS='PROGBITS',
164 SHT_SYMTAB='SYMTAB',
165 SHT_STRTAB='STRTAB',
166 SHT_RELA='RELA',
167 SHT_HASH='HASH',
168 SHT_DYNAMIC='DYNAMIC',
169 SHT_NOTE='NOTE',
170 SHT_NOBITS='NOBITS',
171 SHT_REL='REL',
172 SHT_SHLIB='SHLIB',
173 SHT_DYNSYM='DYNSYM',
174 SHT_INIT_ARRAY='INIT_ARRAY',
175 SHT_FINI_ARRAY='FINI_ARRAY',
176 SHT_PREINIT_ARRAY='PREINIT_ARRAY',
177 SHT_GNU_HASH='GNU_HASH',
178 SHT_GROUP='GROUP',
179 SHT_SYMTAB_SHNDX='SYMTAB SECTION INDICIES',
180 SHT_GNU_verdef='VERDEF',
181 SHT_GNU_verneed='VERNEED',
182 SHT_GNU_versym='VERSYM',
183 SHT_GNU_LIBLIST='GNU_LIBLIST',
184 )
185
186 _DESCR_SH_FLAGS = {
187 SH_FLAGS.SHF_WRITE: 'W',
188 SH_FLAGS.SHF_ALLOC: 'A',
189 SH_FLAGS.SHF_EXECINSTR: 'X',
190 SH_FLAGS.SHF_MERGE: 'M',
191 SH_FLAGS.SHF_STRINGS: 'S',
192 SH_FLAGS.SHF_INFO_LINK: 'I',
193 SH_FLAGS.SHF_LINK_ORDER: 'L',
194 SH_FLAGS.SHF_OS_NONCONFORMING: 'O',
195 SH_FLAGS.SHF_GROUP: 'G',
196 SH_FLAGS.SHF_TLS: 'T',
197 SH_FLAGS.SHF_EXCLUDE: 'E',
198 }
199
200 _DESCR_ST_INFO_TYPE = dict(
201 STT_NOTYPE='NOTYPE',
202 STT_OBJECT='OBJECT',
203 STT_FUNC='FUNC',
204 STT_SECTION='SECTION',
205 STT_FILE='FILE',
206 STT_COMMON='COMMON',
207 STT_TLS='TLS',
208 STT_NUM='NUM',
209 STT_RELC='RELC',
210 STT_SRELC='SRELC',
211 )
212
213 _DESCR_ST_INFO_BIND = dict(
214 STB_LOCAL='LOCAL',
215 STB_GLOBAL='GLOBAL',
216 STB_WEAK='WEAK',
217 )
218
219 _DESCR_ST_VISIBILITY = dict(
220 STV_DEFAULT='DEFAULT',
221 STV_INTERNAL='INTERNAL',
222 STV_HIDDEN='HIDDEN',
223 STD_PROTECTED='PROTECTED',
224 )
225
226 _DESCR_ST_SHNDX = dict(
227 SHN_UNDEF='UND',
228 SHN_ABS='ABS',
229 SHN_COMMON='COM',
230 )
231
232 _DESCR_RELOC_TYPE_i386 = dict(
233 (v, k) for k, v in ENUM_RELOC_TYPE_i386.iteritems())
234
235 _DESCR_RELOC_TYPE_x64 = dict(
236 (v, k) for k, v in ENUM_RELOC_TYPE_x64.iteritems())
237
238