Decode ELF architecture.

This commit is contained in:
2018-03-15 00:49:28 +00:00
parent 51f2591a82
commit 7f78c4f151
2 changed files with 301 additions and 16 deletions

View File

@@ -9,7 +9,7 @@ namespace libexeinfo
{
public partial class ELF : IExecutable
{
List<Architecture> architectures;
Architecture[] architectures;
Elf64_Ehdr Header;
string interpreter;
Dictionary<string, ElfNote> notes;
@@ -82,7 +82,7 @@ namespace libexeinfo
Type = "Executable and Linkable Format (ELF)";
IsBigEndian = Header.ei_data == eiData.ELFDATA2MSB;
architectures = new List<Architecture>();
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;
}
}
}
}

View File

@@ -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")
};
}
}