mirror of
https://github.com/Kitware/CMake.git
synced 2026-02-28 19:58:34 -06:00
Merge topic 'windows-export-no-operators'
607d9cf561WINDOWS_EXPORT_ALL_SYMBOLS: Do not export C++ operators declared extern "C"8f8b2e9429bindexplib: Truncate short symbol names on first embedded null-terminator Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !10791
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user