From afb21342ead475a12636f29f7cd77cbe38d05ed1 Mon Sep 17 00:00:00 2001 From: Mikhail Paulyshka Date: Wed, 26 Apr 2017 00:37:37 +0300 Subject: bindexplib: fix constants symbols export --- Source/bindexplib.cxx | 32 +++++++++++++------------------- Tests/RunCMake/AutoExportDll/foo.c | 2 ++ Tests/RunCMake/AutoExportDll/say.cxx | 10 ++++++++++ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/Source/bindexplib.cxx b/Source/bindexplib.cxx index 6026a57..691e3ae 100644 --- a/Source/bindexplib.cxx +++ b/Source/bindexplib.cxx @@ -235,35 +235,29 @@ public: symbol.erase(posAt); } } - // For i386 builds we don't need to remove _ + // For i386 builds we need to remove _ if (this->IsI386 && symbol[0] == '_') { symbol.erase(0, 1); } - /* - Check whether it is "Scalar deleting destructor" and - "Vector deleting destructor" - */ + // Check whether it is "Scalar deleting destructor" and "Vector + // deleting destructor" + // if scalarPrefix and vectorPrefix are not found then print the + // symbol const char* scalarPrefix = "??_G"; const char* vectorPrefix = "??_E"; - // original code had a check for - // symbol.find("real@") == std::string::npos) - // but if this disallows memmber functions with the name real - // if scalarPrefix and vectorPrefix are not found then print - // the symbol if (symbol.compare(0, 4, scalarPrefix) && symbol.compare(0, 4, vectorPrefix)) { SectChar = this->SectionHeaders[pSymbolTable->SectionNumber - 1] .Characteristics; - if (!pSymbolTable->Type && (SectChar & IMAGE_SCN_MEM_WRITE)) { - // Read only (i.e. constants) must be excluded - this->DataSymbols.insert(symbol); - } else { - if (pSymbolTable->Type || !(SectChar & IMAGE_SCN_MEM_READ) || - (SectChar & IMAGE_SCN_MEM_EXECUTE)) { - this->Symbols.insert(symbol); - } else { - // printf(" strange symbol: %s \n",symbol.c_str()); + + if (SectChar & IMAGE_SCN_MEM_EXECUTE) { + this->Symbols.insert(symbol); + } else if (SectChar & IMAGE_SCN_MEM_READ) { + // skip __real@ and __xmm@ + if (symbol.find("_real") == std::string::npos && + symbol.find("_xmm") == std::string::npos) { + this->DataSymbols.insert(symbol); } } } diff --git a/Tests/RunCMake/AutoExportDll/foo.c b/Tests/RunCMake/AutoExportDll/foo.c index 4b1318b..e70fbb5 100644 --- a/Tests/RunCMake/AutoExportDll/foo.c +++ b/Tests/RunCMake/AutoExportDll/foo.c @@ -13,3 +13,5 @@ int bar() { return 5; } + +const char testconst[] = "testconst"; diff --git a/Tests/RunCMake/AutoExportDll/say.cxx b/Tests/RunCMake/AutoExportDll/say.cxx index 51060e8..eb9c0ff 100644 --- a/Tests/RunCMake/AutoExportDll/say.cxx +++ b/Tests/RunCMake/AutoExportDll/say.cxx @@ -13,6 +13,14 @@ int WINAPI foo(); int bar(); int objlib(); void justnop(); + +// test const export +#ifdef _WIN32 +// data symbols must be explicitly imported +__declspec(dllimport) extern const char testconst[]; +#else +extern const char testconst[]; +#endif } // test c++ functions @@ -43,6 +51,8 @@ int main() bar(); objlib(); printf("\n"); + printf("%s", testconst); + printf("\n"); #ifdef HAS_JUSTNOP justnop(); #endif -- cgit v0.12