1727 int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK); 1728 1729 if (file_descriptor < 0) { 1730 // Can't open library, report dlerror() message 1731 return NULL; 1732 } 1733 1734 bool failed_to_read_elf_head= 1735 (sizeof(elf_head)!= 1736 (::read(file_descriptor, &elf_head,sizeof(elf_head)))); 1737 1738 ::close(file_descriptor); 1739 if (failed_to_read_elf_head) { 1740 // file i/o error - report dlerror() msg 1741 return NULL; 1742 } 1743 1744 typedef struct { 1745 Elf32_Half code; // Actual value as defined in elf.h 1746 Elf32_Half compat_class; // Compatibility of archs at VM's sense 1747 char elf_class; // 32 or 64 bit 1748 char endianess; // MSB or LSB 1749 char* name; // String representation 1750 } arch_t; 1751 1752 #ifndef EM_486 1753 #define EM_486 6 /* Intel 80486 */ 1754 #endif 1755 #ifndef EM_AARCH64 1756 #define EM_AARCH64 183 /* ARM AARCH64 */ 1757 #endif 1758 1759 static const arch_t arch_array[]={ 1760 {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, 1761 {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, 1762 {EM_IA_64, EM_IA_64, ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"}, 1763 {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"}, 1764 {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, 1765 {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, 1766 {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"}, 1767 {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"}, 1768 #if defined(VM_LITTLE_ENDIAN) | 1727 int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK); 1728 1729 if (file_descriptor < 0) { 1730 // Can't open library, report dlerror() message 1731 return NULL; 1732 } 1733 1734 bool failed_to_read_elf_head= 1735 (sizeof(elf_head)!= 1736 (::read(file_descriptor, &elf_head,sizeof(elf_head)))); 1737 1738 ::close(file_descriptor); 1739 if (failed_to_read_elf_head) { 1740 // file i/o error - report dlerror() msg 1741 return NULL; 1742 } 1743 1744 typedef struct { 1745 Elf32_Half code; // Actual value as defined in elf.h 1746 Elf32_Half compat_class; // Compatibility of archs at VM's sense 1747 unsigned char elf_class; // 32 or 64 bit 1748 unsigned char endianess; // MSB or LSB 1749 char* name; // String representation 1750 } arch_t; 1751 1752 #ifndef EM_486 1753 #define EM_486 6 /* Intel 80486 */ 1754 #endif 1755 #ifndef EM_AARCH64 1756 #define EM_AARCH64 183 /* ARM AARCH64 */ 1757 #endif 1758 1759 static const arch_t arch_array[]={ 1760 {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, 1761 {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, 1762 {EM_IA_64, EM_IA_64, ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"}, 1763 {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"}, 1764 {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, 1765 {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, 1766 {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"}, 1767 {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"}, 1768 #if defined(VM_LITTLE_ENDIAN) |