mirror of
https://github.com/claunia/libexeinfo.git
synced 2025-12-16 19:14:24 +00:00
Decode ELF architecture.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user