Merge topic 'windows-export-no-operators'

607d9cf561 WINDOWS_EXPORT_ALL_SYMBOLS: Do not export C++ operators declared extern "C"
8f8b2e9429 bindexplib: Truncate short symbol names on first embedded null-terminator

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !10791
This commit is contained in:
Brad King
2025-05-22 12:31:17 +00:00
committed by Kitware Robot
2 changed files with 42 additions and 3 deletions

View File

@@ -254,7 +254,8 @@ public:
*/
if (pSymbolTable->N.Name.Short != 0) {
symbol.clear();
symbol.insert(0, (char const*)pSymbolTable->N.ShortName, 8);
symbol.insert(0, (char const*)pSymbolTable->N.ShortName,
strnlen((char const*)pSymbolTable->N.ShortName, 8));
} else {
symbol = stringTable + pSymbolTable->N.Name.Long;
}
@@ -289,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 &&
@@ -336,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<std::string>& Symbols;
std::set<std::string>& DataSymbols;
DWORD_PTR SymbolCount;

View File

@@ -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