diff --git a/Source/bindexplib.cxx b/Source/bindexplib.cxx index 3495aed2f2..abf3b0b98f 100644 --- a/Source/bindexplib.cxx +++ b/Source/bindexplib.cxx @@ -298,15 +298,20 @@ public: symbol.find("$entry_thunk") == std::string::npos && symbol.find("$iexit_thunk") == std::string::npos && symbol.find("$exit_thunk") == std::string::npos)) { - if (!pSymbolTable->Type && (SectChar & IMAGE_SCN_MEM_WRITE)) { - // Read only (i.e. constants) must be excluded + if ((!pSymbolTable->Type && + // Read only (i.e. constants) must be excluded + (SectChar & IMAGE_SCN_MEM_WRITE)) || + (this->SymbolArch == Arch::ARM64EC && + // vftable symbols are DATA on ARM64EC + symbol.compare(0, 4, vftablePrefix) == 0)) { this->DataSymbols.insert(symbol); - } else { - if (pSymbolTable->Type || !(SectChar & IMAGE_SCN_MEM_READ) || - (SectChar & IMAGE_SCN_MEM_EXECUTE) || - (symbol.compare(0, 4, vftablePrefix) == 0)) { - this->Symbols.insert(symbol); - } + } else if (pSymbolTable->Type || + !(SectChar & IMAGE_SCN_MEM_READ) || + (SectChar & IMAGE_SCN_MEM_EXECUTE) || + (this->SymbolArch != Arch::ARM64EC && + // vftable symbols fail if marked as DATA + symbol.compare(0, 4, vftablePrefix) == 0)) { + this->Symbols.insert(symbol); } } }