objutils/elf/defs.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__version__ = "0.1.0"
__copyright__ = """
objutils - Object file library for Python.
(C) 2010-2020 by Christoph Schueler <cpu12.gems@googlemail.com>
All Rights Reserved
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
"""
import enum
from collections import namedtuple
import struct
ELF_MAGIC = b"\x7fELF"
EI_NIDENT = 16 # Size of e_ident[].
HDR_FMT32 = "HHIIIIIHHHHHH"
HDR_FMT64 = "HHIQQQIHHHHHH"
Elf32_Ehdr = namedtuple(
"Elf32_Ehdr",
"""e_type e_machine e_version e_entry e_phoff e_shoff e_flags e_ehsize
e_phentsize e_phnum e_shentsize e_shnum e_shstrndx""",
)
class ELFType(enum.IntEnum):
ET_NONE = 0
" No file type"
ET_REL = 1
" Relocatable file"
ET_EXEC = 2
" Executable file"
ET_DYN = 3
" Shared object file"
ET_CORE = 4
" Core file"
ET_NUM = 5
"Number of defined types"
ET_LOOS = 0xFE00
"Operating system-specific"
ET_HIOS = 0xFEFF
"Operating system-specific"
ET_LOPROC = 0xFF00
" Processor-specific"
ET_HIPROC = 0xFFFF
"Processor-specific"
ELF_TYPE_NAMES = {
ELFType.ET_NONE: "No file type",
ELFType.ET_REL: "Relocatable file",
ELFType.ET_EXEC: "Executable file",
ELFType.ET_DYN: "Shared object file",
ELFType.ET_CORE: "Core file",
}
class ELFMachineType(enum.IntEnum):
EM_NONE = 0 # No machine.
EM_M32 = 1 # AT&T WE 32100.
EM_SPARC = 2 # SPARC.
EM_386 = 3 # Intel 80386.
EM_68K = 4 # Motorola 68000.
EM_88K = 5 # Motorola 88000.
"""
RESERVED 6 Reserved for future use
"""
EM_860 = 7 # Intel 80860.
EM_MIPS = 8 # MIPS I Architecture.
EM_S370 = 9 # IBM System/370 Processor.
EM_MIPS_RS3_LE = 10 # MIPS RS3000 Little-endian.
"""
RESERVED 11-14 Reserved for future use
"""
EM_PARISC = 15 # Hewlett-Packard PA-RISC.
RESERVED = 16 # Reserved for future use.
EM_VPP500 = 17 # Fujitsu VPP500.
EM_SPARC32PLUS = 18 # Enhanced instruction set SPARC.
EM_960 = 19 # Intel 80960.
EM_PPC = 20 # PowerPC.
EM_PPC64 = 21 # 64-bit PowerPC.
EM_S390 = 22 # IBM S390.
EM_SPU = 23 # Sony/Toshiba/IBM SPU.
"""
RESERVED 24-35 Reserved for future use
"""
EM_V800 = 36 # NEC V800.
EM_FR20 = 37 # Fujitsu FR20.
EM_RH32 = 38 # TRW RH-32.
EM_RCE = 39 # Motorola RCE.
EM_ARM = 40 # Advanced RISC Machines ARM.
EM_ALPHA = 41 # Digital Alpha.
EM_SH = 42 # Hitachi SH.
EM_SPARCV9 = 43 # SPARC Version 9.
EM_TRICORE = 44 # Siemens Tricore embedded processor.
EM_ARC = 45 # Argonaut RISC Core, Argonaut Technologies Inc.
EM_H8_300 = 46 # Hitachi H8/300.
EM_H8_300H = 47 # Hitachi H8/300H.
EM_H8S = 48 # Hitachi H8S.
EM_H8_500 = 49 # Hitachi H8/500.
EM_IA_64 = 50 # Intel IA-64 processor architecture.
EM_MIPS_X = 51 # Stanford MIPS-X.
EM_COLDFIRE = 52 # Motorola ColdFire.
EM_68HC12 = 53 # Motorola M68HC12. # could also be 0x4D12 (s. HC12EABI)
EM_MMA = 54 # Fujitsu MMA Multimedia Accelerator.
EM_PCP = 55 # Siemens PCP.
EM_NCPU = 56 # Sony nCPU embedded RISC processor.
EM_NDR1 = 57 # Denso NDR1 microprocessor.
EM_STARCORE = 58 # Motorola Star*Core processor.
EM_ME16 = 59 # Toyota ME16 processor.
EM_ST100 = 60 # STMicroelectronics ST100 processor.
EM_TINYJ = 61 # Advanced Logic Corp. TinyJ embedded processor family.
EM_X86_64 = 62 # Advanced Micro Devices X86-64.
EM_PDSP = 63 # Sony DSP Processor.
EM_PDP10 = 64 # DEC PDP-10
EM_PDP11 = 65 # DEC PDP-11
EM_FX66 = 66 # Siemens FX66 microcontroller.
EM_ST9PLUS = 67 # STMicroelectronics ST9+ 8/16 bit microcontroller.
EM_ST7 = 68 # STMicroelectronics ST7 8-bit microcontroller.
EM_68HC16 = 69 # Motorola MC68HC16 Microcontroller.
EM_68HC11 = 70 # Motorola MC68HC11 Microcontroller.
EM_68HC08 = 71 # Motorola MC68HC08 Microcontroller.
EM_68HC05 = 72 # Motorola MC68HC05 Microcontroller.
EM_SVX = 73 # Silicon Graphics SVx.
EM_ST19 = 74 # STMicroelectronics ST19 8-bit microcontroller.
EM_VAX = 75 # Digital VAX.
EM_CRIS = 76 # Axis Communications 32-bit embedded processor.
EM_JAVELIN = 77 # Infineon Technologies 32-bit embedded processor.
EM_FIREPATH = 78 # Element 14 64-bit DSP Processor.
EM_ZSP = 79 # LSI Logic 16-bit DSP Processor.
EM_MMIX = 80 # Donald Knuth's educational 64-bit processor.
EM_HUANY = 81 # Harvard University machine-independent object files .
EM_PRISM = 82 # SiTera Prism.
EM_AVR = 83 # Atmel AVR 8-bit microcontroller.
EM_FR30 = 84 # Fujitsu FR30.
EM_D10V = 85 # Mitsubishi D10V.
EM_D30V = 86 # Mitsubishi D30V.
EM_V850 = 87 # NEC v850.
EM_M32R = 88 # Mitsubishi M32R.
EM_MN10300 = 89 # Matsushita MN10300.
EM_MN10200 = 90 # Matsushita MN10200.
EM_PJ = 91 # picoJava.
EM_OPENRISC = 92 # OpenRISC 32-bit embedded processor.
EM_ARC_A5 = 93 # ARC Cores Tangent-A5.
EM_XTENSA = 94 # Tensilica Xtensa Architecture.
EM_VIDEOCORE = 95 # Alphamosaic VideoCore processor.
EM_TMM_GPP = 96 # Thompson Multimedia General Purpose Processor.
EM_NS32K = 97 # National Semiconductor 32000 series.
EM_TPC = 98 # Tenor Network TPC processor.
EM_SNP1K = 99 # Trebia SNP 1000 processor.
EM_ST200 = 100 # STMicroelectronics ST200 microcontroller.
EM_IP2K = 101 # Ubicom IP2022 micro controller.
EM_MAX = 102 # MAX Processor.
EM_CR = 103 # National Semiconductor CompactRISC.
EM_F2MC16 = 104 # Fujitsu F2MC16.
EM_MSP430 = 105 # TI msp430 micro controller.
EM_BLACKFIN = 106 # ADI Blackfin.
EM_SE_C33 = 107 # S1C33 Family of Seiko Epson processors.
EM_SEP = 108 # Sharp embedded microprocessor.
EM_ARCA = 109 # Arca RISC Microprocessor.
EM_UNICORE = (
110 # Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University.
)
EM_EXCESS = 111 # eXcess: 16/32/64-bit configurable embedded CPU.
EM_DXP = 112 # Icera Semiconductor Inc. Deep Execution Processor.
EM_ALTERA_NIOS2 = 113 # Altera Nios II soft-core processor.
EM_CRX = 114 # National Semiconductor CRX.
EM_XGATE = 115 # Motorola XGATE embedded processor.
EM_C166 = 116 # Infineon C16x/XC16x processor.
EM_M16C = 117 # Renesas M16C series microprocessors.
EM_DSPIC30F = 118 # Microchip Technology dsPIC30F Digital Signal Controller.
EM_CE = 119 # Freescale Communication Engine RISC core.
EM_M32C = 120 # Renesas M32C series microprocessors.
EM_TSK3000 = 131 # Altium TSK3000 core.
EM_RS08 = 132 # Freescale RS08 embedded processor.
EM_ECOG2 = 134 # Cyan Technology eCOG2 microprocessor.
EM_SCORE = 135 # Sunplus Score.
EM_SCORE7 = 135 # Sunplus S+core7 RISC processor.
EM_DSP24 = 136 # New Japan Radio (NJR) 24-bit DSP Processor.
EM_VIDEOCORE3 = 137 # Broadcom VideoCore III processor.
EM_LATTICEMICO32 = 138 # RISC processor for Lattice FPGA architecture.
EM_SE_C17 = 139 # Seiko Epson C17 family.
EM_TI_C6000 = 140 # Texas Instruments TMS320C6000 DSP family.
EM_TI_C2000 = 141 # Texas Instruments TMS320C2000 DSP family.
EM_TI_C5500 = 142 # Texas Instruments TMS320C55x DSP family.
EM_MMDSP_PLUS = 160 # STMicroelectronics 64bit VLIW Data Signal Processor.
EM_CYPRESS_M8C = 161 # Cypress M8C microprocessor.
EM_R32C = 162 # Renesas R32C series microprocessors.
EM_TRIMEDIA = 163 # NXP Semiconductors TriMedia architecture family.
EM_QDSP6 = 164 # QUALCOMM DSP6 Processor.
EM_I8051 = 165 # Intel 8051 and variants.
EM_STXP7X = 166 # STMicroelectronics STxP7x family.
EM_NDS32 = 167 # Andes Technology compact code size embedded RISC processor family.
EM_ECOG1 = 168 # Cyan Technology eCOG1X family.
EM_ECOG1X = 168 # Cyan Technology eCOG1X family.
EM_MAXQ30 = 169 # Dallas Semiconductor MAXQ30 Core Micro-controllers.
EM_XIMO16 = 170 # New Japan Radio (NJR) 16-bit DSP Processor.
EM_MANIK = 171 # M2000 Reconfigurable RISC Microprocessor.
EM_CRAYNV2 = 172 # Cray Inc. NV2 vector architecture.
EM_RX = 173 # Renesas RX family.
EM_METAG = 174 # Imagination Technologies META processor architecture.
EM_MCST_ELBRUS = 175 # MCST Elbrus general purpose hardware architecture.
EM_ECOG16 = 176 # Cyan Technology eCOG16 family.
EM_CR16 = 177 # National Semiconductor CompactRISC 16-bit processor.
EM_ETPU = 178 # Freescale Extended Time Processing Unit.
EM_SLE9X = 179 # Infineon Technologies SLE9X core.
EM_L1OM = 180 # Intel L1OM.
EM_AARCH64 = 183
EM_AVR32 = 185 # Atmel Corporation 32-bit microprocessor family.
EM_STM8 = 186 # STMicroeletronics STM8 8-bit microcontroller.
EM_TILE64 = 187 # Tilera TILE64 multicore architecture family.
EM_TILEPRO = 188 # Tilera TILEPro multicore architecture family.
EM_MICROBLAZE = 189 # Xilinx MicroBlaze 32-bit RISC soft processor core.
EM_CUDA = 190 # NVIDIA CUDA architecture.
EM_TILEGX = 191 # Tilera TILE-Gx
EM_AVR_OLD = 0x1057 # AVR magic number. Written in the absense of an ABI.
EM_MSP430_OLD = (
0x1059 # MSP430 magic number. Written in the absense of everything.
)
EM_MT = 0x2530 # Morpho MT. Written in the absense of an ABI.
EM_CYGNUS_FR30 = 0x3330 # FR30 magic number - no EABI available.
EM_OPENRISC_OLD = (
0x3426 # OpenRISC magic number. Written in the absense of an ABI.
)
EM_DLX = 0x5AA5 # DLX magic number. Written in the absense of an ABI.
EM_CYGNUS_FRV = 0x5441 # FRV magic number - no EABI available??.
EM_XC16X = 0x4688 # Infineon Technologies 16-bit microcontroller with C166-V2 core.
EM_NEC_V850 = 0x723E # V850ES/FJ3 /w NEC compiler.
EM_CYGNUS_D10V = (
0x7650 # D10V backend magic number. Written in the absence of an ABI.
)
EM_CYGNUS_D30V = (
0x7676 # D30V backend magic number. Written in the absence of an ABI.
)
EM_IP2K_OLD = 0x8217 # Ubicom IP2xxx; Written in the absense of an ABI.
EM_OR32 = 0x8472 # (Deprecated) Temporary number for the OpenRISC processor.
EM_CYGNUS_POWERPC = (
0x9025 # Cygnus PowerPC ELF backend. Written in the absence of an ABI.
)
EM_ALPHA_NO_ABI = (
0x9026 # Alpha backend magic number. Written in the absence of an ABI.
)
EM_CYGNUS_M32R = (
0x9041 # Cygnus M32R ELF backend. Written in the absence of an ABI.
)
EM_CYGNUS_V850 = (
0x9080 # V850 backend magic number. Written in the absense of an ABI.
)
EM_S390_OLD = (
0xA390 # old S/390 backend magic number. Written in the absence of an ABI.
)
EM_XTENSA_OLD = 0xABC7 # Old, unofficial value for Xtensa.
EM_XSTORMY16 = 0xAD45
EM_CYGNUS_MN10300 = 0xBEEF # mn10200 and mn10300 backend magic numbers. Written in the absense of an ABI.
EM_COOLRISC_C816 = 0xC816 # Raisonance CoolRISC C816.
EM_CYGNUS_MN10200 = 0xDEAD
EM_M32C_OLD = 0xFEB0 # Renesas M32C and M16C.
EM_IQ2000 = 0xFEBA # Vitesse IQ2000.
EM_NIOS32 = 0xFEBB # NIOS magic number - no EABI available.
EM_CYGNUS_MEP = 0xF00D # Toshiba MeP
EM_MOXIE = 0xFEED # Moxie
EM_MICROBLAZE_OLD = 0xBAAB # Old MicroBlaze
EM_ADAPTEVA_EPIPHANY = 0x1223 # Adapteva's Epiphany architecture.
ELF_MACHINE_NAMES = {
ELFMachineType.EM_NONE: "No machine",
ELFMachineType.EM_M32: "AT&T WE 32100",
ELFMachineType.EM_SPARC: "SPARC",
ELFMachineType.EM_386: "Intel 80386",
ELFMachineType.EM_68K: "Motorola 68000",
ELFMachineType.EM_88K: "Motorola 88000",
ELFMachineType.EM_860: "Intel 80860",
ELFMachineType.EM_MIPS: "MIPS I Architecture",
ELFMachineType.EM_S370: "IBM System/370 Processor",
ELFMachineType.EM_MIPS_RS3_LE: "MIPS RS3000 Little-endian",
ELFMachineType.EM_PARISC: "Hewlett-Packard PA-RISC",
ELFMachineType.RESERVED: "Reserved for future use",
ELFMachineType.EM_VPP500: "Fujitsu VPP500",
ELFMachineType.EM_SPARC32PLUS: "Enhanced instruction set SPARC",
ELFMachineType.EM_960: "Intel 80960",
ELFMachineType.EM_PPC: "PowerPC",
ELFMachineType.EM_PPC64: "PowerPC64",
ELFMachineType.EM_S390: "IBM S390",
ELFMachineType.EM_SPU: "Sony/Toshiba/IBM SPU",
ELFMachineType.EM_V800: "Renesas V850 (using RH850 ABI)",
ELFMachineType.EM_FR20: "Fujitsu FR20",
ELFMachineType.EM_RH32: "TRW RH-32",
ELFMachineType.EM_RCE: "Motorola RCE",
ELFMachineType.EM_ARM: "ARM",
ELFMachineType.EM_ALPHA: "Digital Alpha",
ELFMachineType.EM_SH: "Hitachi SH",
ELFMachineType.EM_SPARCV9: "SPARC Version 9",
ELFMachineType.EM_TRICORE: "Siemens Tricore embedded processor",
ELFMachineType.EM_ARC: "Argonaut RISC Core, Argonaut Technologies Inc",
ELFMachineType.EM_H8_300: "Hitachi H8/300",
ELFMachineType.EM_H8_300H: "Hitachi H8/300H",
ELFMachineType.EM_H8S: "Hitachi H8S",
ELFMachineType.EM_H8_500: "Hitachi H8/500",
ELFMachineType.EM_IA_64: "Intel IA-64 processor architecture",
ELFMachineType.EM_MIPS_X: "Stanford MIPS-X",
ELFMachineType.EM_COLDFIRE: "Motorola ColdFire",
ELFMachineType.EM_68HC12: "Motorola MC68HC12 Microcontroller",
ELFMachineType.EM_MMA: "Fujitsu MMA Multimedia Accelerator",
ELFMachineType.EM_PCP: "Siemens PCP",
ELFMachineType.EM_NCPU: "Sony nCPU embedded RISC processor",
ELFMachineType.EM_NDR1: "Denso NDR1 microprocessor",
ELFMachineType.EM_STARCORE: "Motorola Star*Core processor",
ELFMachineType.EM_ME16: "Toyota ME16 processor",
ELFMachineType.EM_ST100: "STMicroelectronics ST100 processor",
ELFMachineType.EM_TINYJ: "Advanced Logic Corp. TinyJ embedded processor family",
ELFMachineType.EM_X86_64: "Advanced Micro Devices X86-64",
ELFMachineType.EM_PDSP: "Sony DSP Processor",
ELFMachineType.EM_PDP10: "DEC PDP-10",
ELFMachineType.EM_PDP11: "DEC PDP-11",
ELFMachineType.EM_FX66: "Siemens FX66 microcontroller",
ELFMachineType.EM_ST9PLUS: "STMicroelectronics ST9+ 8/16 bit microcontroller",
ELFMachineType.EM_ST7: "STMicroelectronics ST7 8-bit microcontroller",
ELFMachineType.EM_68HC16: "Motorola MC68HC16 Microcontroller",
ELFMachineType.EM_68HC11: "Motorola MC68HC11 Microcontroller",
ELFMachineType.EM_68HC08: "Motorola MC68HC08 Microcontroller",
ELFMachineType.EM_68HC05: "Motorola MC68HC05 Microcontroller",
ELFMachineType.EM_SVX: "Silicon Graphics SVx",
ELFMachineType.EM_ST19: "STMicroelectronics ST19 8-bit microcontroller",
ELFMachineType.EM_VAX: "Digital VAX",
ELFMachineType.EM_CRIS: "Axis Communications 32-bit embedded processor",
ELFMachineType.EM_JAVELIN: "Infineon Technologies 32-bit embedded processor",
ELFMachineType.EM_FIREPATH: "Element 14 64-bit DSP Processor",
ELFMachineType.EM_ZSP: "LSI Logic 16-bit DSP Processor",
ELFMachineType.EM_MMIX: "Donald Knuth's educational 64-bit processor",
ELFMachineType.EM_HUANY: "Harvard University machine-independent object files",
ELFMachineType.EM_PRISM: "SiTera Prism",
ELFMachineType.EM_AVR: "Atmel AVR 8-bit microcontroller",
ELFMachineType.EM_FR30: "Fujitsu FR30",
ELFMachineType.EM_D10V: "Mitsubishi D10V",
ELFMachineType.EM_D30V: "Mitsubishi D30V",
ELFMachineType.EM_V850: "NEC v850",
ELFMachineType.EM_M32R: "Mitsubishi M32R",
ELFMachineType.EM_MN10300: "Matsushita MN10300",
ELFMachineType.EM_MN10200: "Matsushita MN10200",
ELFMachineType.EM_PJ: "picoJava",
ELFMachineType.EM_OPENRISC: "OpenRISC 32-bit embedded processor",
ELFMachineType.EM_ARC_A5: "ARC Cores Tangent-A5",
ELFMachineType.EM_XTENSA: "Tensilica Xtensa Architecture",
ELFMachineType.EM_VIDEOCORE: "Alphamosaic VideoCore processor",
ELFMachineType.EM_TMM_GPP: "Thompson Multimedia General Purpose Processor",
ELFMachineType.EM_NS32K: "National Semiconductor 32000 series",
ELFMachineType.EM_TPC: "Tenor Network TPC processor",
ELFMachineType.EM_SNP1K: "Trebia SNP 1000 processor",
ELFMachineType.EM_ST200: "STMicroelectronics ST200 microcontroller",
ELFMachineType.EM_IP2K: "Ubicom IP2022 micro controller",
ELFMachineType.EM_MAX: "MAX Processor",
ELFMachineType.EM_CR: "National Semiconductor CompactRISC",
ELFMachineType.EM_F2MC16: "Fujitsu F2MC16",
ELFMachineType.EM_MSP430: "TI msp430 micro controller",
ELFMachineType.EM_BLACKFIN: "ADI Blackfin",
ELFMachineType.EM_SE_C33: "S1C33 Family of Seiko Epson processors",
ELFMachineType.EM_SEP: "Sharp embedded microprocessor",
ELFMachineType.EM_ARCA: "Arca RISC Microprocessor",
ELFMachineType.EM_UNICORE: "Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University",
ELFMachineType.EM_EXCESS: "eXcess: 16/32/64-bit configurable embedded CPU",
ELFMachineType.EM_DXP: "Icera Semiconductor Inc. Deep Execution Processor",
ELFMachineType.EM_ALTERA_NIOS2: "Altera Nios II soft-core processor",
ELFMachineType.EM_CRX: "National Semiconductor CRX",
ELFMachineType.EM_XGATE: "Motorola XGATE embedded processor",
ELFMachineType.EM_C166: "Infineon Technologies xc16x",
ELFMachineType.EM_M16C: "Renesas M16C series microprocessors",
ELFMachineType.EM_DSPIC30F: "Microchip Technology dsPIC30F Digital Signal Controller",
ELFMachineType.EM_CE: "Freescale Communication Engine RISC core",
ELFMachineType.EM_M32C: "Renesas M32C series microprocessors",
ELFMachineType.EM_TSK3000: "Altium TSK3000 core",
ELFMachineType.EM_RS08: "Freescale RS08 embedded processor",
ELFMachineType.EM_ECOG2: "Cyan Technology eCOG2 microprocessor",
ELFMachineType.EM_SCORE: "Sunplus Score",
ELFMachineType.EM_SCORE7: "Sunplus S+core7 RISC processor",
ELFMachineType.EM_DSP24: "New Japan Radio (NJR) 24-bit DSP Processor",
ELFMachineType.EM_VIDEOCORE3: "Broadcom VideoCore III processor",
ELFMachineType.EM_LATTICEMICO32: "RISC processor for Lattice FPGA architecture",
ELFMachineType.EM_SE_C17: "Seiko Epson C17 family",
ELFMachineType.EM_TI_C6000: "Texas Instruments TMS320C6000 DSP family",
ELFMachineType.EM_TI_C2000: "Texas Instruments TMS320C2000 DSP family",
ELFMachineType.EM_TI_C5500: "Texas Instruments TMS320C55x DSP family",
ELFMachineType.EM_MMDSP_PLUS: "STMicroelectronics 64bit VLIW Data Signal Processor",
ELFMachineType.EM_CYPRESS_M8C: "Cypress M8C microprocessor",
ELFMachineType.EM_R32C: "Renesas R32C series microprocessors",
ELFMachineType.EM_TRIMEDIA: "NXP Semiconductors TriMedia architecture family",
ELFMachineType.EM_QDSP6: "QUALCOMM DSP6 Processor",
ELFMachineType.EM_I8051: "Intel 8051 and variants",
ELFMachineType.EM_STXP7X: "STMicroelectronics STxP7x family",
ELFMachineType.EM_NDS32: "Andes Technology compact code size embedded RISC processor family",
ELFMachineType.EM_ECOG1: "Cyan Technology eCOG1X family",
ELFMachineType.EM_ECOG1X: "Cyan Technology eCOG1X family",
ELFMachineType.EM_MAXQ30: "Dallas Semiconductor MAXQ30 Core Micro-controllers",
ELFMachineType.EM_XIMO16: "New Japan Radio (NJR) 16-bit DSP Processor",
ELFMachineType.EM_MANIK: "M2000 Reconfigurable RISC Microprocessor",
ELFMachineType.EM_CRAYNV2: "Cray Inc. NV2 vector architecture",
ELFMachineType.EM_RX: "Renesas RX family",
ELFMachineType.EM_METAG: "Imagination Technologies META processor architecture",
ELFMachineType.EM_MCST_ELBRUS: "MCST Elbrus general purpose hardware architecture",
ELFMachineType.EM_ECOG16: "Cyan Technology eCOG16 family",
ELFMachineType.EM_CR16: "National Semiconductor CompactRISC 16-bit processor",
ELFMachineType.EM_ETPU: "Freescale Extended Time Processing Unit",
ELFMachineType.EM_SLE9X: "Infineon Technologies SLE9X core",
ELFMachineType.EM_L1OM: "Intel L1OM",
ELFMachineType.EM_AARCH64: "AArch64",
ELFMachineType.EM_AVR32: "Atmel Corporation 32-bit microprocessor family",
ELFMachineType.EM_STM8: "STMicroeletronics STM8 8-bit microcontroller",
ELFMachineType.EM_TILE64: "Tilera TILE64 multicore architecture family",
ELFMachineType.EM_TILEPRO: "Tilera TILEPro multicore architecture family",
ELFMachineType.EM_MICROBLAZE: "Xilinx MicroBlaze 32-bit RISC soft processor core",
ELFMachineType.EM_TILEGX: "Tilera TILE-Gx",
ELFMachineType.EM_CUDA: "NVIDIA CUDA architecture",
ELFMachineType.EM_AVR_OLD: "AVR",
ELFMachineType.EM_MSP430_OLD: "MSP430",
ELFMachineType.EM_MT: "Morpho MT",
ELFMachineType.EM_CYGNUS_FR30: "Cygnus FR30",
ELFMachineType.EM_OPENRISC_OLD: "OpenRISC",
ELFMachineType.EM_DLX: "DLX",
ELFMachineType.EM_CYGNUS_FRV: "Cygnus FRV",
ELFMachineType.EM_XC16X: "Infineon C166-V2 core",
ELFMachineType.EM_NEC_V850: "V850ES/FJ3 (NEC compiler)",
ELFMachineType.EM_CYGNUS_D10V: "Cygnus D10V",
ELFMachineType.EM_CYGNUS_D30V: "Cygnus D30V",
ELFMachineType.EM_IP2K_OLD: "Ubicom IP2xxx",
ELFMachineType.EM_OR32: "OpenRISC 32",
ELFMachineType.EM_CYGNUS_POWERPC: "Cygnus PowerPC",
ELFMachineType.EM_ALPHA_NO_ABI: "Alpha",
ELFMachineType.EM_CYGNUS_M32R: "Cygnus M32R",
ELFMachineType.EM_CYGNUS_V850: "Cygnus V850",
ELFMachineType.EM_S390_OLD: "S/390",
ELFMachineType.EM_XTENSA_OLD: "Xtensa",
ELFMachineType.EM_XSTORMY16: "Xstormy16",
ELFMachineType.EM_CYGNUS_MN10300: "Cygnus mn10200 or mn10300",
ELFMachineType.EM_COOLRISC_C816: "CoolRISC C816",
ELFMachineType.EM_CYGNUS_MN10200: "Cygnus mn10200",
ELFMachineType.EM_M32C_OLD: "Renesas M32C or M16C.",
ELFMachineType.EM_IQ2000: "Vitesse IQ2000.",
ELFMachineType.EM_NIOS32: "NIOS",
ELFMachineType.EM_CYGNUS_MEP: "Toshiba MeP",
ELFMachineType.EM_MOXIE: "Moxie",
ELFMachineType.EM_MICROBLAZE_OLD: "Old MicroBlaze",
ELFMachineType.EM_ADAPTEVA_EPIPHANY: "Adapteva Epiphany",
}
EV_NONE = 0 # Invalid version.
EV_CURRENT = 1 # Current version.
##
## Offsets into file header.
##
EI_MAG0 = 0 # File identification.
EI_MAG1 = 1 # File identification.
EI_MAG2 = 2 # File identification.
EI_MAG3 = 3 # File identification.
EI_CLASS = 4 # File class.
EI_DATA = 5 # Data encoding.
EI_VERSION = 6 # File version.
EI_PAD = 7 # Start of padding bytes.
EI_OSABI = 7 # Operating system/ABI identification.
EI_ABIVERSION = 8 # ABI version.
# EI_NIDENT = 16 # Size of e_ident[] - defined above.
class ELFClass(enum.IntEnum):
ELFCLASSNONE = 0 # Invalid class.
ELFCLASS32 = 1 # 32-bit objects.
ELFCLASS64 = 2 # 64-bit objects.
ELF_CLASS_NAMES = {
ELFClass.ELFCLASSNONE: "Invalid class",
ELFClass.ELFCLASS32: "32-bit objects",
ELFClass.ELFCLASS64: "64-bit objects",
}
class ELFDataEncoding(enum.IntEnum):
ELFDATANONE = 0 # Invalid data encoding.
ELFDATA2LSB = 1 # Little-Endian.
ELFDATA2MSB = 2 # Big-Endian.
ELF_BYTE_ORDER_NAMES = {
ELFDataEncoding.ELFDATANONE: "Invalid data encoding",
ELFDataEncoding.ELFDATA2LSB: "Little-Endian",
ELFDataEncoding.ELFDATA2MSB: "Big-Endian",
}
class ELFAbiType(enum.IntEnum):
ELFOSABI_NONE = 0 # UNIX System V ABI
ELFOSABI_HPUX = 1 # HP-UX operating system
ELFOSABI_NETBSD = 2 # NetBSD
ELFOSABI_GNU = 3 # GNU
ELFOSABI_LINUX = 3 # Alias for ELFOSABI_GNU
ELFOSABI_SOLARIS = 6 # Solaris
ELFOSABI_AIX = 7 # AIX
ELFOSABI_IRIX = 8 # IRIX
ELFOSABI_FREEBSD = 9 # FreeBSD
ELFOSABI_TRU64 = 10 # TRU64 UNIX
ELFOSABI_MODESTO = 11 # Novell Modesto
ELFOSABI_OPENBSD = 12 # OpenBSD
ELFOSABI_OPENVMS = 13 # OpenVMS
ELFOSABI_NSK = 14 # Hewlett-Packard Non-Stop Kernel
ELFOSABI_AROS = 15 # AROS
ELFOSABI_FENIXOS = 16 # FenixOS
ELFOSABI_C6000_ELFABI = 64 # Bare-metal TMS320C6000; alt: ELFOSABI_ARM_AEABI
ELFOSABI_C6000_LINUX = 65 # Linux TMS320C6000
ELFOSABI_ARM = 97 # ARM
ELFOSABI_STANDALONE = 255 # Standalone (embedded) application
##
##
## ELF Sections.
##
##
SEC_FMT32 = "IIIIIIIIII"
ELF_SECTION_SIZE32 = struct.calcsize(SEC_FMT32)
SEC_FMT64 = "IIQQQQIIQQ"
ELF_SECTION_SIZE64 = struct.calcsize(SEC_FMT64)
Elf_Shdr = namedtuple(
"Elf_Shdr",
"""sh_name sh_type sh_flags sh_addr sh_offset sh_size
sh_link sh_info sh_addralign sh_entsize""",
)
class SectionName(enum.IntEnum):
SHN_UNDEF = 0
# SHN_UNDEF This value marks an undefined, missing, irrelevant, or otherwise
# meaningless section reference. For example, a symbol "defined'' relative to
# section number SHN_UNDEF is an undefined symbol.
SHN_LORESERVE = 0xFF00
# This value specifies the lower bound of the range of reserved indexes
SHN_LOPROC = 0xFF00
SHN_BEFORE = 0xFF00
# Order section before all others (Solaris).
SHN_AFTER = 0xFF01
# Order section after all others (Solaris).
SHN_HIPROC = 0xFF1F
# SHN_LOPROC through SHN_HIPROC: Values in this inclusive range are reserved for
# processor-specific semantics.
SHN_LOOS = 0xFF20
# Start of OS-specific
SHN_HIOS = 0xFF3F
# End of OS-specific
SHN_ABS = 0xFFF1
# SHN_ABS This value specifies absolute values for the corresponding reference. For
# example, symbols defined relative to section number SHN_ABS have
# absolute values and are not affected by relocation.
SHN_COMMON = 0xFFF2
# SHN_COMMON Symbols defined relative to this section are common symbols, such as
# FORTRAN COMMON or unallocated C external variables.
SHN_XINDEX = 0xFFFF
# Index is in extra table.
SHN_HIRESERVE = 0xFFFF
# SHN_HIRESERVE This value specifies the upper bound of the range of reserved indexes.
# The system reserves indexes between SHN_LORESERVE and SHN_HIRESERVE, inclusive;
# the values do not reference the section header table.That is, the section header
# table does not contain entries for the reserved indexes.
SHN_IA_64_ANSI_COMMON = 0xFF00
# This section only used by HP-UX, The HP linker gives weak symbols
# precedence over regular common symbols. We want common to override
# weak. Using this common instead of SHN_COMMON does that.
SpecialSections = {v: k for k, v in SectionName.__members__.items()}
def special_section_name(ndx):
if ndx in SpecialSections:
return SectionName(ndx).name
else:
return str(ndx)
class SectionType(enum.IntEnum):
""" """
SHT_NULL = 0 # Section header table entry unused.
SHT_PROGBITS = 1 # Program data.
SHT_SYMTAB = 2 # Symbol table.
SHT_STRTAB = 3 # String table.
SHT_RELA = 4 # Relocation entries with addends.
SHT_HASH = 5 # Symbol hash table.
SHT_DYNAMIC = 6 # Dynamic linking information.
SHT_NOTE = 7 # Notes.
SHT_NOBITS = 8 # Program space with no data (bss).
SHT_REL = 9 # Relocation entries, no addends.
SHT_SHLIB = 10 # Reserved.
SHT_DYNSYM = 11 # Dynamic linker symbol table.
SHT_INIT_ARRAY = 14 # Array of constructors.
SHT_FINI_ARRAY = 15 # Array of destructors.
SHT_PREINIT_ARRAY = 16 # Array of pre-constructors.
SHT_GROUP = 17 # Section group.
SHT_SYMTAB_SHNDX = 18 # Extended section indeces.
SHT_NUM = 19 # Number of defined types.
SHT_LOOS = 0x60000000 # Start OS-specific.
SHT_GNU_INCREMENTAL_INPUTS = 0x6FFF4700 # incremental build data
SHT_GNU_ATTRIBUTES = 0x6FFFFFF5 # Object attributes.
SHT_GNU_HASH = 0x6FFFFFF6 # GNU-style hash table.
SHT_GNU_LIBLIST = 0x6FFFFFF7 # Prelink library list
SHT_CHECKSUM = 0x6FFFFFF8 # Checksum for DSO content.
SHT_LOSUNW = 0x6FFFFFFA # Sun-specific low bound.
SHT_SUNW_move = 0x6FFFFFFA
SHT_SUNW_COMDAT = 0x6FFFFFFB
SHT_SUNW_syminfo = 0x6FFFFFFC
SHT_GNU_verdef = 0x6FFFFFFD # Version definition section.
SHT_GNU_verneed = 0x6FFFFFFE # Version needs section.
SHT_GNU_versym = 0x6FFFFFFF # Version symbol table.
SHT_HISUNW = 0x6FFFFFFF # Sun-specific high bound.
SHT_HIOS = 0x6FFFFFFF # End OS-specific type.
SHT_LOPROC = 0x70000000 # Start of processor-specific.
SHT_ARM_EXIDX = 0x70000001 # Section holds ARM unwind info.
SHT_ARM_PREEMPTMAP = 0x70000002 # Section pre-emption details.
SHT_ARM_ATTRIBUTES = 0x70000003 # Section holds attributes.
SHT_ARM_DEBUGOVERLAY = 0x70000004 # Section holds overlay debug info.
SHT_ARM_OVERLAYSECTION = (
0x70000005 # Section holds GDB and overlay integration info.
)
SHT_HIPROC = 0x7FFFFFFF # End of processor-specific.
SHT_LOUSER = 0x80000000 # Start of application-specific.
SHT_HIUSER = 0xFFFFFFFF # End of application-specific.
class SectionFlags(enum.IntEnum):
SHF_WRITE = 0x1 # Writeable.
SHF_ALLOC = 0x2 # Occupies memory during execution
SHF_EXECINSTR = 0x4 # Executable.
SHF_MERGE = 16 # Might be merged
SHF_STRINGS = 32 # Contains nul-terminated strings
SHF_INFO_LINK = 64 # `sh_info' contains SHT index
SHF_LINK_ORDER = 128 # Preserve order after combining
SHF_OS_NONCONFORMING = 256 # Non-standard OS specific handling required
SHF_GROUP = 512 # Section is member of a group.
SHF_TLS = 1024 # Section hold thread-local data.
SHF_COMPRESSED = 2048 # Section with compressed data.
SHF_MASKOS = 0x0FF00000 # OS-specific.
SHF_MASKPROC = 0xF0000000 # Processor-specific.
SHF_ORDERED = 1073741824 # Special ordering requirement (Solaris).
SHF_EXCLUDE = (
2147483648 # Section is excluded unless referenced or allocated (Solaris).
)
##
##
## ELF Symbol Table.
##
##
SYMTAB_FMT32 = "IIIBBH"
SYMTAB_FMT64 = "IBBHQQ"
Elf32_Sym = namedtuple("Elf_Sym", "st_name st_value st_size st_info st_other st_shndx")
Elf64_Sym = namedtuple("Elf_Sym", "st_name st_info st_other st_shndx st_value st_size")
ELF32_SYM_TABLE_SIZE = struct.calcsize(SYMTAB_FMT32)
ELF64_SYM_TABLE_SIZE = struct.calcsize(SYMTAB_FMT64)
STN_UNDEF = 0
class SymbolBinding(enum.IntEnum):
STB_LOCAL = 0 # i.e. `static`
STB_GLOBAL = 1
STB_WEAK = 2
STB_GNU_UNIQUE = 10 # Symbol is unique in namespace.
STB_LOPROC = 13
STB_HIPROC = 15
class SymbolType(enum.IntEnum):
STT_NOTYPE = 0
STT_OBJECT = 1
STT_FUNC = 2
STT_SECTION = 3
STT_FILE = 4
STT_COMMON = 5
STT_TLS = 6
STT_RELC = 8 # Complex relocation expression.
STT_SRELC = 9 # Signed Complex relocation expression.
STT_GNU_IFUNC = 10 # Symbol is an indirect code object.
STT_LOPROC = 13
STT_HIPROC = 15
class SymbolVisibility(enum.IntEnum):
"""Symbol visibility specification encoded in the st_other field."""
STV_DEFAULT = 0 # Default symbol visibility rules
STV_INTERNAL = 1 # Processor specific hidden class
STV_HIDDEN = 2 # Sym unavailable in other modules
STV_PROTECTED = 3 # Not preemptible, not exported
##
##
## ELF Program Header
##
##
PT_NULL = 0 # Program header table entry unused.
PT_LOAD = 1 # Loadable program segment.
PT_DYNAMIC = 2 # Dynamic linking information.
PT_INTERP = 3 # Program interpreter.
PT_NOTE = 4 # Auxiliary information.
PT_SHLIB = 5 # Reserved.
PT_PHDR = 6 # Entry for header table itself.
PT_TLS = 7 # Thread-local storage segment
PT_NUM = 8 # Number of defined types
PT_LOOS = 0x60000000 # Start of OS-specific
PT_GNU_EH_FRAME = 0x6474E550 # GCC .eh_frame_hdr segment
PT_GNU_STACK = 0x6474E551 # Indicates stack executability
PT_GNU_RELRO = 0x6474E552 # Read-only after relocation
PT_GNU_PROPERTY = 0x6474E553 # GNU property
PT_LOSUNW = 0x6FFFFFFA
PT_SUNWBSS = 0x6FFFFFFA # Sun Specific segment
PT_SUNWSTACK = 0x6FFFFFFB # Stack segment
PT_HISUNW = 0x6FFFFFFF
PT_HIOS = 0x6FFFFFFF # End of OS-specific
PT_LOPROC = 0x70000000 # Start of processor-specific.
PT_ARM_EXIDX = PT_LOPROC + 1 # Frame unwind information
PT_HIPROC = 0x7FFFFFFF # End of processor-specific
PF_X = 0x1 # Execute.
PF_W = 0x2 # Write.
PF_R = 0x4 # Read.
PF_MASKPROC = 0xF0000000 # Unspecified.
PN_XNUM = 0xFFFF # Extended numbering.
class NoteSegmentDescriptorCore(enum.IntEnum):
"""
Legal values for note segment descriptor types for core files.
"""
NT_PRSTATUS = 1 # prstatus struct.
NT_FPREGSET = 2 # fpregset struct.
NT_PRPSINFO = 3 # prpsinfo struct.
NT_PRXREG = 4 # prxregset struct.
NT_TASKSTRUCT = 4 # task structure.
NT_PLATFORM = 5 # String from sysinfo(SI_PLATFORM).
NT_AUXV = 6 # auxv array.
NT_GWINDOWS = 7 # gwindows struct.
NT_ASRS = 8 # asrset struct.
NT_PSTATUS = 10 # pstatus struct.
NT_PSINFO = 13 # psinfo struct.
NT_PRCRED = 14 # prcred struct.
NT_UTSNAME = 15 # utsname struct.
NT_LWPSTATUS = 16 # lwpstatus struct.
NT_LWPSINFO = 17 # lwpinfo struct.
NT_PRFPXREG = 20 # fprxregset struct.
NT_PRXFPREG = 0x46E62B7F # user_fxsr_struct.
NT_PPC_VMX = 0x100 # PowerPC Altivec/VMX registers.
NT_PPC_SPE = 0x101 # PowerPC SPE/EVR registers.
NT_PPC_VSX = 0x102 # PowerPC VSX registers.
NT_386_TLS = 0x200 # i386 TLS slots (struct user_desc).
NT_386_IOPERM = 0x201 # x86 io permission bitmap (1=deny).
NT_X86_XSTATE = 0x202 # x86 extended state using xsave.
class NoteSegmentDescriptorObject(enum.IntEnum):
"""
Legal values for the note segment descriptor types for object files.
"""
NT_VERSION = 1 # Contains a version string.
BYTEORDER_PREFIX = {
ELFDataEncoding.ELFDATA2LSB: "<", # Little-Endian.
ELFDataEncoding.ELFDATA2MSB: ">", # Big-Endian.
}