#include #include #include #include #include #include #include #include #define ME_BIN "/proc/self/exe" #define HOST_BIN "/bin/sh" union ehdr_union { Elf32_Ehdr e32; Elf64_Ehdr e64; }; static const char *get_archstr(const char *path); int main(void) { printf("I am [%s]\n", get_archstr(ME_BIN)); printf("Host is [%s]\n", get_archstr(HOST_BIN)); return 0; } static unsigned int elf_class(const void *mem) { const unsigned char *e_ident = mem; if (e_ident[EI_MAG0] != ELFMAG0) return -1; if (e_ident[EI_MAG1] != ELFMAG1) return -1; if (e_ident[EI_MAG2] != ELFMAG2) return -1; if (e_ident[EI_MAG3] != ELFMAG3) return -1; if (e_ident[EI_DATA] != ELFDATA2LSB) return -1; if (e_ident[EI_VERSION] != EV_CURRENT) return -1; return (unsigned int) e_ident[EI_CLASS]; } static const char *__get_archstr(unsigned int machine) { switch (machine) { #define m_arch(_x, _y) case _x: return _y // perl -pe 's@#define (EM_[A-Z_0-9]*)(.*)/\* (.*) \*/@m_arch\(\1, "\3"\);@' /usr/include/elf.h |grep m_arch m_arch(EM_NONE, "No machine"); m_arch(EM_M32, "AT&T WE 32100"); m_arch(EM_SPARC, "SUN SPARC"); m_arch(EM_386, "Intel 80386"); m_arch(EM_68K, "Motorola m68k family"); m_arch(EM_88K, "Motorola m88k family"); m_arch(EM_IAMCU, "Intel MCU"); m_arch(EM_860, "Intel 80860"); m_arch(EM_MIPS, "MIPS R3000 big-endian"); m_arch(EM_S370, "IBM System/370"); m_arch(EM_MIPS_RS3_LE, "MIPS R3000 little-endian"); m_arch(EM_PARISC, "HPPA"); m_arch(EM_VPP500, "Fujitsu VPP500"); m_arch(EM_SPARC32PLUS, "Sun's \"v8plus\""); m_arch(EM_960, "Intel 80960"); m_arch(EM_PPC, "PowerPC"); m_arch(EM_PPC64, "PowerPC 64-bit"); m_arch(EM_S390, "IBM S390"); m_arch(EM_SPU, "IBM SPU/SPC"); m_arch(EM_V800, "NEC V800 series"); m_arch(EM_FR20, "Fujitsu FR20"); m_arch(EM_RH32, "TRW RH-32"); m_arch(EM_RCE, "Motorola RCE"); m_arch(EM_ARM, "ARM"); m_arch(EM_FAKE_ALPHA, "Digital Alpha"); m_arch(EM_SH, "Hitachi SH"); m_arch(EM_SPARCV9, "SPARC v9 64-bit"); m_arch(EM_TRICORE, "Siemens Tricore"); m_arch(EM_ARC, "Argonaut RISC Core"); m_arch(EM_H8_300, "Hitachi H8/300"); m_arch(EM_H8_300H, "Hitachi H8/300H"); m_arch(EM_H8S, "Hitachi H8S"); m_arch(EM_H8_500, "Hitachi H8/500"); m_arch(EM_IA_64, "Intel Merced"); m_arch(EM_MIPS_X, "Stanford MIPS-X"); m_arch(EM_COLDFIRE, "Motorola Coldfire"); m_arch(EM_68HC12, "Motorola M68HC12"); m_arch(EM_MMA, "Fujitsu MMA Multimedia Accelerator"); m_arch(EM_PCP, "Siemens PCP"); m_arch(EM_NCPU, "Sony nCPU embeeded RISC"); m_arch(EM_NDR1, "Denso NDR1 microprocessor"); m_arch(EM_STARCORE, "Motorola Start*Core processor"); m_arch(EM_ME16, "Toyota ME16 processor"); m_arch(EM_ST100, "STMicroelectronic ST100 processor"); m_arch(EM_TINYJ, "Advanced Logic Corp. Tinyj emb.fam"); m_arch(EM_X86_64, "AMD x86-64 architecture"); m_arch(EM_PDSP, "Sony DSP Processor"); m_arch(EM_PDP10, "Digital PDP-10"); m_arch(EM_PDP11, "Digital PDP-11"); m_arch(EM_FX66, "Siemens FX66 microcontroller"); m_arch(EM_ST9PLUS, "STMicroelectronics ST9+ 8/16 mc"); m_arch(EM_ST7, "STmicroelectronics ST7 8 bit mc"); m_arch(EM_68HC16, "Motorola MC68HC16 microcontroller"); m_arch(EM_68HC11, "Motorola MC68HC11 microcontroller"); m_arch(EM_68HC08, "Motorola MC68HC08 microcontroller"); m_arch(EM_68HC05, "Motorola MC68HC05 microcontroller"); m_arch(EM_SVX, "Silicon Graphics SVx"); m_arch(EM_ST19, "STMicroelectronics ST19 8 bit mc"); m_arch(EM_VAX, "Digital VAX"); m_arch(EM_CRIS, "Axis Communications 32-bit emb.proc"); m_arch(EM_JAVELIN, "Infineon Technologies 32-bit emb.proc"); m_arch(EM_FIREPATH, "Element 14 64-bit DSP Processor"); m_arch(EM_ZSP, "LSI Logic 16-bit DSP Processor"); m_arch(EM_MMIX, "Donald Knuth's educational 64-bit proc"); m_arch(EM_HUANY, "Harvard University machine-independent object files"); m_arch(EM_PRISM, "SiTera Prism"); m_arch(EM_AVR, "Atmel AVR 8-bit microcontroller"); m_arch(EM_FR30, "Fujitsu FR30"); m_arch(EM_D10V, "Mitsubishi D10V"); m_arch(EM_D30V, "Mitsubishi D30V"); m_arch(EM_V850, "NEC v850"); m_arch(EM_M32R, "Mitsubishi M32R"); m_arch(EM_MN10300, "Matsushita MN10300"); m_arch(EM_MN10200, "Matsushita MN10200"); m_arch(EM_PJ, "picoJava"); m_arch(EM_OPENRISC, "OpenRISC 32-bit embedded processor"); m_arch(EM_ARC_COMPACT, "ARC International ARCompact"); m_arch(EM_XTENSA, "Tensilica Xtensa Architecture"); m_arch(EM_VIDEOCORE, "Alphamosaic VideoCore"); m_arch(EM_TMM_GPP, "Thompson Multimedia General Purpose Proc"); m_arch(EM_NS32K, "National Semi. 32000"); m_arch(EM_TPC, "Tenor Network TPC"); m_arch(EM_SNP1K, "Trebia SNP 1000"); m_arch(EM_ST200, "STMicroelectronics ST200"); m_arch(EM_IP2K, "Ubicom IP2xxx"); m_arch(EM_MAX, "MAX processor"); m_arch(EM_CR, "National Semi. CompactRISC"); m_arch(EM_F2MC16, "Fujitsu F2MC16"); m_arch(EM_MSP430, "Texas Instruments msp430"); m_arch(EM_BLACKFIN, "Analog Devices Blackfin DSP"); m_arch(EM_SE_C33, "Seiko Epson S1C33 family"); m_arch(EM_SEP, "Sharp embedded microprocessor"); m_arch(EM_ARCA, "Arca RISC"); m_arch(EM_UNICORE, "PKU-Unity & MPRC Peking Uni. mc series"); m_arch(EM_EXCESS, "eXcess configurable cpu"); m_arch(EM_DXP, "Icera Semi. Deep Execution Processor"); m_arch(EM_ALTERA_NIOS2, "Altera Nios II"); m_arch(EM_CRX, "National Semi. CompactRISC CRX"); m_arch(EM_XGATE, "Motorola XGATE"); m_arch(EM_C166, "Infineon C16x/XC16x"); m_arch(EM_M16C, "Renesas M16C"); m_arch(EM_DSPIC30F, "Microchip Technology dsPIC30F"); m_arch(EM_CE, "Freescale Communication Engine RISC"); m_arch(EM_M32C, "Renesas M32C"); m_arch(EM_TSK3000, "Altium TSK3000"); m_arch(EM_RS08, "Freescale RS08"); m_arch(EM_SHARC, "Analog Devices SHARC family"); m_arch(EM_ECOG2, "Cyan Technology eCOG2"); m_arch(EM_SCORE7, "Sunplus S+core7 RISC"); m_arch(EM_DSP24, "New Japan Radio (NJR) 24-bit DSP"); m_arch(EM_VIDEOCORE3, "Broadcom VideoCore III"); m_arch(EM_LATTICEMICO32, "RISC for Lattice FPGA"); m_arch(EM_SE_C17, "Seiko Epson C17"); m_arch(EM_TI_C6000, "Texas Instruments TMS320C6000 DSP"); m_arch(EM_TI_C2000, "Texas Instruments TMS320C2000 DSP"); m_arch(EM_TI_C5500, "Texas Instruments TMS320C55x DSP"); m_arch(EM_TI_ARP32, "Texas Instruments App. Specific RISC"); m_arch(EM_TI_PRU, "Texas Instruments Prog. Realtime Unit"); m_arch(EM_MMDSP_PLUS, "STMicroelectronics 64bit VLIW DSP"); m_arch(EM_CYPRESS_M8C, "Cypress M8C"); m_arch(EM_R32C, "Renesas R32C"); m_arch(EM_TRIMEDIA, "NXP Semi. TriMedia"); m_arch(EM_QDSP6, "QUALCOMM DSP6"); m_arch(EM_8051, "Intel 8051 and variants"); m_arch(EM_STXP7X, "STMicroelectronics STxP7x"); m_arch(EM_NDS32, "Andes Tech. compact code emb. RISC"); m_arch(EM_ECOG1X, "Cyan Technology eCOG1X"); m_arch(EM_MAXQ30, "Dallas Semi. MAXQ30 mc"); m_arch(EM_XIMO16, "New Japan Radio (NJR) 16-bit DSP"); m_arch(EM_MANIK, "M2000 Reconfigurable RISC"); m_arch(EM_CRAYNV2, "Cray NV2 vector architecture"); m_arch(EM_RX, "Renesas RX"); m_arch(EM_METAG, "Imagination Tech. META"); m_arch(EM_MCST_ELBRUS, "MCST Elbrus"); m_arch(EM_ECOG16, "Cyan Technology eCOG16"); m_arch(EM_CR16, "National Semi. CompactRISC CR16"); m_arch(EM_ETPU, "Freescale Extended Time Processing Unit"); m_arch(EM_SLE9X, "Infineon Tech. SLE9X"); m_arch(EM_L10M, "Intel L10M"); m_arch(EM_K10M, "Intel K10M"); m_arch(EM_AARCH64, "ARM AARCH64"); m_arch(EM_AVR32, "Amtel 32-bit microprocessor"); m_arch(EM_STM8, "STMicroelectronics STM8"); m_arch(EM_TILE64, "Tileta TILE64"); m_arch(EM_TILEPRO, "Tilera TILEPro"); m_arch(EM_MICROBLAZE, "Xilinx MicroBlaze"); m_arch(EM_CUDA, "NVIDIA CUDA"); m_arch(EM_TILEGX, "Tilera TILE-Gx"); m_arch(EM_CLOUDSHIELD, "CloudShield"); m_arch(EM_COREA_1ST, "KIPO-KAIST Core-A 1st gen."); m_arch(EM_COREA_2ND, "KIPO-KAIST Core-A 2nd gen."); m_arch(EM_ARC_COMPACT2, "Synopsys ARCompact V2"); m_arch(EM_OPEN8, "Open8 RISC"); m_arch(EM_RL78, "Renesas RL78"); m_arch(EM_VIDEOCORE5, "Broadcom VideoCore V"); m_arch(EM_78KOR, "Renesas 78KOR"); m_arch(EM_56800EX, "Freescale 56800EX DSC"); m_arch(EM_BA1, "Beyond BA1"); m_arch(EM_BA2, "Beyond BA2"); m_arch(EM_XCORE, "XMOS xCORE"); m_arch(EM_MCHP_PIC, "Microchip 8-bit PIC(r)"); m_arch(EM_KM32, "KM211 KM32"); m_arch(EM_KMX32, "KM211 KMX32"); m_arch(EM_EMX16, "KM211 KMX16"); m_arch(EM_EMX8, "KM211 KMX8"); m_arch(EM_KVARC, "KM211 KVARC"); m_arch(EM_CDP, "Paneve CDP"); m_arch(EM_COGE, "Cognitive Smart Memory Processor"); m_arch(EM_COOL, "Bluechip CoolEngine"); m_arch(EM_NORC, "Nanoradio Optimized RISC"); m_arch(EM_CSR_KALIMBA, "CSR Kalimba"); m_arch(EM_Z80, "Zilog Z80"); m_arch(EM_VISIUM, "Controls and Data Services VISIUMcore"); m_arch(EM_FT32, "FTDI Chip FT32"); m_arch(EM_MOXIE, "Moxie processor"); m_arch(EM_AMDGPU, "AMD GPU"); m_arch(EM_RISCV, "RISC-V"); m_arch(EM_BPF, "Linux BPF -- in-kernel virtual machine"); m_arch(EM_CSKY, "C_SKY"); #undef m_arch } return "???"; } static const char *get_archstr(const char *path) { union ehdr_union ehdr; const int fd = open(path, O_RDONLY); if (fd < 0) return strerror(errno); if (read(fd, &ehdr, sizeof(ehdr)) < 0) { close(fd); return strerror(errno); } switch (elf_class(&ehdr)) { case ELFCLASS32: return __get_archstr(ehdr.e32.e_machine); case ELFCLASS64: return __get_archstr(ehdr.e64.e_machine); } return "???"; }