WINDOWS_EXPORT_ALL_SYMBOLS: Export vftable symbol

`pybind11` requires access to this symbol to link in some cases.
Include this symbol when generating automatic exports via
`CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS`.

Fixes: #24406
This commit is contained in:
Malcolm Bechard 2023-02-13 13:15:00 -05:00 committed by Brad King
parent 8a73af36b0
commit f513781bc5
4 changed files with 32 additions and 1 deletions

View File

@ -281,6 +281,7 @@ public:
// the symbol
const char* scalarPrefix = "??_G";
const char* vectorPrefix = "??_E";
const char* vftablePrefix = "??_7";
// The original code had a check for
// symbol.find("real@") == std::string::npos)
// but this disallows member functions with the name "real".
@ -302,7 +303,8 @@ public:
this->DataSymbols.insert(symbol);
} else {
if (pSymbolTable->Type || !(SectChar & IMAGE_SCN_MEM_READ) ||
(SectChar & IMAGE_SCN_MEM_EXECUTE)) {
(SectChar & IMAGE_SCN_MEM_EXECUTE) ||
(symbol.compare(0, 4, vftablePrefix) == 0)) {
this->Symbols.insert(symbol);
}
}

View File

@ -12,3 +12,12 @@ void hello()
}
void Hello::operator delete[](void*){};
void Hello::operator delete(void*){};
#ifdef HELLO_VFTABLE
HelloVFTable::HelloVFTable()
{
}
HelloVFTable::~HelloVFTable()
{
}
#endif

View File

@ -16,3 +16,20 @@ public:
static void operator delete[](void*);
static void operator delete(void*);
};
// In the MSVC ABI, a delegating constructor references the vftable.
#if __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
# define HELLO_VFTABLE
#endif
#ifdef HELLO_VFTABLE
class HelloVFTable
{
public:
HelloVFTable();
HelloVFTable(int)
: HelloVFTable()
{
}
virtual ~HelloVFTable();
};
#endif

View File

@ -52,6 +52,9 @@ int main()
printf("\n");
#ifdef HAS_JUSTNOP
justnop();
#endif
#ifdef HELLO_VFTABLE
HelloVFTable helloVFTable(1);
#endif
return 0;
}