diff --git a/libIRDB-core/src/fileir.cpp b/libIRDB-core/src/fileir.cpp index 73442e61e260d3df04e694f2a53bce321b81e215..581a8a5f8ab8644b86c60a8142ee9b8ef46c6550 100644 --- a/libIRDB-core/src/fileir.cpp +++ b/libIRDB-core/src/fileir.cpp @@ -1003,24 +1003,20 @@ void FileIR_t::setArchitecture() libIRDB::FileIR_t::archdesc=new ArchitectureDescription_t; + auto is_elf=false; + auto is_pe=false; + if((e_ident[EI_MAG0]==ELFMAG0) && (e_ident[EI_MAG1]==ELFMAG1) && (e_ident[EI_MAG2]==ELFMAG2) && (e_ident[EI_MAG3]==ELFMAG3)) { - libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELF); - } - else if((e_ident[EI_MAG0]==ELFMAG0) && - (e_ident[EI_MAG1]=='C') && - (e_ident[EI_MAG2]=='G') && - (e_ident[EI_MAG3]=='C')) - { - libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELF); + is_elf=true; } else if((e_ident[EI_MAG0]=='M') && (e_ident[EI_MAG1]=='Z')) { - libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftPE); + is_pe=true; } else { @@ -1029,18 +1025,24 @@ void FileIR_t::setArchitecture() } - if (libIRDB::FileIR_t::archdesc->getFileType() == IRDB_SDK::adftPE) + if (is_pe) // libIRDB::FileIR_t::archdesc->getFileType() == IRDB_SDK::adftPE) { + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftPE); // just assume x86-64 bit for Windows, o/w could also extract from file libIRDB::FileIR_t::archdesc->setBitWidth(64); libIRDB::FileIR_t::archdesc->setMachineType(IRDB_SDK::admtX86_64); } - else + else if(is_elf) { switch(e_ident[4]) { case ELFCLASS32: { + + if(hdr_union.ehdr32.e_type == ET_DYN) + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELFSO); + else + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELFEXE); libIRDB::FileIR_t::archdesc->setBitWidth(32); if(hdr_union.ehdr32.e_machine!=EM_386) throw std::invalid_argument("Arch not supported. 32-bit archs supported: I386"); @@ -1049,6 +1051,10 @@ void FileIR_t::setArchitecture() } case ELFCLASS64: { + if(hdr_union.ehdr64.e_type == ET_DYN) + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELFSO); + else + libIRDB::FileIR_t::archdesc->setFileType(IRDB_SDK::adftELFEXE); libIRDB::FileIR_t::archdesc->setBitWidth(64); const auto mt= hdr_union.ehdr64.e_machine==EM_AARCH64 ? IRDB_SDK::admtAarch64 :