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
13 def describe_ei_class(x
):
14 return _DESCR_EI_CLASS
.get(x
, _unknown
)
16 def describe_ei_data(x
):
17 return _DESCR_EI_DATA
.get(x
, _unknown
)
19 def describe_ei_version(x
):
20 s
= '%d' % ENUM_E_VERSION
[x
]
25 def describe_ei_osabi(x
):
26 return _DESCR_EI_OSABI
.get(x
, _unknown
)
28 def describe_e_type(x
):
29 return _DESCR_E_TYPE
.get(x
, _unknown
)
31 def describe_e_machine(x
):
32 return _DESCR_E_MACHINE
.get(x
, _unknown
)
34 def describe_e_version_numeric(x
):
35 return '0x%x' % ENUM_E_VERSION
[x
]
37 def describe_p_type(x
):
38 return _DESCR_P_TYPE
.get(x
, _unknown
)
40 def describe_p_flags(x
):
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 ' '
46 def describe_sh_type(x
):
47 return _DESCR_SH_TYPE
.get(x
, _unknown
)
49 def describe_sh_flags(x
):
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 ''
59 def describe_symbol_type(x
):
60 return _DESCR_ST_INFO_TYPE
.get(x
, _unknown
)
62 def describe_symbol_bind(x
):
63 return _DESCR_ST_INFO_BIND
.get(x
, _unknown
)
65 def describe_symbol_visibility(x
):
66 return _DESCR_ST_VISIBILITY
.get(x
, _unknown
)
68 def describe_symbol_shndx(x
):
69 return _DESCR_ST_SHNDX
.get(x
, '%3s' % x
)
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
)
77 return 'unrecognized: %-7x' % (x
& 0xFFFFFFFF)
80 #-------------------------------------------------------------------------------
81 _unknown
= '<unknown>'
84 _DESCR_EI_CLASS
= dict(
90 _DESCR_EI_DATA
= dict(
92 ELFDATA2LSB
="2's complement, little endian",
93 ELFDATA2MSB
="2's complement, big endian",
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',
113 ELFOSABI_STANDALONE
='Standalone App',
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',
125 _DESCR_E_MACHINE
= dict(
129 EM_386
='Intel 80386',
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',
142 _DESCR_P_TYPE
= dict(
145 PT_DYNAMIC
='DYNAMIC',
150 PT_GNU_EH_FRAME
='GNU_EH_FRAME',
151 PT_GNU_STACK
='GNU_STACK',
152 PT_GNU_RELRO
='GNU_RELRO',
161 _DESCR_SH_TYPE
= dict(
163 SHT_PROGBITS
='PROGBITS',
168 SHT_DYNAMIC
='DYNAMIC',
174 SHT_INIT_ARRAY
='INIT_ARRAY',
175 SHT_FINI_ARRAY
='FINI_ARRAY',
176 SHT_PREINIT_ARRAY
='PREINIT_ARRAY',
177 SHT_GNU_HASH
='GNU_HASH',
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',
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',
200 _DESCR_ST_INFO_TYPE
= dict(
204 STT_SECTION
='SECTION',
213 _DESCR_ST_INFO_BIND
= dict(
219 _DESCR_ST_VISIBILITY
= dict(
220 STV_DEFAULT
='DEFAULT',
221 STV_INTERNAL
='INTERNAL',
223 STD_PROTECTED
='PROTECTED',
226 _DESCR_ST_SHNDX
= dict(
232 _DESCR_RELOC_TYPE_i386
= dict(
233 (v
, k
) for k
, v
in ENUM_RELOC_TYPE_i386
.iteritems())
235 _DESCR_RELOC_TYPE_x64
= dict(
236 (v
, k
) for k
, v
in ENUM_RELOC_TYPE_x64
.iteritems())