/// ELF format. /// /// Sources: /// - linux/include/uapi/linux/elf.h /// - http://www.sco.com/developers/gabi/latest/ch4.eheader.html /// - https://docs.oracle.com/cd/E19683-01/816-1386/chapter6-79797/index.html /// /// Authors: dd86k <dd@dax.moe> /// Copyright: © dd86k <dd@dax.moe> /// License: BSD-3-Clause-Clear module adbg.object.format.elf; import adbg.object.server; import adbg.machines : AdbgMachine; import adbg.error; import adbg.utils.bit; import adbg.include.c.stdlib : calloc, free; import adbg.include.c.config; import core.stdc.string : strncmp; // NOTE: The string table section is typically named .shstrtab /// Signature magic for ELF. enum ELF_MAGIC = CHAR32!"\x7FELF"; /// Minimum file size for ELF. // https://stackoverflow.com/a/53383541 private enum MINIMUM_SIZE = 130; // ELF32 private alias uint Elf32_Addr; private alias ushort Elf32_Half; private alias uint Elf32_Off; private alias int Elf32_Sword; private alias uint Elf32_Word; // ELF64 private alias ulong Elf64_Addr; private alias ushort Elf64_Half; private alias short Elf64_SHalf; private alias ulong Elf64_Off; private alias int Elf64_Sword; private alias uint Elf64_Word; private alias ulong Elf64_Xword; private alias long Elf64_Sxword; extern (C): // Constants enum ELF_EI_NIDENT = 16; /// Size of the initial pad (e_ident[]) // ELF Indexes // 0..3 is "ELF\0" magic enum ELF_EI_CLASS = 4; /// Class index enum ELF_EI_DATA = 5; /// Data index enum ELF_EI_VERSION = 6; /// File version index enum ELF_EI_OSABI = 7; /// OS/ABI type index enum ELF_EI_ABIVERSION = 8; /// ABI version index // ELF Class identifiers enum ELF_CLASS_NONE = 0; /// No class enum ELF_CLASS_32 = 1; /// 32-bit ELF enum ELF_CLASS_64 = 2; /// 64-bit ELF // ELF Data identifiers enum ELF_DATA_NONE = 0; /// Invalid value enum ELF_DATA_LSB = 1; /// Little-endian enum ELF_DATA_MSB = 2; /// Big-endian // ELF Version identifiers enum ELF_EV_NONE = 0; /// No ELF version enum ELF_EV_CURRENT = 1; /// ELF Version 1 // ELF OSABI identifiers enum ELF_OSABI_NONE = 0; /// System V enum ELF_OSABI_HPUX = 1; /// HP-UX enum ELF_OSABI_NETBSD = 2; /// NetBSD enum ELF_OSABI_GNU = 3; /// GNU enum ELF_OSABI_LINUX = ELF_OSABI_GNU; /// Linux enum ELF_OSABI_SOLARIS = 6; /// Solaris enum ELF_OSABI_AIX = 7; /// AIX enum ELF_OSABI_IRIX = 8; /// IRIX enum ELF_OSABI_FREEBSD = 9; /// FreeBSD enum ELF_OSABI_TRU64 = 10; /// Compaq TRU64 UNIX enum ELF_OSABI_MODESTO = 11; /// Novell Modesto enum ELF_OSABI_OPENBSD = 12; /// OpenBSD enum ELF_OSABI_OPENVMS = 13; /// OpenVMS enum ELF_OSABI_NSK = 14; /// Hewlett-Packard Non-Stop Kernel enum ELF_OSABI_AROS = 15; /// Amiga Research OS enum ELF_OSABI_FENIXOS = 16; /// FenixOS enum ELF_OSABI_CLOUDABI = 17; /// Nuxi CloudABI enum ELF_OSABI_OPENVOS = 18; /// Stratus Technologies OpenVOS // ELF Type values enum ELF_ET_NONE = 0; /// No file type enum ELF_ET_REL = 1; /// Relocatable file enum ELF_ET_EXEC = 2; /// Executable file enum ELF_ET_DYN = 3; /// Shared object file enum ELF_ET_CORE = 4; /// Core file enum ELF_ET_LOOS = 0xFE00; /// OS-specific enum ELF_ET_HIOS = 0xFEFF; /// OS-specific enum ELF_ET_LOPROC = 0xFF00; /// Processor-specific enum ELF_ET_HIPROC = 0xFFFF; /// Processor-specific // ELF Machine values // FatELF also uses this // GDB has the full list of machines under include/elf/common.h enum ELF_EM_NONE = 0; /// No machine enum ELF_EM_M32 = 1; /// AT&T WE 32100 enum ELF_EM_SPARC = 2; /// SPARC enum ELF_EM_386 = 3; /// Intel x86 enum ELF_EM_68K = 4; /// Motorola 68000 enum ELF_EM_88K = 5; /// Motorola 88000 enum ELF_EM_MCU = 6; /// Intel MCU enum ELF_EM_860 = 7; /// Intel 80860 enum ELF_EM_MIPS = 8; /// MIPS I (RS3000) enum ELF_EM_S370 = 9; /// IBM System/370 enum ELF_EM_MIPS_RS3_LE = 10; /// MIPS RS3000 Little-Endian enum ELF_EM_PARISC = 15; /// Hewlett-Packard PA-RISC enum ELF_EM_VPP500 = 17; /// Fujitsu VPP500 enum ELF_EM_SPARC32PLUS = 18; /// Enhanced SPARC enum ELF_EM_960 = 19; /// Intel 80960 enum ELF_EM_PPC = 20; /// PowerPC enum ELF_EM_PPC64 = 21; /// 64-bit PowerPC enum ELF_EM_S390 = 22; /// IBM System/390 enum ELF_EM_SPU = 23; /// IBM SPU/SPC enum ELF_EM_V800 = 36; /// NEC V800 enum ELF_EM_FR20 = 37; /// Fujitsu FR20 enum ELF_EM_RH32 = 38; /// TRW enum ELF_EM_RCE = 39; /// Motorola RCE enum ELF_EM_ARM = 40; /// ARM 32-bit enum ELF_EM_ALPHA = 41; /// DEC Alpha enum ELF_EM_SH = 42; /// Hitachi SuperH enum ELF_EM_SPARCV9 = 43; /// SPARC Version 9 enum ELF_EM_TRICORE = 44; /// Siemens TriCore embedded enum ELF_EM_ARC = 45; /// Argonaut RISC Core enum ELF_EM_H8_300 = 46; /// Hitachi H8/300 enum ELF_EM_H8_300H = 47; /// Hitachi H8/300H enum ELF_EM_H8S = 48; /// Hitachi H8S enum ELF_EM_H8_500 = 49; /// Hitachi H8/500 enum ELF_EM_IA_64 = 50; /// Intel Itanium Architecture 64 enum ELF_EM_MIPS_X = 51; /// Stanford MIPS-X enum ELF_EM_COLDFIRE = 52; /// Motorola ColdFire enum ELF_EM_68HC12 = 53; /// Motorola M68HC12 enum ELF_EM_MMA = 54; /// Fujitsu MMA Multimedia Accelerator enum ELF_EM_PCP = 55; /// Siemens PCP enum ELF_EM_NCPU = 56; /// Sony nCPU embedded RISC enum ELF_EM_NDR1 = 57; /// Denso NDR1 enum ELF_EM_STARCORE = 58; /// Motorola Star*Core enum ELF_EM_ME16 = 59; /// Toyota ME16 enum ELF_EM_ST100 = 60; /// STMicroelectronics ST100 enum ELF_EM_TINYJ = 61; /// Advanced Logic Corp. TinyJ enum ELF_EM_X86_64 = 62; /// AMD x86-64 enum ELF_EM_PDSP = 63; /// Sony DSP enum ELF_EM_PDP10 = 64; /// DEC PDP-10 enum ELF_EM_PDP11 = 65; /// DEC PDP-11 enum ELF_EM_FX66 = 66; /// Siemens FX66 enum ELF_EM_ST9PLUS = 67; /// STMicroelectronics ST9+ (8/16-bit) enum ELF_EM_ST7 = 68; /// STMicroelectronics ST7 (8-bit) enum ELF_EM_68HC16 = 69; /// Motorola 68HC16 enum ELF_EM_68HC11 = 70; /// Motorola 68HC11 enum ELF_EM_68HC08 = 71; /// Motorola 68HC08 enum ELF_EM_68HC05 = 72; /// Motorola 68HC05 enum ELF_EM_SVX = 73; /// Silicon Graphics SVx enum ELF_EM_ST19 = 74; /// STMicroelectronics ST19 (8-bit) enum ELF_EM_VAX = 75; /// DEC VAX enum ELF_EM_CRIS = 76; /// Axis Communications (32-bit) enum ELF_EM_JAVELIN = 77; /// Infineon Technologies (32-bit) enum ELF_EM_FIREPATH = 78; /// Element 14 DSP (64-bit) enum ELF_EM_ZSP = 79; /// LSI Logic DSP (16-bit) enum ELF_EM_MMIX = 80; /// Donald Knuth's educational processor (64-bit) enum ELF_EM_HUANY = 81; /// Harvard University machine-independent object files enum ELF_EM_PRISM = 82; /// SiTera Prism enum ELF_EM_AVR = 83; /// Atmel AVR (8-bit) enum ELF_EM_FR30 = 84; /// Fujitsu FR30 enum ELF_EM_D10V = 85; /// Mitsubishi D10V enum ELF_EM_D30V = 86; /// Mitsubishi D30V enum ELF_EM_V850 = 87; /// NEC V850 enum ELF_EM_M32R = 88; /// Mitsubishi M32R enum ELF_EM_MN10300 = 89; /// Mitsubishi MN10300 enum ELF_EM_MN10200 = 90; /// Mitsubishi MN10200 enum ELF_EM_PJ = 91; /// picoJava enum ELF_EM_OPENRISC = 92; /// OpenRISC (32-bit) enum ELF_EM_ARC_COMPACT = 93; /// ARC International ARCompact enum ELF_EM_XTENSA = 94; /// Tensilica Xtensa Architecture enum ELF_EM_VIDEOCORE = 95; /// Alphamosaic VideoCore enum ELF_EM_TMM_GPP = 96; /// Thompson Multimedia General Purpose enum ELF_EM_NS32K = 97; /// National Semiconductor 32000 enum ELF_EM_TPC = 98; /// Tenor Network TPC enum ELF_EM_SNP1K = 99; /// Trebia SNP 1000 enum ELF_EM_ST200 = 100; /// STMicroelectronics ST200 enum ELF_EM_IP2K = 101; /// Ubicom IP2xxx enum ELF_EM_MAX = 102; /// MAX enum ELF_EM_CR = 103; /// National Semiconductor CompactRISC enum ELF_EM_F2MC16 = 104; /// Fujitsu F2MC16 enum ELF_EM_MSP430 = 105; /// Texas Instruments MSP430 enum ELF_EM_BLACKFIN = 106; /// Analog Devices Blackfin DSP enum ELF_EM_SE_C33 = 107; /// Seiko Epson S1C33 enum ELF_EM_SEP = 108; /// Sharp enum ELF_EM_ARCA = 109; /// Arca RISC enum ELF_EM_UNICORE = 110; /// PKU-Unity/Pekin Unicore enum ELF_EM_EXCESS = 111; /// eXcess (16/32/64-bit) enum ELF_EM_DXP = 112; /// Icera Semiconductor Inc. Deep Execution enum ELF_EM_ALTERA_NIOS2 = 113; /// Altera Nios II soft-core enum ELF_EM_CRX = 114; /// national Semiconductor CompactRISC CRX enum ELF_EM_XGATE = 115; /// Motorola XGATE enum ELF_EM_C116 = 116; /// Infineon C16x/XC16x enum ELF_EM_M16C = 117; /// Renesas M16C enum ELF_EM_DSPIC30F = 118; /// Microchip Technology DSPIC30F enum ELF_EM_CE = 119; /// Freescale Communication Engine RISC enum ELF_EM_M32C = 120; /// Renesas M32C enum ELF_EM_TSK3000 = 131; /// Altium TSK3000 enum ELF_EM_RS08 = 132; /// Freescale RS08 enum ELF_EM_SHARC = 133; /// SHARC (32-bit) enum ELF_EM_ECOG2 = 134; /// Cyan Technology eCOG2 enum ELF_EM_SCORE7 = 135; /// Sunplus S+core7 RISC enum ELF_EM_DSP24 = 136; /// New Japan Radio (NJR) DSP (24-bit) enum ELF_EM_VIDEOCORE3 = 137; /// Broadcom VideoCore III enum ELF_EM_LATTICEMICO32 = 138; /// Lattice FPGA enum ELF_EM_SE_C17 = 139; /// Seiko Epson C17 enum ELF_EM_TI_C6000 = 140; /// Texas Instruments TMS320C6000 enum ELF_EM_TI_C2000 = 141; /// Texas Instruments TMS320C2000 enum ELF_EM_TI_C5500 = 142; /// Texas Instruments TMS320C55xx enum ELF_EM_TI_ARP32 = 143; /// Texas Instruments Application Specific RISC (32-bit) enum ELF_EM_TI_PRU = 144; /// Texas Instruments Programmable Realtime Unit enum ELF_EM_MMDSP_PLUS = 160; /// STMicroelectronics VLIW DSP (64-bit) enum ELF_EM_CYPRESS_M8C = 161; /// Cypress M8C enum ELF_EM_R32C = 162; /// Renesas R32C enum ELF_EM_TRIMEDIA = 163; /// NXP Semiconductors TriMedia enum ELF_EM_QDSP6 = 164; /// QUALCOMM DSP6 enum ELF_EM_8051 = 165; /// Intel 8051 enum ELF_EM_STXP7X = 166; /// STMicroelectronics STxP7x enum ELF_EM_NDS32 = 167; /// Andes Technology RISC enum ELF_EM_ECOG1X = 168; /// Cyan Technology eCOG1X enum ELF_EM_MAXQ30 = 169; /// Dallas Semiconductor MAXQ30 enum ELF_EM_XIMO16 = 170; /// New Japan Radio (NJR) DSP (16-bit) enum ELF_EM_MANIK = 171; /// M2000 Reconfigurable RISC enum ELF_EM_CRAYNV2 = 172; /// Cray Inc. NV2 enum ELF_EM_RX = 173; /// Renesas RX enum ELF_EM_METAG = 174; /// Imagination Technologies META enum ELF_EM_MCST_ELBRUS = 175; /// MCST Elbrus general purpose hardware enum ELF_EM_ECOG16 = 176; /// Cyan Technology eCOG16 enum ELF_EM_CR16 = 177; /// National Semiconductor CompactRISC CR16 (16-bit) enum ELF_EM_ETPU = 178; /// Freescale Extended Time Processing Unit enum ELF_EM_SLE9X = 179; /// Infineon Technologies SLE9X enum ELF_EM_L10M = 180; /// Intel L10M enum ELF_EM_K10M = 181; /// Intel K10M enum ELF_EM_AARCH64 = 183; /// ARM (64-bit) enum ELF_EM_AVR32 = 185; /// Atmel Corporation (32-bit) enum ELF_EM_STM8 = 186; /// STMicroeletronics STM8 (8-bit) enum ELF_EM_TILE64 = 187; /// Tilera TILE64 enum ELF_EM_TILEPRO = 188; /// Tilera TILEPro enum ELF_EM_MICROBLAZE = 189; /// Xilinx MicroBlaze RISC soft core (32-bit) enum ELF_EM_CUDA = 190; /// NVIDIA CUDA enum ELF_EM_TILEGX = 191; /// Tilera TILE-Gx enum ELF_EM_CLOUDSHIELD = 192; /// CloudShield enum ELF_EM_COREA_1ST = 193; /// KIPO-KAIST Core-A 1st generation enum ELF_EM_COREA_2ND = 194; /// KIPO-KAIST Core-A 2nd generation enum ELF_EM_ARC_COMPACT2 = 195; /// Synopsys ARCompact V2 enum ELF_EM_OPEN8 = 196; /// Open8 RISC soft core (8-bit) enum ELF_EM_RL78 = 197; /// Renesas RL78 enum ELF_EM_VIDEOCORE5 = 198; /// Broadcom VideoCore V enum ELF_EM_78KOR = 199; /// Renesas 78KOR enum ELF_EM_56800EX = 200; /// Freescale 56800EX DSC enum ELF_EM_BA1 = 201; /// Beyond BA1 enum ELF_EM_BA2 = 202; /// Beyond BA2 enum ELF_EM_XCORE = 203; /// XMOS xCORE enum ELF_EM_MCHP_PIC = 204; /// Microchip PIC(r) (8-bit) enum ELF_EM_INTEL205 = 205; /// Reserved by Intel enum ELF_EM_INTEL206 = 206; /// Reserved by Intel enum ELF_EM_INTEL207 = 207; /// Reserved by Intel enum ELF_EM_INTEL208 = 208; /// Reserved by Intel enum ELF_EM_INTEL209 = 209; /// Reserved by Intel enum ELF_EM_KM32 = 210; /// KM211 KM32 (32-bit) enum ELF_EM_KMX32 = 211; /// KM211 KMX32 (32-bit) enum ELF_EM_KMX16 = 212; /// KM211 KMX16 (16-bit) enum ELF_EM_KMX8 = 213; /// KM211 KMX8 (8-bit) enum ELF_EM_KVARC = 214; /// KM211 KVARC enum ELF_EM_CDP = 215; /// Paneve CDP enum ELF_EM_COGE = 216; /// Cognitive Smart Memory enum ELF_EM_COOL = 217; /// Bluechip Systems enum ELF_EM_NORC = 218; /// Nanoradio Optimized RISC enum ELF_EM_CSR_KALIMBA = 219; /// CSR Kalimba enum ELF_EM_Z80 = 220; /// Zilog Z80 enum ELF_EM_VISIUM = 221; /// VISIUMcore enum ELF_EM_FT32 = 222; /// FTDI Chip FT32 RISC (32-bit) enum ELF_EM_MOXIE = 223; /// Moxie enum ELF_EM_AMDGPU = 224; /// AMD GPU enum ELF_EM_RISCV = 243; /// RISC-V enum ELF_EM_LOONGARCH = 258; /// LoongArch // // ehdr e_flags // // ARM enum ELF_EF_ARM_RELEXEC = 0x01; /// enum ELF_EF_ARM_HASENTRY = 0x02; /// enum ELF_EF_ARM_INTERWORK = 0x04; /// enum ELF_EF_ARM_APCS_26 = 0x08; /// enum ELF_EF_ARM_APCS_FLOAT = 0x10; /// enum ELF_EF_ARM_PIC = 0x20; /// enum ELF_EF_ARM_ALIGN8 = 0x40; /// 8-bit structure alignment is in use enum ELF_EF_ARM_NEW_ABI = 0x80; /// enum ELF_EF_ARM_OLD_ABI = 0x100; /// enum ELF_EF_ARM_SOFT_FLOAT = 0x200; /// enum ELF_EF_ARM_VFP_FLOAT = 0x400; /// enum ELF_EF_ARM_MAVERICK_FLOAT = 0x800; /// // MIPS enum ELF_EF_MIPS_NOREORDER = 1; /// A .noreorder directive was used enum ELF_EF_MIPS_PIC = 2; /// Contains PIC code enum ELF_EF_MIPS_CPIC = 4; /// Uses PIC calling sequence enum ELF_EF_MIPS_XGOT = 8; /// enum ELF_EF_MIPS_64BIT_WHIRL = 16; /// enum ELF_EF_MIPS_ABI2 = 32; /// enum ELF_EF_MIPS_ABI_ON32 = 64; /// enum ELF_EF_MIPS_ARCH = 0xf0000000; /// MIPS architecture level // SPARC // https://docs.oracle.com/cd/E19120-01/open.solaris/819-0690/chapter6-43405/index.html enum ELF_EF_SPARC_EXT_MARK = 0xffff00; /// Vendor Extension mask enum ELF_EF_SPARC_32PLUS = 0x000100; /// Generic V8+ features enum ELF_EF_SPARC_SUN_US1 = 0x000200; /// Sun UltraSPARC 1 Extensions enum ELF_EF_SPARC_HAL_R1 = 0x000400; /// HAL R1 Extensions enum ELF_EF_SPARC_SUN_US3 = 0x000800; /// Sun UltraSPARC 3 Extensions enum ELF_EF_SPARCV9_MM = 0x3; /// Mask for Memory Model enum ELF_EF_SPARCV9_TSO = 0x0; /// Total Store Ordering enum ELF_EF_SPARCV9_PSO = 0x1; /// Partial Store Ordering enum ELF_EF_SPARCV9_RMO = 0x2; /// Relaxed Memory Ordering // Program segment header values enum ELF_PT_NULL = 0; enum ELF_PT_LOAD = 1; enum ELF_PT_DYNAMIC = 2; enum ELF_PT_INTERP = 3; enum ELF_PT_NOTE = 4; enum ELF_PT_SHLIB = 5; enum ELF_PT_PHDR = 6; enum ELF_PT_TLS = 7; /// Thread local storage segment enum ELF_PT_LOOS = 0x60000000; /// OS-specific enum ELF_PT_HIOS = 0x6fffffff; /// OS-specific enum ELF_PT_LOPROC = 0x70000000; enum ELF_PT_HIPROC = 0x7fffffff; enum ELF_PT_GNU_EH_FRAME = (ELF_PT_LOOS + 0x474e550); // 0x6474e550 enum ELF_PT_GNU_STACK = (ELF_PT_LOOS + 0x474e551); enum ELF_PT_GNU_RELRO = (ELF_PT_LOOS + 0x474e552); enum ELF_PT_GNU_PROPERTY = (ELF_PT_LOOS + 0x474e553); // ELF program header flags enum ELF_PF_R = 4; /// p_flags value for Read permission enum ELF_PF_W = 2; /// p_flags value for Write permission enum ELF_PF_X = 1; /// p_flags value for Execute permission // ELF Relocation types enum ELF_R_386_NONE = 0; enum ELF_R_386_32 = 1; enum ELF_R_386_PC32 = 2; enum ELF_R_386_GOT32 = 3; enum ELF_R_386_PLT32 = 4; enum ELF_R_386_COPY = 5; enum ELF_R_386_GLOB_DAT = 6; enum ELF_R_386_JMP_SLOT = 7; enum ELF_R_386_RELATIVE = 8; enum ELF_R_386_GOTOFF = 9; enum ELF_R_386_GOTPC = 10; enum ELF_R_386_NUM = 11; enum ELF_R_X86_64_NONE = 0; /// No reloc enum ELF_R_X86_64_64 = 1; /// Direct 64 bit enum ELF_R_X86_64_PC32 = 2; /// PC relative 32 bit signed enum ELF_R_X86_64_GOT32 = 3; /// 32 bit GOT entry enum ELF_R_X86_64_PLT32 = 4; /// 32 bit PLT address enum ELF_R_X86_64_COPY = 5; /// Copy symbol at runtime enum ELF_R_X86_64_GLOB_DAT = 6; /// Create GOT entry enum ELF_R_X86_64_JUMP_SLOT = 7; /// Create PLT entry enum ELF_R_X86_64_RELATIVE = 8; /// Adjust by program base enum ELF_R_X86_64_GOTPCREL = 9; /// 32 bit signed pc relative offset to GOT enum ELF_R_X86_64_32 = 10; /// Direct 32 bit zero extended enum ELF_R_X86_64_32S = 11; /// Direct 32 bit sign extended enum ELF_R_X86_64_16 = 12; /// Direct 16 bit zero extended enum ELF_R_X86_64_PC16 = 13; /// 16 bit sign extended pc relative enum ELF_R_X86_64_8 = 14; /// Direct 8 bit sign extended enum ELF_R_X86_64_PC8 = 15; /// 8 bit sign extended pc relative enum ELF_R_X86_64_PC64 = 24; /// Place relative 64-bit signed // Section type values enum ELF_SHT_NULL = 0; /// Inactive enum ELF_SHT_PROGBITS = 1; /// Program bits enum ELF_SHT_SYMTAB = 2; /// Symbol table enum ELF_SHT_STRTAB = 3; /// String table enum ELF_SHT_RELA = 4; /// Relocation entries (with addends) enum ELF_SHT_HASH = 5; /// Symbol hash table enum ELF_SHT_DYNAMIC = 6; /// Dynamic linking information enum ELF_SHT_NOTE = 7; /// File information enum ELF_SHT_NOBITS = 8; /// Empty section enum ELF_SHT_REL = 9; /// Relocation entries (without addends) enum ELF_SHT_SHLIB = 10; /// Reserved enum ELF_SHT_DYNSYM = 11; /// Dynamic symbol table enum ELF_SHT_INIT_ARRAY = 12; /// Array of pointers to initialization functions enum ELF_SHT_FINI_ARRAY = 13; /// Array of pointers to termination functions enum ELF_SHT_PREINIT_ARRAY = 14; /// Array of pointers to pre-initialization functions enum ELF_SHT_GROUP = 15; /// Section group enum ELF_SHT_SYNTAB_SHNDX = 16; /// Symbol table pointed by e_shstrndx enum ELF_SHT_LOOS = 0x60000000; /// Operating system specific enum ELF_SHT_HIOS = 0x6fffffff; /// Operating system specific enum ELF_SHT_LOPROC = 0x70000000; /// Processor specific enum ELF_SHT_HIPROC = 0x7fffffff; /// Processor specific enum ELF_SHT_LOUSER = 0x80000000; /// Application specific enum ELF_SHT_HIUSER = 0xffffffff; /// Application specific /// This section contains unwind function table entries for stack unwinding enum ELF_SHT_X86_64_UNWIND = 0x70000001; // ELF_SHT_LOPROC + 1? // Section flags enum ELF_SHF_WRITE = 0x1; /// Section should be writable enum ELF_SHF_ALLOC = 0x2; /// Section occupies memory during executing enum ELF_SHF_EXECINSTR = 0x4; /// Section contains executable machine instructions enum ELF_SHF_MERGE = 0x10; /// Section may be merged to eleminate duplication enum ELF_SHF_STRINGS = 0x20; /// Section is string table enum ELF_SHF_INFO_LINK = 0x40; /// sh_info field in this section holds a section header table value enum ELF_SHF_LINK_ORDER = 0x80; /// Adds special ordering for link editors enum ELF_SHF_OS_NONCONFORMING = 0x100; /// OS-specific enum ELF_SHF_GROUP = 0x200; /// Section is part of a group enum ELF_SHF_TLS = 0x400; /// Section contains Thread Local Storage data enum ELF_SHF_COMPRESSED = 0x800; /// Section is compressed enum ELF_SHF_MASKOS = 0x0ff00000; /// OS-specific enum ELF_SHF_MASKPROC = 0xf0000000; /// Processor-specific enum ELF_SHF_X86_64_LARGE = 0x10000000; /// Addresses can hold addresses over 2 GiB // // ET_CORE // elf.h values off musl 1.20 // enum ELF_NT_PRSTATUS = 1; /// enum ELF_NT_PRFPREG = 2; /// enum ELF_NT_FPREGSET = 2; /// enum ELF_NT_PRPSINFO = 3; /// enum ELF_NT_PRXREG = 4; /// enum ELF_NT_TASKSTRUCT = 4; /// enum ELF_NT_PLATFORM = 5; /// enum ELF_NT_AUXV = 6; /// enum ELF_NT_GWINDOWS = 7; /// enum ELF_NT_ASRS = 8; /// enum ELF_NT_PSTATUS = 10; /// enum ELF_NT_PSINFO = 13; /// enum ELF_NT_PRCRED = 14; /// enum ELF_NT_UTSNAME = 15; /// enum ELF_NT_LWPSTATUS = 16; /// enum ELF_NT_LWPSINFO = 17; /// enum ELF_NT_PRFPXREG = 20; /// enum ELF_NT_SIGINFO = 0x53494749; /// enum ELF_NT_FILE = 0x46494c45; /// enum ELF_NT_PRXFPREG = 0x46e62b7f; /// enum ELF_NT_PPC_VMX = 0x100; /// enum ELF_NT_PPC_SPE = 0x101; /// enum ELF_NT_PPC_VSX = 0x102; /// enum ELF_NT_PPC_TAR = 0x103; /// enum ELF_NT_PPC_PPR = 0x104; /// enum ELF_NT_PPC_DSCR = 0x105; /// enum ELF_NT_PPC_EBB = 0x106; /// enum ELF_NT_PPC_PMU = 0x107; /// enum ELF_NT_PPC_TM_CGPR = 0x108; /// enum ELF_NT_PPC_TM_CFPR = 0x109; /// enum ELF_NT_PPC_TM_CVMX = 0x10a; /// enum ELF_NT_PPC_TM_CVSX = 0x10b; /// enum ELF_NT_PPC_TM_SPR = 0x10c; /// enum ELF_NT_PPC_TM_CTAR = 0x10d; /// enum ELF_NT_PPC_TM_CPPR = 0x10e; /// enum ELF_NT_PPC_TM_CDSCR = 0x10f; /// enum ELF_NT_386_TLS = 0x200; /// enum ELF_NT_386_IOPERM = 0x201; /// enum ELF_NT_X86_XSTATE = 0x202; /// enum ELF_NT_S390_HIGH_GPRS = 0x300; /// enum ELF_NT_S390_TIMER = 0x301; /// enum ELF_NT_S390_TODCMP = 0x302; /// enum ELF_NT_S390_TODPREG = 0x303; /// enum ELF_NT_S390_CTRS = 0x304; /// enum ELF_NT_S390_PREFIX = 0x305; /// enum ELF_NT_S390_LAST_BREAK = 0x306; /// enum ELF_NT_S390_SYSTEM_CALL = 0x307; /// enum ELF_NT_S390_TDB = 0x308; /// enum ELF_NT_S390_VXRS_LOW = 0x309; /// enum ELF_NT_S390_VXRS_HIGH = 0x30a; /// enum ELF_NT_S390_GS_CB = 0x30b; /// enum ELF_NT_S390_GS_BC = 0x30c; /// enum ELF_NT_S390_RI_CB = 0x30d; /// enum ELF_NT_ARM_VFP = 0x400; /// enum ELF_NT_ARM_TLS = 0x401; /// enum ELF_NT_ARM_HW_BREAK = 0x402; /// enum ELF_NT_ARM_HW_WATCH = 0x403; /// enum ELF_NT_ARM_SYSTEM_CALL = 0x404; /// enum ELF_NT_ARM_SVE = 0x405; /// enum ELF_NT_ARM_PAC_MASK = 0x406; /// enum ELF_NT_ARM_PACA_KEYS = 0x407; /// enum ELF_NT_ARM_PACG_KEYS = 0x408; /// enum ELF_NT_METAG_CBUF = 0x500; /// enum ELF_NT_METAG_RPIPE = 0x501; /// enum ELF_NT_METAG_TLS = 0x502; /// enum ELF_NT_ARC_V2 = 0x600; /// enum ELF_NT_VMCOREDD = 0x700; /// enum ELF_NT_MIPS_DSP = 0x800; /// enum ELF_NT_MIPS_FP_MODE = 0x801; /// enum ELF_NT_MIPS_MSA = 0x802; /// enum ELF_NT_VERSION = 1; /// enum ELF_NT_LOONGARCH_CPUCFG = 0xa00; /// LoongArch CPU config registers enum ELF_NT_LOONGARCH_CSR = 0xa01; /// LoongArch control and status registers enum ELF_NT_LOONGARCH_LSX = 0xa02; /// LoongArch Loongson SIMD Extension registers enum ELF_NT_LOONGARCH_LASX = 0xa03; /// LoongArch Loongson Advanced SIMD Extension registers enum ELF_NT_LOONGARCH_LBT = 0xa04; /// LoongArch Loongson Binary Translation registers enum ELF_NT_LOONGARCH_HW_BREAK = 0xa05; /// LoongArch hardware breakpoint registers enum ELF_NT_LOONGARCH_HW_WATCH = 0xa06; /// LoongArch hardware watchpoint registers // // ELF32 meta // /// ELF32 header structure struct Elf32_Ehdr { ubyte[ELF_EI_NIDENT] e_ident; /// Identification bytes Elf32_Half e_type; /// Object file type Elf32_Half e_machine; /// Object file machine Elf32_Word e_version; /// Object version Elf32_Addr e_entry; /// Object entry address Elf32_Off e_phoff; /// Program header offset Elf32_Off e_shoff; /// Section header offset Elf32_Word e_flags; /// Architecture flags Elf32_Half e_ehsize; /// Header size in bytes Elf32_Half e_phentsize; /// Program header size Elf32_Half e_phnum; /// Number of entries in the program header table Elf32_Half e_shentsize; /// Section header size Elf32_Half e_shnum; /// Number of entries in the section header table Elf32_Half e_shstrndx; /// Index of the section header table entry that has section names } /// Program 32-bit header struct Elf32_Phdr { Elf32_Word p_type; /// Segment type Elf32_Off p_offset; /// Segment file offset Elf32_Addr p_vaddr; /// Segment virtual address Elf32_Addr p_paddr; /// Segment physical address Elf32_Word p_filesz; /// Segment size in file Elf32_Word p_memsz; /// Segment size in memory Elf32_Word p_flags; /// Segment flags Elf32_Word p_align; /// Segment alignment, file & memory } /// Section 32-bit header struct Elf32_Shdr { Elf32_Word sh_name; /// Section name, index in string table Elf32_Word sh_type; /// Type of section Elf32_Word sh_flags; /// Miscellaneous section attributes Elf32_Addr sh_addr; /// Section virtual addr at execution Elf32_Off sh_offset; /// Section file offset Elf32_Word sh_size; /// Size of section in bytes Elf32_Word sh_link; /// Index of another section Elf32_Word sh_info; /// Additional section information Elf32_Word sh_addralign; /// Section alignment Elf32_Word sh_entsize; /// Entry size if section holds table } /// Note 32-bit header struct Elf32_Nhdr { Elf32_Word n_namesz; /// Name size Elf32_Word n_descsz; /// Content size Elf32_Word n_type; /// Content type } struct Elf32_Dyn { Elf32_Sword d_tag; union { Elf32_Sword d_val; Elf32_Addr d_ptr; } } struct Elf32_Rel { Elf32_Addr r_offset; Elf32_Word r_info; } struct Elf32_Rela { Elf32_Addr r_offset; Elf32_Word r_info; Elf32_Sword r_addend; } struct Elf32_Sym { Elf32_Word st_name; Elf32_Addr st_value; Elf32_Word st_size; ubyte st_info; ubyte st_other; Elf32_Half st_shndx; } /// ELF32 Compressed header struct Elf32_Chdr { Elf32_Word ch_type; /// Compression algorithm Elf32_Word ch_size; /// Uncompressed data size Elf32_Word ch_addralign; /// Uncompressed data alignment } // // ELF64 meta // /// ELF64 header structure struct Elf64_Ehdr { ubyte[ELF_EI_NIDENT] e_ident; /// Identification bytes Elf64_Half e_type; /// Object file type Elf64_Half e_machine; /// Object file machine Elf64_Word e_version; /// Object version Elf64_Addr e_entry; /// Object entry address Elf64_Off e_phoff; /// Program header offset Elf64_Off e_shoff; /// Section header offset Elf64_Word e_flags; /// Architecture flags Elf64_Half e_ehsize; /// Header size in bytes Elf64_Half e_phentsize; /// Program header size Elf64_Half e_phnum; /// Number of entries in the program header table Elf64_Half e_shentsize; /// Section header size Elf64_Half e_shnum; /// Number of entries in the section header table Elf64_Half e_shstrndx; /// Index of the section header table entry that has section names } /// Program 64-bit header struct Elf64_Phdr { Elf64_Word p_type; /// Segment type Elf64_Word p_flags; /// Segment flags Elf64_Off p_offset; /// Segment file offset Elf64_Addr p_vaddr; /// Segment virtual address Elf64_Addr p_paddr; /// Segment physical address Elf64_Xword p_filesz; /// Segment size in file Elf64_Xword p_memsz; /// Segment size in memory Elf64_Xword p_align; /// Segment alignment, file & memory } /// Section 64-bit header struct Elf64_Shdr { Elf64_Word sh_name; /// Section name, index in string table Elf64_Word sh_type; /// Type of section Elf64_Xword sh_flags; /// Miscellaneous section attributes Elf64_Addr sh_addr; /// Section virtual addr at execution Elf64_Off sh_offset; /// Section file offset Elf64_Xword sh_size; /// Size of section in bytes Elf64_Word sh_link; /// Index of another section Elf64_Word sh_info; /// Additional section information Elf64_Xword sh_addralign; /// Section alignment Elf64_Xword sh_entsize; /// Entry size if section holds table } /// Note 64-bit header struct Elf64_Nhdr { Elf64_Word n_namesz; /// Name size Elf64_Word n_descsz; /// Content size Elf64_Word n_type; /// Content type } struct Elf64_Dyn { Elf64_Sxword d_tag; union { Elf64_Xword d_val; Elf64_Addr d_ptr; } } struct Elf64_Rel { Elf64_Addr r_offset; /// Location at which to apply the action Elf64_Xword r_info; /// Index and type of relocation } struct Elf64_Rela { Elf32_Addr offset; Elf32_Word info; Elf32_Sword addend; } struct Elf64_Sym { Elf64_Word st_name; ubyte st_info; ubyte st_other; Elf64_Half st_shndx; Elf64_Addr st_value; Elf64_Xword st_size; } /// ELF64 Compressed header struct Elf64_Chdr { Elf64_Word ch_type; /// Compression algorithm Elf64_Word ch_reserved; /// Reserved, obviously Elf64_Xword ch_size; /// Uncompressed size Elf64_Xword ch_addralign; /// Uncompressed alignment } // // GDB structures // //#define ELF_ET_DYN_BASE (mmap_is_ia32() ? 0x000400000UL : \ // (DEFAULT_MAP_WINDOW / 3 * 2)) //TODO: Move them to some include folder // There's adbg.include.linux.user struct elf_prstatus32_timeval { uint tv_sec; uint tv_usec; } struct elf_prstatus64_timeval { align(8) ulong tv_sec; align(8) ulong tv_usec; } alias pid_t = int; struct user_regs32_struct { uint ebx; uint ecx; uint edx; uint esi; uint edi; uint ebp; uint eax; uint xds; uint xes; uint xfs; uint xgs; uint orig_eax; uint eip; uint xcs; uint eflags; uint esp; uint xss; } // typedef struct user_i387_struct elf_fpregset_t; struct x86_fp80_t { union { ubyte[10] data; } } struct x86_uint128_t { union { ubyte[16] data; ulong[2] data64; } } // user_32.h struct user_i387_struct { int cwd; int swd; int twd; int fip; int fcs; int foo; int fos; union { int[20] st_space; /* 8*10 bytes for each FP-reg = 80 bytes */ x86_fp80_t[8] fpreg; } } // user_32.h struct user_fxsr_struct { ushort cwd; ushort swd; ushort twd; ushort fop; int fip; int fcs; int foo; int fos; int mxcsr; int reserved; union { int[32] st_space; /* 8*16 bytes for each FP-reg = 128 bytes */ x86_uint128_t[8] st_space128; } union { int[32] xmm_space; /* 8*16 bytes for each XMM-reg = 128 bytes */ x86_uint128_t[8] xmm_space128; } int[56] padding; } // user_64.h /* This matches the 64bit FXSAVE format as defined by AMD. It is the same as the 32bit format defined by Intel, except that the selector:offset pairs for data and eip are replaced with flat 64bit pointers. */ struct user_i387_struct64 { ushort cwd; ushort swd; // Note this is not the same as the 32bit/x87/FSAVE twd ushort twd; ushort fop; ulong rip; ulong rdp; uint mxcsr; uint mxcsr_mask; union { uint[32] st_space; /* 8*16 bytes for each FP-reg = 128 bytes */ x86_uint128_t[8] st_space128; } union { uint[64] xmm_space; /* 16*16 bytes for each XMM-reg = 256 bytes */ x86_uint128_t[16] xmm_space128; } uint[24] padding; } // user_64.h struct user_regs64_struct { align(8): ulong r15; ulong r14; ulong r13; ulong r12; ulong rbp; ulong rbx; ulong r11; ulong r10; ulong r9; ulong r8; ulong rax; ulong rcx; ulong rdx; ulong rsi; ulong rdi; ulong orig_rax; ulong rip; ulong cs; ulong eflags; ulong rsp; ulong ss; ulong fs_base; ulong gs_base; ulong ds; ulong es; ulong fs; ulong gs; } //typedef uint32_t elf_greg32_t; //#define ELF_NGREG32 (sizeof (struct user_regs32_struct) / sizeof(elf_greg32_t)) //typedef elf_greg32_t elf_gregset32_t[ELF_NGREG32]; alias elf_greg32_t = uint; enum ELF_NGREG32 = user_regs32_struct.sizeof / elf_greg32_t.sizeof; alias elf_gregset32_t = elf_greg32_t[ELF_NGREG32]; //typedef a8_uint64_t elf_greg64_t; //#define ELF_NGREG64 (sizeof (struct user_regs64_struct) / sizeof(elf_greg64_t)) //typedef elf_greg64_t elf_gregset64_t[ELF_NGREG64]; alias elf_greg64_t = ulong; enum ELF_NGREG64 = user_regs64_struct.sizeof / elf_greg64_t.sizeof; alias elf_gregset64_t = elf_greg64_t[ELF_NGREG64]; struct elf_siginfo { /// signal number int si_signo; /// extra code int si_code; /// errno int si_errno; } struct elf_prstatus32 { /// Info associated with signal. elf_siginfo pr_info; // struct elf_siginfo pr_info; /// Current signal c_short_int pr_cursig; /// Set of pending signals. uint pr_sigpend; /// Set of held signals. uint pr_sighold; /// pid_t pr_pid; /// pid_t pr_ppid; /// pid_t pr_pgrp; /// pid_t pr_sid; /// User time. elf_prstatus32_timeval pr_utime; /// System time. elf_prstatus32_timeval pr_stime; /// Cumulative user time. elf_prstatus32_timeval pr_cutime; /// Cumulative system time. elf_prstatus32_timeval pr_cstime; /// GP registers. elf_gregset32_t pr_reg; /// True if math copro being used. int pr_fpvalid; } struct elf_prstatusx32 { /// Info associated with signal. elf_siginfo pr_info; // struct elf_siginfo pr_info; /// Current signal. c_short_int pr_cursig; /// Set of pending signals. uint pr_sigpend; /// Set of held signals. uint pr_sighold; /// pid_t pr_pid; /// pid_t pr_ppid; /// pid_t pr_pgrp; /// pid_t pr_sid; /// User time. elf_prstatus32_timeval pr_utime; /// System time. elf_prstatus32_timeval pr_stime; /// Cumulative user time. elf_prstatus32_timeval pr_cutime; /// Cumulative system time. elf_prstatus32_timeval pr_cstime; /// GP registers. elf_gregset64_t pr_reg; /// True if math copro being used. int pr_fpvalid; } struct elf_prstatus64 { /// Info associated with signal. elf_siginfo pr_info; /// Current signal. c_short_int pr_cursig; /// Set of pending signals. align(8) ulong pr_sigpend; /// Set of held signals. align(8) ulong pr_sighold; /// pid_t pr_pid; /// pid_t pr_ppid; /// pid_t pr_pgrp; /// pid_t pr_sid; /// User time. elf_prstatus64_timeval pr_utime; /// System time. elf_prstatus64_timeval pr_stime; /// Cumulative user time. elf_prstatus64_timeval pr_cutime; /// Cumulative system time. elf_prstatus64_timeval pr_cstime; /// GP registers. elf_gregset64_t pr_reg; /// True if math copro being used. int pr_fpvalid; } enum ELF_PRARGSZ = 80; struct elf_prpsinfo32 { /// Numeric process state. ubyte pr_state; /// Char for pr_state. ubyte pr_sname; /// Zombie. ubyte pr_zomb; /// Nice val. ubyte pr_nice; /// Flags. uint pr_flag; /// c_ushort_int pr_uid; /// c_ushort_int pr_gid; /// int pr_pid, pr_ppid, pr_pgrp, pr_sid; /* Lots missing */ /// Filename of executable. char[16] pr_fname; /// Initial part of arg list. char[ELF_PRARGSZ] pr_psargs; } struct elf_prpsinfo64 { /// Numeric process state. ubyte pr_state; /// Char for pr_state. char pr_sname; /// Zombie. ubyte pr_zomb; /// Nice val. ubyte pr_nice; /// Flags. align(8) ulong pr_flag; /// uint pr_uid; /// uint pr_gid; /// int pr_pid, pr_ppid, pr_pgrp, pr_sid; /* Lots missing */ /// Filename of executable. char[16] pr_fname; /// Initial part of arg list. char[ELF_PRARGSZ] pr_psargs; } // // Functions // version (BigEndian) private enum PLATFORM_DATA = ELF_DATA_MSB; else private enum PLATFORM_DATA = ELF_DATA_LSB; int adbg_object_elf_load(adbg_object_t *o) { if (o.file_size < MINIMUM_SIZE) return adbg_oops(AdbgError.objectTooSmall); o.format = AdbgObject.elf; o.p.reversed = o.i.elf32.ehdr.e_ident[ELF_EI_DATA] != PLATFORM_DATA; version (Trace) trace("reversed=%d", o.p.reversed); switch (o.i.elf32.ehdr.e_ident[ELF_EI_CLASS]) { case ELF_CLASS_32: with (o.i.elf32) { if (o.p.reversed) { ehdr.e_type = adbg_bswap16(ehdr.e_type); ehdr.e_machine = adbg_bswap16(ehdr.e_machine); ehdr.e_version = adbg_bswap32(ehdr.e_version); ehdr.e_entry = adbg_bswap32(ehdr.e_entry); ehdr.e_phoff = adbg_bswap32(ehdr.e_phoff); ehdr.e_shoff = adbg_bswap32(ehdr.e_shoff); ehdr.e_flags = adbg_bswap32(ehdr.e_flags); ehdr.e_ehsize = adbg_bswap16(ehdr.e_ehsize); ehdr.e_phentsize = adbg_bswap16(ehdr.e_phentsize); ehdr.e_phnum = adbg_bswap16(ehdr.e_phnum); ehdr.e_shentsize = adbg_bswap16(ehdr.e_shentsize); ehdr.e_shnum = adbg_bswap16(ehdr.e_shnum); ehdr.e_shstrndx = adbg_bswap16(ehdr.e_shstrndx); } if (ehdr.e_version != ELF_EV_CURRENT) return adbg_oops(AdbgError.objectInvalidVersion); if (ehdr.e_phoff && ehdr.e_phnum) { if (adbg_object_offsetl(o, cast(void**)&phdr, ehdr.e_phoff, Elf32_Phdr.sizeof * ehdr.e_phnum)) return adbg_oops(AdbgError.objectMalformed); reversed_phdr = cast(bool*)calloc(ehdr.e_phnum, bool.sizeof); if (reversed_phdr == null) return adbg_oops(AdbgError.crt); } else { reversed_phdr = null; phdr = null; } if (ehdr.e_shoff && ehdr.e_shnum) { if (adbg_object_offsetl(o, cast(void**)&shdr, ehdr.e_shoff, Elf32_Shdr.sizeof * ehdr.e_shnum)) return adbg_oops(AdbgError.objectMalformed); reversed_shdr = cast(bool*)calloc(ehdr.e_shnum, bool.sizeof); if (reversed_shdr == null) return adbg_oops(AdbgError.crt); } else { reversed_shdr = null; shdr = null; } } break; case ELF_CLASS_64: with (o.i.elf64) { if (o.p.reversed) { ehdr.e_type = adbg_bswap16(ehdr.e_type); ehdr.e_machine = adbg_bswap16(ehdr.e_machine); ehdr.e_version = adbg_bswap32(ehdr.e_version); ehdr.e_entry = adbg_bswap64(ehdr.e_entry); ehdr.e_phoff = adbg_bswap64(ehdr.e_phoff); ehdr.e_shoff = adbg_bswap64(ehdr.e_shoff); ehdr.e_flags = adbg_bswap32(ehdr.e_flags); ehdr.e_ehsize = adbg_bswap16(ehdr.e_ehsize); ehdr.e_phentsize = adbg_bswap16(ehdr.e_phentsize); ehdr.e_phnum = adbg_bswap16(ehdr.e_phnum); ehdr.e_shentsize = adbg_bswap16(ehdr.e_shentsize); ehdr.e_shnum = adbg_bswap16(ehdr.e_shnum); ehdr.e_shstrndx = adbg_bswap16(ehdr.e_shstrndx); } if (ehdr.e_version != ELF_EV_CURRENT) return adbg_oops(AdbgError.objectInvalidVersion); if (ehdr.e_phoff && ehdr.e_phnum) { if (adbg_object_offsetl(o, cast(void**)&phdr, ehdr.e_phoff, Elf64_Phdr.sizeof * ehdr.e_phnum)) return adbg_oops(AdbgError.objectMalformed); reversed_phdr = cast(bool*)calloc(ehdr.e_phnum, bool.sizeof); if (reversed_phdr == null) return adbg_oops(AdbgError.crt); } else { reversed_phdr = null; phdr = null; } if (ehdr.e_shoff && ehdr.e_shnum) { if (adbg_object_offsetl(o, cast(void**)&shdr, ehdr.e_shoff, Elf64_Shdr.sizeof * ehdr.e_shnum)) return adbg_oops(AdbgError.objectMalformed); reversed_shdr = cast(bool*)calloc(ehdr.e_shnum, bool.sizeof); if (reversed_shdr == null) return adbg_oops(AdbgError.crt); } else { reversed_shdr = null; shdr = null; } } break; default: return adbg_oops(AdbgError.objectInvalidClass); } return 0; } Elf32_Ehdr* adbg_object_elf_ehdr32(adbg_object_t *o) { if (o == null) { adbg_oops(AdbgError.invalidArgument); return null; } // Return as-is, already swapped return o.i.elf32.ehdr; } Elf32_Phdr* adbg_object_elf_phdr32(adbg_object_t *o, size_t index) { if (o == null) { adbg_oops(AdbgError.invalidArgument); return null; } if (o.i.elf32.phdr == null) { adbg_oops(AdbgError.unavailable); return null; } if (index >= o.i.elf32.ehdr.e_phnum) { adbg_oops(AdbgError.indexBounds); return null; } Elf32_Phdr *phdr = &o.i.elf32.phdr[index]; if (o.p.reversed && o.i.elf32.reversed_phdr[index] == false) { phdr.p_type = adbg_bswap32(phdr.p_type); phdr.p_offset = adbg_bswap32(phdr.p_offset); phdr.p_vaddr = adbg_bswap32(phdr.p_vaddr); phdr.p_paddr = adbg_bswap32(phdr.p_paddr); phdr.p_filesz = adbg_bswap32(phdr.p_filesz); phdr.p_memsz = adbg_bswap32(phdr.p_memsz); phdr.p_flags = adbg_bswap32(phdr.p_flags); phdr.p_align = adbg_bswap32(phdr.p_align); o.i.elf32.reversed_phdr[index] = true; } return phdr; } Elf32_Shdr* adbg_object_elf_shdr32(adbg_object_t *o, size_t index) { if (o == null) { adbg_oops(AdbgError.invalidArgument); return null; } if (o.i.elf32.shdr == null) { adbg_oops(AdbgError.unavailable); return null; } if (index >= o.i.elf32.ehdr.e_shnum) { adbg_oops(AdbgError.indexBounds); return null; } Elf32_Shdr *shdr = &o.i.elf32.shdr[index]; if (o.p.reversed && o.i.elf32.reversed_phdr[index] == false) { shdr.sh_name = adbg_bswap32(shdr.sh_name); shdr.sh_type = adbg_bswap32(shdr.sh_type); shdr.sh_flags = adbg_bswap32(shdr.sh_flags); shdr.sh_addr = adbg_bswap32(shdr.sh_addr); shdr.sh_offset = adbg_bswap32(shdr.sh_offset); shdr.sh_size = adbg_bswap32(shdr.sh_size); shdr.sh_link = adbg_bswap32(shdr.sh_link); shdr.sh_info = adbg_bswap32(shdr.sh_info); shdr.sh_addralign = adbg_bswap32(shdr.sh_addralign); shdr.sh_entsize = adbg_bswap32(shdr.sh_entsize); o.i.elf32.reversed_shdr[index] = true; } return shdr; } Elf32_Shdr* adbg_object_elf_shdr32_n(adbg_object_t *o, const(char) *name) { if (o == null) { adbg_oops(AdbgError.invalidArgument); return null; } if (o.i.elf32.shdr == null) { adbg_oops(AdbgError.unavailable); return null; } ushort id = o.i.elf32.ehdr.e_shstrndx; if (id >= o.i.elf32.ehdr.e_shnum) { adbg_oops(AdbgError.indexBounds); return null; } uint table_offset = o.i.elf32.shdr[id].sh_offset; if (adbg_object_outbound(o, table_offset)) { adbg_oops(AdbgError.offsetBounds); return null; } enum SNMLEN = 32; Elf32_Shdr *shdr = void; char *table = o.bufferc + table_offset; // string table for (int index; index < o.i.elf32.ehdr.e_shnum; ++index) { shdr = &o.i.elf32.shdr[index]; if (o.p.reversed && o.i.elf32.reversed_phdr[index] == false) { shdr.sh_name = adbg_bswap32(shdr.sh_name); shdr.sh_type = adbg_bswap32(shdr.sh_type); shdr.sh_flags = adbg_bswap32(shdr.sh_flags); shdr.sh_addr = adbg_bswap32(shdr.sh_addr); shdr.sh_offset = adbg_bswap32(shdr.sh_offset); shdr.sh_size = adbg_bswap32(shdr.sh_size); shdr.sh_link = adbg_bswap32(shdr.sh_link); shdr.sh_info = adbg_bswap32(shdr.sh_info); shdr.sh_addralign = adbg_bswap32(shdr.sh_addralign); shdr.sh_entsize = adbg_bswap32(shdr.sh_entsize); o.i.elf32.reversed_shdr[index] = true; } const(char) *sname = table + shdr.sh_name; if (strncmp(sname, name, SNMLEN) == 0) return shdr; } adbg_oops(AdbgError.objectItemNotFound); return null; } Elf64_Ehdr* adbg_object_elf_ehdr64(adbg_object_t *o) { if (o == null) { adbg_oops(AdbgError.invalidArgument); return null; } // Return as-is, already swapped return o.i.elf64.ehdr; } Elf64_Phdr* adbg_object_elf_phdr64(adbg_object_t *o, size_t index) { if (o == null) { adbg_oops(AdbgError.invalidArgument); return null; } if (o.i.elf64.phdr == null) { adbg_oops(AdbgError.unavailable); return null; } if (index >= o.i.elf64.ehdr.e_phnum) { adbg_oops(AdbgError.indexBounds); return null; } Elf64_Phdr *phdr = &o.i.elf64.phdr[index]; if (o.p.reversed && o.i.elf64.reversed_phdr[index] == false) { phdr.p_type = adbg_bswap32(phdr.p_type); phdr.p_offset = adbg_bswap64(phdr.p_offset); phdr.p_vaddr = adbg_bswap64(phdr.p_vaddr); phdr.p_paddr = adbg_bswap64(phdr.p_paddr); phdr.p_filesz = adbg_bswap64(phdr.p_filesz); phdr.p_memsz = adbg_bswap64(phdr.p_memsz); phdr.p_flags = adbg_bswap32(phdr.p_flags); phdr.p_align = adbg_bswap64(phdr.p_align); o.i.elf32.reversed_phdr[index] = true; } return phdr; } Elf64_Shdr* adbg_object_elf_shdr64(adbg_object_t *o, size_t index) { if (o == null) { adbg_oops(AdbgError.invalidArgument); return null; } if (o.i.elf64.shdr == null) { adbg_oops(AdbgError.unavailable); return null; } if (index >= o.i.elf64.ehdr.e_shnum) { adbg_oops(AdbgError.indexBounds); return null; } Elf64_Shdr *shdr = &o.i.elf64.shdr[index]; if (o.p.reversed && o.i.elf64.reversed_phdr[index] == false) { shdr.sh_name = adbg_bswap32(shdr.sh_name); shdr.sh_type = adbg_bswap32(shdr.sh_type); shdr.sh_flags = adbg_bswap64(shdr.sh_flags); shdr.sh_addr = adbg_bswap64(shdr.sh_addr); shdr.sh_offset = adbg_bswap64(shdr.sh_offset); shdr.sh_size = adbg_bswap64(shdr.sh_size); shdr.sh_link = adbg_bswap32(shdr.sh_link); shdr.sh_info = adbg_bswap32(shdr.sh_info); shdr.sh_addralign = adbg_bswap64(shdr.sh_addralign); shdr.sh_entsize = adbg_bswap64(shdr.sh_entsize); o.i.elf32.reversed_shdr[index] = true; } return shdr; } Elf64_Shdr* adbg_object_elf_shdr64_n(adbg_object_t *o, const(char) *name) { if (o == null) { adbg_oops(AdbgError.invalidArgument); return null; } if (o.i.elf64.shdr == null) { adbg_oops(AdbgError.unavailable); return null; } ushort id = o.i.elf64.ehdr.e_shstrndx; if (id >= o.i.elf64.ehdr.e_shnum) { adbg_oops(AdbgError.indexBounds); return null; } ulong table_offset = o.i.elf64.shdr[id].sh_offset; if (adbg_object_outbound(o, table_offset)) { adbg_oops(AdbgError.offsetBounds); return null; } enum SNMLEN = 32; Elf64_Shdr *shdr = void; char *table = o.bufferc + table_offset; // string table for (int index; index < o.i.elf64.ehdr.e_shnum; ++index) { shdr = &o.i.elf64.shdr[index]; if (o.p.reversed && o.i.elf64.reversed_phdr[index] == false) { shdr.sh_name = adbg_bswap32(shdr.sh_name); shdr.sh_type = adbg_bswap32(shdr.sh_type); shdr.sh_flags = adbg_bswap64(shdr.sh_flags); shdr.sh_addr = adbg_bswap64(shdr.sh_addr); shdr.sh_offset = adbg_bswap64(shdr.sh_offset); shdr.sh_size = adbg_bswap64(shdr.sh_size); shdr.sh_link = adbg_bswap32(shdr.sh_link); shdr.sh_info = adbg_bswap32(shdr.sh_info); shdr.sh_addralign = adbg_bswap64(shdr.sh_addralign); shdr.sh_entsize = adbg_bswap64(shdr.sh_entsize); o.i.elf32.reversed_shdr[index] = true; } const(char) *sname = table + shdr.sh_name; if (strncmp(sname, name, SNMLEN) == 0) return shdr; } adbg_oops(AdbgError.objectItemNotFound); return null; } AdbgMachine adbg_object_elf_machine(ushort machine, ubyte class_) { // NOTE: Many reserved values are excluded switch (machine) { case ELF_EM_M32: return AdbgMachine.we32100; case ELF_EM_SPARC: return AdbgMachine.sparc; case ELF_EM_386: return AdbgMachine.i386; case ELF_EM_68K: return AdbgMachine.m68k; case ELF_EM_88K: return AdbgMachine.m88k; case ELF_EM_MCU: return AdbgMachine.mcu; case ELF_EM_860: return AdbgMachine.i860; case ELF_EM_MIPS: return AdbgMachine.mips; case ELF_EM_S370: return AdbgMachine.s370; case ELF_EM_MIPS_RS3_LE: return AdbgMachine.mipsle; case ELF_EM_PARISC: return AdbgMachine.parisc; case ELF_EM_VPP500: return AdbgMachine.vpp500; case ELF_EM_SPARC32PLUS: return AdbgMachine.sparc8p; case ELF_EM_960: return AdbgMachine.i960; case ELF_EM_PPC: return AdbgMachine.ppc; case ELF_EM_PPC64: return AdbgMachine.ppc64; case ELF_EM_S390: return AdbgMachine.s390; case ELF_EM_SPU: return AdbgMachine.spu; case ELF_EM_V800: return AdbgMachine.v800; case ELF_EM_FR20: return AdbgMachine.fr20; case ELF_EM_RH32: return AdbgMachine.rh32; case ELF_EM_RCE: return AdbgMachine.rce; case ELF_EM_ARM: return AdbgMachine.arm; case ELF_EM_ALPHA: return AdbgMachine.alpha; case ELF_EM_SH: return AdbgMachine.sh; case ELF_EM_SPARCV9: return AdbgMachine.sparc9; case ELF_EM_TRICORE: return AdbgMachine.tricore; case ELF_EM_ARC: return AdbgMachine.arc; case ELF_EM_H8_300: return AdbgMachine.h8300; case ELF_EM_H8_300H: return AdbgMachine.h8300h; case ELF_EM_H8S: return AdbgMachine.h8s; case ELF_EM_H8_500: return AdbgMachine.h8500; case ELF_EM_IA_64: return AdbgMachine.ia64; case ELF_EM_MIPS_X: return AdbgMachine.mipsx; case ELF_EM_COLDFIRE: return AdbgMachine.coldfire; case ELF_EM_68HC12: return AdbgMachine.m68hc12; case ELF_EM_MMA: return AdbgMachine.mma; case ELF_EM_PCP: return AdbgMachine.pcp; case ELF_EM_NCPU: return AdbgMachine.ncpu; case ELF_EM_NDR1: return AdbgMachine.ndr1; case ELF_EM_STARCORE: return AdbgMachine.starcore; case ELF_EM_ME16: return AdbgMachine.me16; case ELF_EM_ST100: return AdbgMachine.st100; case ELF_EM_TINYJ: return AdbgMachine.tinyj; case ELF_EM_X86_64: return AdbgMachine.amd64; case ELF_EM_PDSP: return AdbgMachine.sonydsp; case ELF_EM_PDP10: return AdbgMachine.pdp10; case ELF_EM_PDP11: return AdbgMachine.pdp11; case ELF_EM_FX66: return AdbgMachine.fx66; case ELF_EM_ST9PLUS: return AdbgMachine.st9; case ELF_EM_ST7: return AdbgMachine.st7; case ELF_EM_68HC16: return AdbgMachine.m68hc16; case ELF_EM_68HC11: return AdbgMachine.m68hc11; case ELF_EM_68HC08: return AdbgMachine.m68hc08; case ELF_EM_68HC05: return AdbgMachine.m68hc05; case ELF_EM_SVX: return AdbgMachine.svx; case ELF_EM_ST19: return AdbgMachine.st19; case ELF_EM_VAX: return AdbgMachine.vax; case ELF_EM_CRIS: return AdbgMachine.axis; case ELF_EM_JAVELIN: return AdbgMachine.sle9x; case ELF_EM_FIREPATH: return AdbgMachine.firepath; case ELF_EM_ZSP: return AdbgMachine.zsp; case ELF_EM_MMIX: return AdbgMachine.mmix; case ELF_EM_HUANY: return AdbgMachine.harvard; case ELF_EM_PRISM: return AdbgMachine.prism; case ELF_EM_AVR: return AdbgMachine.avr; case ELF_EM_FR30: return AdbgMachine.fr30; case ELF_EM_D10V: return AdbgMachine.d10v; case ELF_EM_D30V: return AdbgMachine.d30v; case ELF_EM_V850: return AdbgMachine.v850; case ELF_EM_M32R: return AdbgMachine.m32r; case ELF_EM_MN10300: return AdbgMachine.mn10300; case ELF_EM_MN10200: return AdbgMachine.mn10200; case ELF_EM_PJ: return AdbgMachine.pj; case ELF_EM_OPENRISC: return AdbgMachine.openrisc; case ELF_EM_ARC_COMPACT: return AdbgMachine.arc; case ELF_EM_XTENSA: return AdbgMachine.xtensa; case ELF_EM_VIDEOCORE: return AdbgMachine.videocore; case ELF_EM_TMM_GPP: return AdbgMachine.tmm; case ELF_EM_NS32K: return AdbgMachine.ns32k; case ELF_EM_TPC: return AdbgMachine.tpc; case ELF_EM_SNP1K: return AdbgMachine.snp1k; case ELF_EM_ST200: return AdbgMachine.st200; case ELF_EM_IP2K: return AdbgMachine.ip2k; case ELF_EM_MAX: return AdbgMachine.max; case ELF_EM_CR: return AdbgMachine.cr; case ELF_EM_F2MC16: return AdbgMachine.f2mc16; case ELF_EM_MSP430: return AdbgMachine.msp430; case ELF_EM_BLACKFIN: return AdbgMachine.blackfin; case ELF_EM_SE_C33: return AdbgMachine.s1c33; case ELF_EM_SEP: return AdbgMachine.sep; case ELF_EM_ARCA: return AdbgMachine.arca; case ELF_EM_UNICORE: return AdbgMachine.unicore; case ELF_EM_EXCESS: return AdbgMachine.excess; case ELF_EM_DXP: return AdbgMachine.dxp; case ELF_EM_ALTERA_NIOS2: return AdbgMachine.nios2; case ELF_EM_CRX: return AdbgMachine.crx; case ELF_EM_XGATE: return AdbgMachine.xgate; case ELF_EM_C116: return AdbgMachine.c166; case ELF_EM_M16C: return AdbgMachine.m16c; case ELF_EM_DSPIC30F: return AdbgMachine.dspic30f; case ELF_EM_CE: return AdbgMachine.ce; case ELF_EM_M32C: return AdbgMachine.m32c; case ELF_EM_TSK3000: return AdbgMachine.tsk3000; case ELF_EM_RS08: return AdbgMachine.rs08; case ELF_EM_SHARC: return AdbgMachine.sharc; case ELF_EM_ECOG2: return AdbgMachine.ecog2; case ELF_EM_SCORE7: return AdbgMachine.score7; case ELF_EM_DSP24: return AdbgMachine.dsp24; case ELF_EM_VIDEOCORE3: return AdbgMachine.videocore3; case ELF_EM_LATTICEMICO32: return AdbgMachine.mico32; case ELF_EM_SE_C17: return AdbgMachine.c17; case ELF_EM_TI_C6000: return AdbgMachine.tic6000; case ELF_EM_TI_C2000: return AdbgMachine.tic2000; case ELF_EM_TI_C5500: return AdbgMachine.tic55xx; case ELF_EM_TI_ARP32: return AdbgMachine.asrisc; case ELF_EM_TI_PRU: return AdbgMachine.pru; case ELF_EM_MMDSP_PLUS: return AdbgMachine.vdsp; case ELF_EM_CYPRESS_M8C: return AdbgMachine.m8c; case ELF_EM_R32C: return AdbgMachine.r32c; case ELF_EM_TRIMEDIA: return AdbgMachine.trimedia; case ELF_EM_QDSP6: return AdbgMachine.dsp6; case ELF_EM_8051: return AdbgMachine.i8051; case ELF_EM_STXP7X: return AdbgMachine.stxp7x; case ELF_EM_NDS32: return AdbgMachine.nds32; case ELF_EM_ECOG1X: return AdbgMachine.ecog1x; case ELF_EM_MAXQ30: return AdbgMachine.maxq30; case ELF_EM_XIMO16: return AdbgMachine.dsp16; case ELF_EM_MANIK: return AdbgMachine.m2000; case ELF_EM_CRAYNV2: return AdbgMachine.nv2; case ELF_EM_RX: return AdbgMachine.rx; case ELF_EM_METAG: return AdbgMachine.meta; case ELF_EM_MCST_ELBRUS: return AdbgMachine.elbrus; case ELF_EM_ECOG16: return AdbgMachine.ecog16; case ELF_EM_CR16: return AdbgMachine.cr16; case ELF_EM_ETPU: return AdbgMachine.etpu; case ELF_EM_SLE9X: return AdbgMachine.sle9x; // javelin? case ELF_EM_L10M: return AdbgMachine.l10m; case ELF_EM_K10M: return AdbgMachine.k10m; case ELF_EM_AARCH64: return AdbgMachine.aarch64; case ELF_EM_AVR32: return AdbgMachine.avr32; case ELF_EM_STM8: return AdbgMachine.stm8; case ELF_EM_TILE64: return AdbgMachine.tile64; case ELF_EM_TILEPRO: return AdbgMachine.tilepro; case ELF_EM_MICROBLAZE: return AdbgMachine.microblaze; case ELF_EM_CUDA: return AdbgMachine.cuda; case ELF_EM_TILEGX: return AdbgMachine.tilegx; case ELF_EM_CLOUDSHIELD: return AdbgMachine.cloudshield; case ELF_EM_COREA_1ST: return AdbgMachine.corea1; case ELF_EM_COREA_2ND: return AdbgMachine.corea2; case ELF_EM_ARC_COMPACT2: return AdbgMachine.arcc2; case ELF_EM_OPEN8: return AdbgMachine.open8; case ELF_EM_RL78: return AdbgMachine.rl78; case ELF_EM_VIDEOCORE5: return AdbgMachine.videocore5; case ELF_EM_78KOR: return AdbgMachine.r78kor; case ELF_EM_56800EX: return AdbgMachine.dsc; case ELF_EM_BA1: return AdbgMachine.ba1; case ELF_EM_BA2: return AdbgMachine.ba2; case ELF_EM_XCORE: return AdbgMachine.xcore; case ELF_EM_MCHP_PIC: return AdbgMachine.picr8; case ELF_EM_KM32: return AdbgMachine.km32; case ELF_EM_KMX32: return AdbgMachine.kmx32; case ELF_EM_KMX16: return AdbgMachine.kmx16; case ELF_EM_KMX8: return AdbgMachine.kmx8; case ELF_EM_KVARC: return AdbgMachine.kvarc; case ELF_EM_CDP: return AdbgMachine.cdp; case ELF_EM_COGE: return AdbgMachine.csm; case ELF_EM_COOL: return AdbgMachine.bluechip; case ELF_EM_NORC: return AdbgMachine.nano; case ELF_EM_CSR_KALIMBA: return AdbgMachine.csr; case ELF_EM_Z80: return AdbgMachine.z80; case ELF_EM_VISIUM: return AdbgMachine.visium; case ELF_EM_FT32: return AdbgMachine.ftdi; case ELF_EM_MOXIE: return AdbgMachine.moxie; case ELF_EM_AMDGPU: return AdbgMachine.amdgpu; case ELF_EM_RISCV: return AdbgMachine.riscv; case ELF_EM_LOONGARCH: switch (class_) { case ELF_CLASS_32: return AdbgMachine.loongarch32; case ELF_CLASS_64: return AdbgMachine.loongarch64; default: } goto default; default: return AdbgMachine.unknown; } } const(char) *adbg_object_elf_class_string(ubyte class_) { switch (class_) { case ELF_CLASS_32: return "ELF32"; case ELF_CLASS_64: return "ELF64"; default: return null; } } const(char) *adbg_object_elf_data_string(ubyte data) { switch (data) { case ELF_DATA_LSB: return "LSB"; case ELF_DATA_MSB: return "MSB"; default: return null; } } const(char) *adbg_object_elf_abi_string(ubyte object_) { switch (object_) { case ELF_OSABI_NONE: return "NONE"; case ELF_OSABI_HPUX: return "HPUX"; case ELF_OSABI_NETBSD: return "NETBSD"; case ELF_OSABI_GNU: return "GNU"; case ELF_OSABI_SOLARIS: return "SOLARIS"; case ELF_OSABI_AIX: return "AIX"; case ELF_OSABI_IRIX: return "IRIX"; case ELF_OSABI_FREEBSD: return "FREEBSD"; case ELF_OSABI_TRU64: return "TRU64"; case ELF_OSABI_MODESTO: return "MODESTO"; case ELF_OSABI_OPENBSD: return "OPENBSD"; case ELF_OSABI_OPENVMS: return "OPENVMS"; case ELF_OSABI_NSK: return "NSK"; case ELF_OSABI_AROS: return "AROS"; case ELF_OSABI_FENIXOS: return "FENIXOS"; case ELF_OSABI_CLOUDABI: return "CLOUDABI"; case ELF_OSABI_OPENVOS: return "OPENVOS"; default: return null; } } const(char) *adbg_object_elf_et_string(ushort type) { switch (type) { case ELF_ET_NONE: return "NONE"; case ELF_ET_REL: return "REL"; case ELF_ET_EXEC: return "EXEC"; case ELF_ET_DYN: return "DYN"; case ELF_ET_CORE: return "CORE"; case ELF_ET_LOOS: return "LOOS"; case ELF_ET_HIOS: return "HIOS"; case ELF_ET_LOPROC: return "LOPROC"; case ELF_ET_HIPROC: return "HIPROC"; default: return null; } } const(char) *adbg_object_elf_pt_string(uint type) { switch (type) { case ELF_PT_NULL: return "NULL"; case ELF_PT_LOAD: return "LOAD"; case ELF_PT_DYNAMIC: return "DYNAMIC"; case ELF_PT_INTERP: return "INTERP"; case ELF_PT_NOTE: return "NOTE"; case ELF_PT_SHLIB: return "SHLIB"; case ELF_PT_PHDR: return "PHDR"; case ELF_PT_TLS: return "TLS"; case ELF_PT_LOOS: return "LOOS"; case ELF_PT_HIOS: return "HIOS"; case ELF_PT_LOPROC: return "LOPROC"; case ELF_PT_HIPROC: return "HIPROC"; case ELF_PT_GNU_EH_FRAME: return "GNU_EH_FRAME"; case ELF_PT_GNU_STACK: return "GNU_STACK"; case ELF_PT_GNU_RELRO: return "GNU_RELRO"; case ELF_PT_GNU_PROPERTY: return "GNU_PROPERTY"; default: return null; } } const(char) *adbg_object_elf_em_string(ushort machine) { switch (machine) { case ELF_EM_NONE: return "No machine"; case ELF_EM_M32: return "AT&T WE 32100"; case ELF_EM_SPARC: return "SPARC"; case ELF_EM_386: return "Intel x86"; case ELF_EM_68K: return "Motorola 68000"; case ELF_EM_88K: return "Motorola 88000"; case ELF_EM_MCU: return "Intel MCU"; case ELF_EM_860: return "Intel 80860"; case ELF_EM_MIPS: return "MIPS I (RS3000)"; case ELF_EM_S370: return "IBM System/370"; case ELF_EM_MIPS_RS3_LE: return "MIPS RS3000 Little-Endian"; case ELF_EM_PARISC: return "Hewlett-Packard PA-RISC"; case ELF_EM_VPP500: return "Fujitsu VPP500"; case ELF_EM_SPARC32PLUS: return "Enhanced SPARC"; case ELF_EM_960: return "Intel 80960"; case ELF_EM_PPC: return "IBM PowerPC"; case ELF_EM_PPC64: return "IBM PowerPC64"; case ELF_EM_S390: return "IBM System/390"; case ELF_EM_SPU: return "IBM SPU/SPC"; case ELF_EM_V800: return "NEC V800"; case ELF_EM_FR20: return "Fujitsu FR20"; case ELF_EM_RH32: return "TRW RH-32"; case ELF_EM_RCE: return "Motorola RCE"; case ELF_EM_ARM: return "ARM 32-bit"; case ELF_EM_ALPHA: return "DEC Alpha"; case ELF_EM_SH: return "Hitachi SuperH"; case ELF_EM_SPARCV9: return "SPARC Version 9"; case ELF_EM_TRICORE: return "Siemens TriCore embedded"; case ELF_EM_ARC: return "Argonaut RISC Core"; case ELF_EM_H8_300: return "Hitachi H8/300"; case ELF_EM_H8_300H: return "Hitachi H8/300H"; case ELF_EM_H8S: return "Hitachi H8S"; case ELF_EM_H8_500: return "Hitachi H8/500"; case ELF_EM_IA_64: return "Intel Itanium"; case ELF_EM_MIPS_X: return "Stanford MIPS-X"; case ELF_EM_COLDFIRE: return "Motorola ColdFire"; case ELF_EM_68HC12: return "Motorola M68HC12"; case ELF_EM_MMA: return "Fujitsu MMA Multimedia Accelerator"; case ELF_EM_PCP: return "Siemens PCP"; case ELF_EM_NCPU: return "Sony nCPU embedded RISC"; case ELF_EM_NDR1: return "Denso NDR1"; case ELF_EM_STARCORE: return "Motorola Star*Core"; case ELF_EM_ME16: return "Toyota ME16"; case ELF_EM_ST100: return "STMicroelectronics ST100"; case ELF_EM_TINYJ: return "Advanced Logic Corp. TinyJ"; case ELF_EM_X86_64: return "AMD x86-64"; case ELF_EM_PDSP: return "Sony DSP"; case ELF_EM_PDP10: return "DEC PDP-10"; case ELF_EM_PDP11: return "DEC PDP-11"; case ELF_EM_FX66: return "Siemens FX66"; case ELF_EM_ST9PLUS: return "STMicroelectronics ST9+ (8/16-bit)"; case ELF_EM_ST7: return "STMicroelectronics ST7 (8-bit)"; case ELF_EM_68HC16: return "Motorola 68HC16"; case ELF_EM_68HC11: return "Motorola 68HC11"; case ELF_EM_68HC08: return "Motorola 68HC08"; case ELF_EM_68HC05: return "Motorola 68HC05"; case ELF_EM_SVX: return "Silicon Graphics SVx"; case ELF_EM_ST19: return "STMicroelectronics ST19 (8-bit)"; case ELF_EM_VAX: return "DEC VAX"; case ELF_EM_CRIS: return "Axis Communications (32-bit)"; case ELF_EM_JAVELIN: return "Infineon Technologies (32-bit)"; case ELF_EM_FIREPATH: return "Element 14 DSP (64-bit)"; case ELF_EM_ZSP: return "LSI Logic DSP (16-bit)"; case ELF_EM_MMIX: return "Donald Knuth's educational processor (64-bit)"; case ELF_EM_HUANY: return "Harvard University machine-independent object files"; case ELF_EM_PRISM: return "SiTera Prism"; case ELF_EM_AVR: return "Atmel AVR (8-bit)"; case ELF_EM_FR30: return "Fujitsu FR30"; case ELF_EM_D10V: return "Mitsubishi D10V"; case ELF_EM_D30V: return "Mitsubishi D30V"; case ELF_EM_V850: return "NEC V850"; case ELF_EM_M32R: return "Mitsubishi M32R"; case ELF_EM_MN10300: return "Mitsubishi MN10300"; case ELF_EM_MN10200: return "Mitsubishi MN10200"; case ELF_EM_PJ: return "picoJava"; case ELF_EM_OPENRISC: return "OpenRISC (32-bit)"; case ELF_EM_ARC_COMPACT: return "ARC International ARCompact"; case ELF_EM_XTENSA: return "Tensilica Xtensa Architecture"; case ELF_EM_VIDEOCORE: return "Alphamosaic VideoCore"; case ELF_EM_TMM_GPP: return "Thompson Multimedia General Purpose"; case ELF_EM_NS32K: return "National Semiconductor 32000"; case ELF_EM_TPC: return "Tenor Network TPC"; case ELF_EM_SNP1K: return "Trebia SNP 1000"; case ELF_EM_ST200: return "STMicroelectronics ST200"; case ELF_EM_IP2K: return "Ubicom IP2xxx"; case ELF_EM_MAX: return "MAX"; case ELF_EM_CR: return "National Semiconductor CompactRISC"; case ELF_EM_F2MC16: return "Fujitsu F2MC16"; case ELF_EM_MSP430: return "Texas Instruments MSP430"; case ELF_EM_BLACKFIN: return "Analog Devices Blackfin DSP"; case ELF_EM_SE_C33: return "Seiko Epson S1C33"; case ELF_EM_SEP: return "Sharp"; case ELF_EM_ARCA: return "Arca RISC"; case ELF_EM_UNICORE: return "PKU-Unity/Pekin Unicore"; case ELF_EM_EXCESS: return "eXcess (16/32/64-bit)"; case ELF_EM_DXP: return "Icera Semiconductor Inc. Deep Execution"; case ELF_EM_ALTERA_NIOS2: return "Altera Nios II soft-core"; case ELF_EM_CRX: return "national Semiconductor CompactRISC CRX"; case ELF_EM_XGATE: return "Motorola XGATE"; case ELF_EM_C116: return "Infineon C16x/XC16x"; case ELF_EM_M16C: return "Renesas M32C"; case ELF_EM_DSPIC30F: return "Microchip Technology DSPIC30F"; case ELF_EM_CE: return "Freescale Communication Engine RISC"; case ELF_EM_M32C: return "Renesas M32C"; case ELF_EM_TSK3000: return "Altium TSK3000"; case ELF_EM_RS08: return "Freescale RS08"; case ELF_EM_SHARC: return "SHARC (32-bit)"; case ELF_EM_ECOG2: return "Cyan Technology eCOG2"; case ELF_EM_SCORE7: return "Sunplus S+core7 RISC"; case ELF_EM_DSP24: return "New Japan Radio (NJR) DSP (24-bit)"; case ELF_EM_VIDEOCORE3: return "Broadcom VideoCore III"; case ELF_EM_LATTICEMICO32: return "Lattice FPGA"; case ELF_EM_SE_C17: return "Seiko Epson C17"; case ELF_EM_TI_C6000: return "Texas Instruments TMS320C6000"; case ELF_EM_TI_C2000: return "Texas Instruments TMS320C2000"; case ELF_EM_TI_C5500: return "Texas Instruments TMS320C55xx"; case ELF_EM_TI_ARP32: return "Texas Instruments Application Specific RISC (32-bit)"; case ELF_EM_TI_PRU: return "Texas Instruments Programmable Realtime Unit"; case ELF_EM_MMDSP_PLUS: return "STMicroelectronics VLIW DSP (64-bit)"; case ELF_EM_CYPRESS_M8C: return "Cypress M8C"; case ELF_EM_R32C: return "Renesas R32C"; case ELF_EM_TRIMEDIA: return "NXP Semiconductors TriMedia"; case ELF_EM_QDSP6: return "QUALCOMM DSP6"; case ELF_EM_8051: return "Intel 8051"; case ELF_EM_STXP7X: return "STMicroelectronics STxP7x"; case ELF_EM_NDS32: return "Andes Technology RISC"; case ELF_EM_ECOG1X: return "Cyan Technology eCOG1X"; case ELF_EM_MAXQ30: return "Dallas Semiconductor MAXQ30"; case ELF_EM_XIMO16: return "New Japan Radio (NJR) DSP (16-bit)"; case ELF_EM_MANIK: return "M2000 Reconfigurable RISC"; case ELF_EM_CRAYNV2: return "Cray Inc. NV2"; case ELF_EM_RX: return "Renesas RX"; case ELF_EM_METAG: return "Imagination Technologies META"; case ELF_EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware"; case ELF_EM_ECOG16: return "Cyan Technology eCOG16"; case ELF_EM_CR16: return "National Semiconductor CompactRISC CR16 (16-bit)"; case ELF_EM_ETPU: return "Freescale Extended Time Processing Unit"; case ELF_EM_SLE9X: return "Infineon Technologies SLE9X"; case ELF_EM_L10M: return "Intel L10M"; case ELF_EM_K10M: return "Intel K10M"; case ELF_EM_AARCH64: return "ARM (64-bit)"; case ELF_EM_AVR32: return "Atmel Corporation (32-bit)"; case ELF_EM_STM8: return "STMicroeletronics STM8 (8-bit)"; case ELF_EM_TILE64: return "Tilera TILE64"; case ELF_EM_TILEPRO: return "Tilera TILEPro"; case ELF_EM_MICROBLAZE: return "Xilinx MicroBlaze RISC soft core (32-bit)"; case ELF_EM_CUDA: return "NVIDIA CUDA"; case ELF_EM_TILEGX: return "Tilera TILE-Gx"; case ELF_EM_CLOUDSHIELD: return "CloudShield"; case ELF_EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation"; case ELF_EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation"; case ELF_EM_ARC_COMPACT2: return "Synopsys ARCompact V2"; case ELF_EM_OPEN8: return "Open8 RISC soft core (8-bit)"; case ELF_EM_RL78: return "Renesas RL78"; case ELF_EM_VIDEOCORE5: return "Broadcom VideoCore V"; case ELF_EM_78KOR: return "Renesas 78KOR"; case ELF_EM_56800EX: return "Freescale 56800EX DSC"; case ELF_EM_BA1: return "Beyond BA1"; case ELF_EM_BA2: return "Beyond BA2"; case ELF_EM_XCORE: return "XMOS xCORE"; case ELF_EM_MCHP_PIC: return "Microchip PIC(r) (8-bit)"; case ELF_EM_INTEL205: return "Reserved by Intel"; case ELF_EM_INTEL206: return "Reserved by Intel"; case ELF_EM_INTEL207: return "Reserved by Intel"; case ELF_EM_INTEL208: return "Reserved by Intel"; case ELF_EM_INTEL209: return "Reserved by Intel"; case ELF_EM_KM32: return "KM211 KM32 (32-bit)"; case ELF_EM_KMX32: return "KM211 KMX32 (32-bit)"; case ELF_EM_KMX16: return "KM211 KMX16 (16-bit)"; case ELF_EM_KMX8: return "KM211 KMX8 (8-bit)"; case ELF_EM_KVARC: return "KM211 KVARC"; case ELF_EM_CDP: return "Paneve CDP"; case ELF_EM_COGE: return "Cognitive Smart Memory"; case ELF_EM_COOL: return "Bluechip Systems"; case ELF_EM_NORC: return "Nanoradio Optimized RISC"; case ELF_EM_CSR_KALIMBA: return "CSR Kalimba"; case ELF_EM_Z80: return "Zilog Z80"; case ELF_EM_VISIUM: return "VISIUMcore"; case ELF_EM_FT32: return "FTDI Chip FT32 RISC (32-bit)"; case ELF_EM_MOXIE: return "Moxie"; case ELF_EM_AMDGPU: return "AMD GPU"; case ELF_EM_RISCV: return "RISC-V"; case ELF_EM_LOONGARCH: return "LoongArch"; default: return null; } } const(char) *adbg_object_elf_sht_string(int section) { switch (section) { case ELF_SHT_NULL: return "NULL"; case ELF_SHT_PROGBITS: return "PROGBITS"; case ELF_SHT_SYMTAB: return "SYMTAB"; case ELF_SHT_STRTAB: return "STRTAB"; case ELF_SHT_RELA: return "RELA"; case ELF_SHT_HASH: return "HASH"; case ELF_SHT_DYNAMIC: return "DYNAMIC"; case ELF_SHT_NOTE: return "NOTE"; case ELF_SHT_NOBITS: return "NOBITS"; case ELF_SHT_REL: return "REL"; case ELF_SHT_SHLIB: return "SHLIB"; case ELF_SHT_DYNSYM: return "DYNSYM"; case ELF_SHT_INIT_ARRAY: return "INIT_ARRAY"; case ELF_SHT_FINI_ARRAY: return "FINI_ARRAY"; case ELF_SHT_PREINIT_ARRAY: return "PREINIT_ARRAY"; case ELF_SHT_GROUP: return "GROUP"; case ELF_SHT_SYNTAB_SHNDX: return "SYNTAB_SHNDX"; case ELF_SHT_LOOS: return "LOOS"; case ELF_SHT_HIOS: return "HIOS"; case ELF_SHT_LOPROC: return "LOPROC"; case ELF_SHT_HIPROC: return "HIPROC"; case ELF_SHT_LOUSER: return "LOUSER"; case ELF_SHT_HIUSER: return "HIUSER"; // x86-64 types case ELF_SHT_X86_64_UNWIND: return "X86_64_UNWIND"; default: return null; } } const(char)* adbg_object_elf_nt_type_string(uint type) { // NOTE: Duplicates are commented switch (type) { case ELF_NT_PRSTATUS: return "NT_PRSTATUS"; case ELF_NT_PRFPREG: return "NT_PRFPREG"; // case ELF_NT_FPREGSET: return "NT_FPREGSET"; case ELF_NT_PRPSINFO: return "NT_PRPSINFO"; // case ELF_NT_PRXREG: return "NT_PRXREG"; case ELF_NT_TASKSTRUCT: return "NT_TASKSTRUCT"; case ELF_NT_PLATFORM: return "NT_PLATFORM"; case ELF_NT_AUXV: return "NT_AUXV"; case ELF_NT_GWINDOWS: return "NT_GWINDOWS"; case ELF_NT_ASRS: return "NT_ASRS"; case ELF_NT_PSTATUS: return "NT_PSTATUS"; case ELF_NT_PSINFO: return "NT_PSINFO"; case ELF_NT_PRCRED: return "NT_PRCRED"; case ELF_NT_UTSNAME: return "NT_UTSNAME"; case ELF_NT_LWPSTATUS: return "NT_LWPSTATUS"; case ELF_NT_LWPSINFO: return "NT_LWPSINFO"; case ELF_NT_PRFPXREG: return "NT_PRFPXREG"; case ELF_NT_SIGINFO: return "NT_SIGINFO"; case ELF_NT_FILE: return "NT_FILE"; case ELF_NT_PRXFPREG: return "NT_PRXFPREG"; case ELF_NT_PPC_VMX: return "NT_PPC_VMX"; case ELF_NT_PPC_SPE: return "NT_PPC_SPE"; case ELF_NT_PPC_VSX: return "NT_PPC_VSX"; case ELF_NT_PPC_TAR: return "NT_PPC_TAR"; case ELF_NT_PPC_PPR: return "NT_PPC_PPR"; case ELF_NT_PPC_DSCR: return "NT_PPC_DSCR"; case ELF_NT_PPC_EBB: return "NT_PPC_EBB"; case ELF_NT_PPC_PMU: return "NT_PPC_PMU"; case ELF_NT_PPC_TM_CGPR: return "NT_PPC_TM_CGPR"; case ELF_NT_PPC_TM_CFPR: return "NT_PPC_TM_CFPR"; case ELF_NT_PPC_TM_CVMX: return "NT_PPC_TM_CVMX"; case ELF_NT_PPC_TM_CVSX: return "NT_PPC_TM_CVSX"; case ELF_NT_PPC_TM_SPR: return "NT_PPC_TM_SPR"; case ELF_NT_PPC_TM_CTAR: return "NT_PPC_TM_CTAR"; case ELF_NT_PPC_TM_CPPR: return "NT_PPC_TM_CPPR"; case ELF_NT_PPC_TM_CDSCR: return "NT_PPC_TM_CDSCR"; case ELF_NT_386_TLS: return "NT_386_TLS"; case ELF_NT_386_IOPERM: return "NT_386_IOPERM"; case ELF_NT_X86_XSTATE: return "NT_X86_XSTATE"; case ELF_NT_S390_HIGH_GPRS: return "NT_S390_HIGH_GPRS"; case ELF_NT_S390_TIMER: return "NT_S390_TIMER"; case ELF_NT_S390_TODCMP: return "NT_S390_TODCMP"; case ELF_NT_S390_TODPREG: return "NT_S390_TODPREG"; case ELF_NT_S390_CTRS: return "NT_S390_CTRS"; case ELF_NT_S390_PREFIX: return "NT_S390_PREFIX"; case ELF_NT_S390_LAST_BREAK: return "NT_S390_LAST_BREAK"; case ELF_NT_S390_SYSTEM_CALL: return "NT_S390_SYSTEM_CALL"; case ELF_NT_S390_TDB: return "NT_S390_TDB"; case ELF_NT_S390_VXRS_LOW: return "NT_S390_VXRS_LOW"; case ELF_NT_S390_VXRS_HIGH: return "NT_S390_VXRS_HIGH"; case ELF_NT_S390_GS_CB: return "NT_S390_GS_CB"; case ELF_NT_S390_GS_BC: return "NT_S390_GS_BC"; case ELF_NT_S390_RI_CB: return "NT_S390_RI_CB"; case ELF_NT_ARM_VFP: return "NT_ARM_VFP"; case ELF_NT_ARM_TLS: return "NT_ARM_TLS"; case ELF_NT_ARM_HW_BREAK: return "NT_ARM_HW_BREAK"; case ELF_NT_ARM_HW_WATCH: return "NT_ARM_HW_WATCH"; case ELF_NT_ARM_SYSTEM_CALL: return "NT_ARM_SYSTEM_CALL"; case ELF_NT_ARM_SVE: return "NT_ARM_SVE"; case ELF_NT_ARM_PAC_MASK: return "NT_ARM_PAC_MASK"; case ELF_NT_ARM_PACA_KEYS: return "NT_ARM_PACA_KEYS"; case ELF_NT_ARM_PACG_KEYS: return "NT_ARM_PACG_KEYS"; case ELF_NT_METAG_CBUF: return "NT_METAG_CBUF"; case ELF_NT_METAG_RPIPE: return "NT_METAG_RPIPE"; case ELF_NT_METAG_TLS: return "NT_METAG_TLS"; case ELF_NT_ARC_V2: return "NT_ARC_V2"; case ELF_NT_VMCOREDD: return "NT_VMCOREDD"; case ELF_NT_MIPS_DSP: return "NT_MIPS_DSP"; case ELF_NT_MIPS_FP_MODE: return "NT_MIPS_FP_MODE"; case ELF_NT_MIPS_MSA: return "NT_MIPS_MSA"; case ELF_NT_LOONGARCH_CPUCFG: return "NT_LOONGARCH_CPUCFG"; case ELF_NT_LOONGARCH_CSR: return "NT_LOONGARCH_CSR"; case ELF_NT_LOONGARCH_LSX: return "NT_LOONGARCH_LSX"; case ELF_NT_LOONGARCH_LASX: return "NT_LOONGARCH_LASX"; case ELF_NT_LOONGARCH_LBT: return "NT_LOONGARCH_LBT"; case ELF_NT_LOONGARCH_HW_BREAK: return "NT_LOONGARCH_HW_BREAK"; case ELF_NT_LOONGARCH_HW_WATCH: return "NT_LOONGARCH_HW_WATCH"; default: return "unknown"; } }