diff --git a/Source/bindexplib.cxx b/Source/bindexplib.cxx index 1ddfaafe2f..bbcb0bccc9 100644 --- a/Source/bindexplib.cxx +++ b/Source/bindexplib.cxx @@ -290,9 +290,11 @@ public: symbol.compare(0, 4, vectorPrefix)) { SectChar = this->SectionHeaders[pSymbolTable->SectionNumber - 1] .Characteristics; - // skip symbols containing a dot or are from managed code + // Skip symbols containing a dot, are from managed code, + // or are C++ operators incorrectly declared extern "C". if (symbol.find('.') == std::string::npos && - !SymbolIsFromManagedCode(symbol)) { + !SymbolIsFromManagedCode(symbol) && + !SymbolIsOperatorExternC(symbol)) { // skip arm64ec thunk symbols if (this->SymbolArch != Arch::ARM64EC || (symbol.find("$ientry_thunk") == std::string::npos && @@ -337,6 +339,12 @@ private: symbol.find("$$J") != std::string::npos; } + bool SymbolIsOperatorExternC(std::string const& symbol) + { + return symbol.find_first_not_of("=<>+-*/%,?|~!^&[]()") == + std::string::npos; + } + std::set& Symbols; std::set& DataSymbols; DWORD_PTR SymbolCount; diff --git a/Tests/RunCMake/AutoExportDll/hello.cxx b/Tests/RunCMake/AutoExportDll/hello.cxx index 2dc0c9819b..e71d8eea44 100644 --- a/Tests/RunCMake/AutoExportDll/hello.cxx +++ b/Tests/RunCMake/AutoExportDll/hello.cxx @@ -21,3 +21,33 @@ HelloVFTable::~HelloVFTable() { } #endif + +#ifndef __SUNPRO_CC +// C++ operators incorrectly declared extern "C" should *not* be exported. +extern "C" { +bool operator==(Hello const&, Hello const&) +{ + return false; +} +bool operator!=(Hello const&, Hello const&) +{ + return false; +} +bool operator<(Hello const&, Hello const&) +{ + return false; +} +bool operator<=(Hello const&, Hello const&) +{ + return false; +} +bool operator>(Hello const&, Hello const&) +{ + return false; +} +bool operator>=(Hello const&, Hello const&) +{ + return false; +} +} +#endif