diff --git a/libexeinfo/ELF/ELF.cs b/libexeinfo/ELF/ELF.cs index f599239..bf834e7 100644 --- a/libexeinfo/ELF/ELF.cs +++ b/libexeinfo/ELF/ELF.cs @@ -9,7 +9,7 @@ namespace libexeinfo { public partial class ELF : IExecutable { - List architectures; + Architecture[] architectures; Elf64_Ehdr Header; string interpreter; Dictionary notes; @@ -82,7 +82,7 @@ namespace libexeinfo Type = "Executable and Linkable Format (ELF)"; IsBigEndian = Header.ei_data == eiData.ELFDATA2MSB; - architectures = new List(); + architectures = new Architecture[1]; switch(Header.ei_class) { @@ -103,6 +103,8 @@ namespace libexeinfo default: return; } + architectures[0] = GetArchitecture(Header.e_machine); + if(Header.ei_data != eiData.ELFDATA2LSB && Header.ei_data != eiData.ELFDATA2MSB || Header.ei_version != eiVersion.EV_CURRENT) return; @@ -693,5 +695,125 @@ namespace libexeinfo return elfHdr.ei_mag.SequenceEqual(ELFMAG); } + + static Architecture GetArchitecture(eMachine machine) + { + switch(machine) + { + case eMachine.EM_386: return Architecture.I386; + case eMachine.EM_68HC05: return Architecture.M68HC05; + case eMachine.EM_68HC08: return Architecture.M68HC08; + case eMachine.EM_68HC11: return Architecture.M68HC11; + case eMachine.EM_68HC12: return Architecture.M68HC12; + case eMachine.EM_68HC16: return Architecture.M68HC16; + case eMachine.EM_68K: return Architecture.M68K; + case eMachine.EM_78KOR: return Architecture.R78KOR; + case eMachine.EM_8051: return Architecture.I8051; + case eMachine.EM_860: return Architecture.I860; + case eMachine.EM_88K: return Architecture.M88K; + case eMachine.EM_960: return Architecture.I960; + case eMachine.EM_AARCH64: return Architecture.Aarch64; + case eMachine.EM_ALPHA_OLD: + case eMachine.EM_ALPHA: return Architecture.Alpha; + case eMachine.EM_ALTERA_NIOS2: return Architecture.NIOS2; + case eMachine.EM_AMDGPU: return Architecture.AmdGpu; + case eMachine.EM_ARCA: return Architecture.Arca; + case eMachine.EM_ARC_COMPACT2: return Architecture.ARCompact2; + case eMachine.EM_ARC_COMPACT: return Architecture.ARCompact; + case eMachine.EM_ARC: return Architecture.Argonaut; + case eMachine.EM_ARM: return Architecture.Arm; + case eMachine.EM_AVR32: return Architecture.Avr32; + case eMachine.EM_AVR: return Architecture.Avr; + case eMachine.EM_BA1: return Architecture.Ba1; + case eMachine.EM_BA2: return Architecture.Ba2; + case eMachine.EM_BLACKFIN: return Architecture.Blackfin; + case eMachine.EM_C166: return Architecture.C16; + case eMachine.EM_CDP: return Architecture.CDP; + case eMachine.EM_CE: return Architecture.CommunicationEngine; + case eMachine.EM_CLOUDSHIELD: return Architecture.CloudShield; + case eMachine.EM_COGE: return Architecture.Coge; + case eMachine.EM_COLDFIRE: return Architecture.Coldfire; + case eMachine.EM_COOL: return Architecture.CoolEngine; + case eMachine.EM_COREA_1ST: return Architecture.CoreA; + case eMachine.EM_COREA_2ND: return Architecture.CoreA2; + case eMachine.EM_CR16: return Architecture.CompactRisc16; + case eMachine.EM_CRAYNV2: return Architecture.CrayNv2; + case eMachine.EM_CRIS: return Architecture.Cris; + case eMachine.EM_CR: return Architecture.CompactRisc; + case eMachine.EM_CRX: return Architecture.CompactRiscX; + case eMachine.EM_CSR_KALIMBA: return Architecture.Kalimba; + case eMachine.EM_CUDA: return Architecture.Cuda; + case eMachine.EM_CYGNUS_M32R: return Architecture.M32R; + case eMachine.EM_CYGNUS_V850: return Architecture.V850; + case eMachine.EM_CYPRESS_M8C: return Architecture.M8C; + case eMachine.EM_D10V: return Architecture.D10V; + case eMachine.EM_D30V: return Architecture.D30V; + case eMachine.EM_DXP: return Architecture.DeepExecutionProcessor; + case eMachine.EM_FR20: return Architecture.FR20; + case eMachine.EM_FR30: return Architecture.FR30; + case eMachine.EM_FRV: return Architecture.FRV; + case eMachine.EM_FT32: return Architecture.FT32; + case eMachine.EM_FX66: return Architecture.FX66; + case eMachine.EM_H8_300H: + case eMachine.EM_H8_300: + case eMachine.EM_H8_500: + case eMachine.EM_H8S: return Architecture.H8; + case eMachine.EM_HOBBIT: return Architecture.Hobbit; + case eMachine.EM_HUANY: return Architecture.Huany; + case eMachine.EM_IA_64: return Architecture.IA64; + case eMachine.EM_IP2K: return Architecture.IP2K; + case eMachine.EM_JAVELIN: return Architecture.Javelin; + case eMachine.EM_LATTICEMICO32: return Architecture.Lattice; + case eMachine.EM_M16C: return Architecture.M16C; + case eMachine.EM_M32C: return Architecture.M32C; + case eMachine.EM_M32: return Architecture.We32000; + case eMachine.EM_M32R: return Architecture.M32R; + case eMachine.EM_MCST_ELBRUS: return Architecture.Elbrus; + case eMachine.EM_MICROBLAZE: return Architecture.MicroBlaze; + case eMachine.EM_MIPS: return Architecture.Mips; + case eMachine.EM_MIPS_RS3_LE: return Architecture.Mips3; + case eMachine.EM_MIPS_X: return Architecture.Mips; + case eMachine.EM_NS32K: return Architecture.We32000; + case eMachine.EM_OPEN8: return Architecture.Open8; + case eMachine.EM_OPENRISC: return Architecture.OpenRisc; + case eMachine.EM_PARISC: return Architecture.PaRisc; + case eMachine.EM_PDP10: return Architecture.Pdp10; + case eMachine.EM_PDP11: return Architecture.Pdp11; + case eMachine.EM_PJ: return Architecture.PicoJava; + case eMachine.EM_PPC64: return Architecture.PowerPc64; + case eMachine.EM_PPC: return Architecture.PowerPc; + case eMachine.EM_PRISM: return Architecture.Prism; + case eMachine.EM_R32C: return Architecture.R32C; + case eMachine.EM_RISCV: return Architecture.RiscV; + case eMachine.EM_S370: return Architecture.S370; + case eMachine.EM_S390_OLD: + case eMachine.EM_S390: return Architecture.S390; + case eMachine.EM_SHARC: return Architecture.Sharc; + case eMachine.EM_SH: return Architecture.Sh2; + case eMachine.EM_SPARC32PLUS: + case eMachine.EM_SPARC: return Architecture.Sparc; + case eMachine.EM_SPARCV9: return Architecture.Sparc64; + case eMachine.EM_SPU: return Architecture.Spu; + case eMachine.EM_STARCORE: return Architecture.StarCore; + case eMachine.EM_STM8: return Architecture.STM8; + case eMachine.EM_TILE64: return Architecture.Tile64; + case eMachine.EM_TILEGX: return Architecture.TileGx; + case eMachine.EM_TILEPRO: return Architecture.TilePro; + case eMachine.EM_TINYJ: return Architecture.TinyJ; + case eMachine.EM_TRICORE: return Architecture.TriCore; + case eMachine.EM_TRIMEDIA: return Architecture.TriMedia; + case eMachine.EM_V800: return Architecture.V800; + case eMachine.EM_V850: return Architecture.V850; + case eMachine.EM_VAX: return Architecture.Vax; + case eMachine.EM_VIDEOCORE3: + case eMachine.EM_VIDEOCORE5: + case eMachine.EM_VIDEOCORE: return Architecture.VideoCore; + case eMachine.EM_X86_64: return Architecture.Amd64; + case eMachine.EM_XCORE: return Architecture.Xcore; + case eMachine.EM_XTENSA: return Architecture.Xtensa; + case eMachine.EM_Z80: return Architecture.Z80; + default: return Architecture.Unknown; + } + } } } \ No newline at end of file diff --git a/libexeinfo/Enums.cs b/libexeinfo/Enums.cs index 9a9720f..b03115f 100644 --- a/libexeinfo/Enums.cs +++ b/libexeinfo/Enums.cs @@ -33,32 +33,114 @@ namespace libexeinfo Alpha, Am33, Amd64, + AmdGpu, + Arca, + ARCompact, + ARCompact2, + Argonaut, Arm, + Avr, + Avr32, + Ba1, + Ba2, + Blackfin, + C16, + CDP, Clipper, + CloudShield, + Coge, + Coldfire, + CommunicationEngine, + CompactRisc, + CompactRisc16, + CompactRiscX, + CoolEngine, + CoreA, + CoreA2, + CrayNv2, + Cris, + Cuda, + D10V, + D30V, + DeepExecutionProcessor, EfiByteCode, - I86, + Elbrus, + FR20, + FR30, + FRV, + FT32, + FX66, + H8, + Hobbit, + Huany, I286, I386, + I8051, + I86, I860, + I960, IA64, + IP2K, + Javelin, + Kalimba, + Lattice, + M16C, + M32C, M32R, + M68HC05, + M68HC08, + M68HC11, + M68HC12, + M68HC16, M68K, + M88K, + M8C, + MicroBlaze, Mips, - Mips3, Mips16, + Mips3, + NIOS2, + Open8, + OpenRisc, + PaRisc, + Pdp10, + Pdp11, + PicoJava, Power, PowerPc, PowerPc64, + Prism, + R32C, + R78KOR, RiscV, + S370, + S390, Sh2, Sh3, Sh4, Sh5, + Sharc, Sparc, Sparc64, + Spu, + StarCore, + STM8, Thumb, Thumb2, - We32000 + Tile64, + TileGx, + TilePro, + TinyJ, + TriCore, + TriMedia, + V800, + V850, + Vax, + VideoCore, + We32000, + Xcore, + Xtensa, + Z80 } public static class Enums @@ -67,36 +149,117 @@ namespace libexeinfo { (Architecture.Unknown, "unknown", "Unknown"), (Architecture.Aarch64, "aarch64", "ARM64"), - (Architecture.Alpha, "axp", "Alpha"), + (Architecture.Alpha, "axp", "Alpha"), (Architecture.Am33, "am33", "AM33"), (Architecture.Amd64, "amd64", "AMD64"), + (Architecture.AmdGpu, "amdgpu", "AMD GPU"), + (Architecture.Arca, "arca", "Arca RISC"), + (Architecture.ARCompact2, "arcompact2", "ARCompact 2"), + (Architecture.ARCompact, "arcompact", "ARCompact"), + (Architecture.Argonaut, "arc", "Argonaut RISC Core"), (Architecture.Arm, "arm", "ARM"), + (Architecture.Avr32, "avr32", "Atmel AVR32"), + (Architecture.Avr, "avr", "Atmel AVR"), + (Architecture.Ba1, "ba1", "BA1"), + (Architecture.Ba2, "ba2", "BA2"), + (Architecture.Blackfin, "blackfin", "Blackfin"), + (Architecture.C16, "c16", "Infineon C16x/XC16x"), + (Architecture.CDP, "cdp", "Paneve CDP"), (Architecture.Clipper, "clipper", "Clipper"), + (Architecture.CloudShield, "cloudshield", ""), + (Architecture.Coge, "coge", "Cognitive Smart Memory Processor"), + (Architecture.Coldfire, "coldfire", "Motorola ColdFire"), + (Architecture.CommunicationEngine, "fce", "Freescale Communication Engine"), + (Architecture.CompactRisc16, "cr16", "CompactRISC (16-bit)"), + (Architecture.CompactRisc, "cr", "CompactRISC"), + (Architecture.CompactRiscX, "crx", "CompactRISC X"), + (Architecture.CoolEngine, "coole", "Bluechip Systems CoolEngine"), + (Architecture.CoreA2, "corea2", "Core-A (2nd gen.)"), + (Architecture.CoreA, "corea", "Core-A"), + (Architecture.CrayNv2, "craynv2", "Cray NV2"), + (Architecture.Cris, "cris", "Axis Cris"), + (Architecture.Cuda, "cuda", "NVIDIA CUDA"), + (Architecture.D10V, "d10v", "Mitsubishi D10V"), + (Architecture.D30V, "d30v", "Mitsubishi D30V"), + (Architecture.DeepExecutionProcessor, "dep", "Deep Execution Processor"), (Architecture.EfiByteCode, "ebc", "EFI Byte Code"), - (Architecture.I86, "i86", "Intel x86 (16-bit)"), + (Architecture.Elbrus, "elbrus", "Elbrus"), + (Architecture.FR20, "fr20", "Fujitsu FR20"), + (Architecture.FR30, "fr30", "Fujitsu FR30"), + (Architecture.FRV, "frv", "Fujitsu FR-V"), + (Architecture.FT32, "ft32", "FTDI FT32"), + (Architecture.FX66, "fx66", "Siemens FX66"), + (Architecture.H8, "h8", "Hitachi H8"), + (Architecture.Hobbit, "hobbit", "AT&T Hobbit"), + (Architecture.Huany, "huany", "Harvard University machine-independent"), (Architecture.I286, "i286", "Intel x86 (16-bit protected mode)"), - (Architecture.I386, "ia32", "Intel IA-32"), + (Architecture.I386, "ia32", "Intel IA-32"), + (Architecture.I8051, "8051", "Intel 8051"), (Architecture.I86, "i860", "Intel i860"), + (Architecture.I86, "i86", "Intel x86 (16-bit)"), + (Architecture.I960, "i960", "Intel 960"), (Architecture.IA64, "ia64", "Intel IA-64"), + (Architecture.IP2K, "ip2k", "Ubicom IP2xxx"), + (Architecture.Javelin, "javelin", "Infineon Javelin"), + (Architecture.Kalimba, "kalimba", "Kalimba"), + (Architecture.Lattice, "lattice", "Lattice Mico32"), + (Architecture.M16C, "m16c", "Renesas M16C"), + (Architecture.M32C, "m32c", "Renesas M32C"), (Architecture.M32R, "m32r", "Mitsubishi M32R"), + (Architecture.M68HC05, "68hc05", "Motorola 68HC05"), + (Architecture.M68HC08, "68hc08", "Motorola 68HC08"), + (Architecture.M68HC11, "68hc11", "Motorola 68HC11"), + (Architecture.M68HC12, "68hc12", "Motorola 68HC12"), + (Architecture.M68HC16, "68hc16", "Motorola 68HC16"), (Architecture.M68K, "m68k", "Motorola 68000"), - (Architecture.Mips, "mips", "MIPS"), - (Architecture.Mips3, "mips3", "MIPS III"), + (Architecture.M88K, "m88k", "Motorola 88000"), + (Architecture.M8C, "m8c", "Cypress M8C"), + (Architecture.MicroBlaze, "microblaze", "MicroBlanse"), (Architecture.Mips16, "mips16", "MIPS16"), - (Architecture.Power, "power", "POWER"), - (Architecture.PowerPc, "ppc", "PowerPC"), + (Architecture.Mips3, "mips3", "MIPS III"), + (Architecture.Mips, "mips", "MIPS"), + (Architecture.NIOS2, "nios2", "Altera Nios II"), + (Architecture.Open8, "open8", "Open8"), + (Architecture.OpenRisc, "openrisc", "OpenRisc"), + (Architecture.PaRisc, "hppa", "HP PA-RISC"), + (Architecture.Pdp10, "pdp10", "Digital PDP-10"), + (Architecture.Pdp11, "pdp11", "Digital PDP-11"), + (Architecture.PicoJava, "picojava", "PicoJava"), (Architecture.PowerPc64, "ppc64", "PowerPC (64-bit)"), + (Architecture.PowerPc, "ppc", "PowerPC"), + (Architecture.Power, "power", "POWER"), + (Architecture.Prism, "prism", "PRISM"), + (Architecture.R32C, "r32c", "Renesas R32C"), + (Architecture.R78KOR, "78kor", "Renesas 78KOR"), (Architecture.RiscV, "riscv", "RISC-V"), + (Architecture.S370, "s370", "IBMSystem/370"), + (Architecture.S390, "s390", "IBM S/390"), (Architecture.Sh2, "sh2", "Hitachi SH2"), (Architecture.Sh3, "sh3", "Hitachi SH3"), (Architecture.Sh4, "sh4", "Hitachi SH4"), (Architecture.Sh5, "sh5", "Hitachi SH5"), - (Architecture.Sparc, "sparc", "SPARC"), + (Architecture.Sharc, "sharc", "SHARC"), (Architecture.Sparc64, "sparc64", "SPARC (64-bit)"), - (Architecture.Thumb, "thumb", "ARM Thumb"), + (Architecture.Sparc, "sparc", "SPARC"), + (Architecture.Spu, "spu", "IBM SPU"), + (Architecture.StarCore, "starcore", "Motorola Star*Core"), + (Architecture.STM8, "stm8", "STM8"), (Architecture.Thumb2, "thumb2", "ARM Thumb-2"), - (Architecture.We32000, "we32000", "WE32000") + (Architecture.Thumb, "thumb", "ARM Thumb"), + (Architecture.Tile64, "tile64", "Tile64"), + (Architecture.TileGx, "tilegx", "TileGx"), + (Architecture.TilePro, "tilepro", "Tile Pro"), + (Architecture.TinyJ, "tinyj", "TinyJ"), + (Architecture.TriCore, "tricore", "TriCore"), + (Architecture.TriMedia, "trimedia", "TriMedia"), + (Architecture.V800, "v800", "NEC V800"), + (Architecture.V850, "v850", "NEC V850"), + (Architecture.Vax, "vax", "Digital VAX"), + (Architecture.VideoCore, "videocore", "VideoCore"), + (Architecture.We32000, "we32000", "WE32000"), + (Architecture.Xcore, "xcore", "xCORE"), + (Architecture.Xtensa, "xtensa", "Xtensa"), + (Architecture.Z80, "z80", "Z80") }; } - } \ No newline at end of file