bindexplib: clang-format

This commit is contained in:
Mikhail Paulyshka 2017-03-22 16:58:32 +03:00
parent 9a733c7bd6
commit 7a8860afbc
2 changed files with 277 additions and 280 deletions

View File

@ -17,5 +17,4 @@
/cmListFileLexer.c generated
# Do not format third-party sources.
/bindexplib.* -format.clang-format
/kwsys/** -format.clang-format

View File

@ -68,7 +68,8 @@
#include <iostream>
#include <windows.h>
typedef struct cmANON_OBJECT_HEADER_BIGOBJ {
typedef struct cmANON_OBJECT_HEADER_BIGOBJ
{
/* same as ANON_OBJECT_HEADER_V2 */
WORD Sig1; // Must be IMAGE_FILE_MACHINE_UNKNOWN
WORD Sig2; // Must be 0xffff
@ -87,10 +88,13 @@ typedef struct cmANON_OBJECT_HEADER_BIGOBJ {
DWORD NumberOfSymbols;
} cmANON_OBJECT_HEADER_BIGOBJ;
typedef struct _cmIMAGE_SYMBOL_EX {
union {
typedef struct _cmIMAGE_SYMBOL_EX
{
union
{
BYTE ShortName[8];
struct {
struct
{
DWORD Short; // if 0, use LongName
DWORD Long; // offset into string table
} Name;
@ -102,29 +106,28 @@ typedef struct _cmIMAGE_SYMBOL_EX {
BYTE StorageClass;
BYTE NumberOfAuxSymbols;
} cmIMAGE_SYMBOL_EX;
typedef cmIMAGE_SYMBOL_EX UNALIGNED *cmPIMAGE_SYMBOL_EX;
typedef cmIMAGE_SYMBOL_EX UNALIGNED* cmPIMAGE_SYMBOL_EX;
PIMAGE_SECTION_HEADER GetSectionHeaderOffset(PIMAGE_FILE_HEADER
pImageFileHeader)
PIMAGE_SECTION_HEADER GetSectionHeaderOffset(
PIMAGE_FILE_HEADER pImageFileHeader)
{
return (PIMAGE_SECTION_HEADER)
((DWORD_PTR)pImageFileHeader +
return (PIMAGE_SECTION_HEADER)((DWORD_PTR)pImageFileHeader +
IMAGE_SIZEOF_FILE_HEADER +
pImageFileHeader->SizeOfOptionalHeader);
}
PIMAGE_SECTION_HEADER GetSectionHeaderOffset(cmANON_OBJECT_HEADER_BIGOBJ*
pImageFileHeader)
PIMAGE_SECTION_HEADER GetSectionHeaderOffset(
cmANON_OBJECT_HEADER_BIGOBJ* pImageFileHeader)
{
return (PIMAGE_SECTION_HEADER)
((DWORD_PTR)pImageFileHeader +
return (PIMAGE_SECTION_HEADER)((DWORD_PTR)pImageFileHeader +
sizeof(cmANON_OBJECT_HEADER_BIGOBJ));
}
/*
+ * Utility func, strstr with size
+ */
const char* StrNStr(const char* start, const char* find, size_t &size) {
const char* StrNStr(const char* start, const char* find, size_t& size)
{
size_t len;
const char* hint;
@ -134,7 +137,7 @@ const char* StrNStr(const char* start, const char* find, size_t &size) {
}
len = strlen(find);
while ((hint = (const char*) memchr(start, find[0], size-len+1))) {
while ((hint = (const char*)memchr(start, find[0], size - len + 1))) {
size -= (hint - start);
if (!strncmp(hint, find, len))
return hint;
@ -162,18 +165,16 @@ public:
*----------------------------------------------------------------------
*/
DumpSymbols(ObjectHeaderType* ih,
std::set<std::string>& symbols,
std::set<std::string>& dataSymbols,
bool is64)
:Symbols(symbols), DataSymbols(dataSymbols)
DumpSymbols(ObjectHeaderType* ih, std::set<std::string>& symbols,
std::set<std::string>& dataSymbols, bool is64)
: Symbols(symbols)
, DataSymbols(dataSymbols)
{
this->ObjectImageHeader = ih;
this->SymbolTable = (SymbolTableType*)
((DWORD_PTR)this->ObjectImageHeader
+ this->ObjectImageHeader->PointerToSymbolTable);
this->SectionHeaders =
GetSectionHeaderOffset(this->ObjectImageHeader);
this->SymbolTable =
(SymbolTableType*)((DWORD_PTR) this->ObjectImageHeader +
this->ObjectImageHeader->PointerToSymbolTable);
this->SectionHeaders = GetSectionHeaderOffset(this->ObjectImageHeader);
this->SymbolCount = this->ObjectImageHeader->NumberOfSymbols;
this->Is64Bit = is64;
}
@ -187,40 +188,46 @@ public:
*----------------------------------------------------------------------
*/
bool HaveExportedObjects() {
bool HaveExportedObjects()
{
WORD i = 0;
size_t size = 0;
const char * rawdata = 0;
const char* rawdata = 0;
PIMAGE_SECTION_HEADER pDirectivesSectionHeader = 0;
PIMAGE_SECTION_HEADER pSectionHeaders = this->SectionHeaders;
for(i = 0; (i < this->ObjectImageHeader->NumberOfSections &&
!pDirectivesSectionHeader); i++)
if (!strncmp((const char*)&pSectionHeaders[i].Name[0], ".drectve",8))
for (i = 0; (i < this->ObjectImageHeader->NumberOfSections &&
!pDirectivesSectionHeader);
i++)
if (!strncmp((const char*)&pSectionHeaders[i].Name[0], ".drectve", 8))
pDirectivesSectionHeader = &pSectionHeaders[i];
if (!pDirectivesSectionHeader) return 0;
if (!pDirectivesSectionHeader)
return 0;
rawdata=(const char*)
this->ObjectImageHeader+pDirectivesSectionHeader->PointerToRawData;
if (!pDirectivesSectionHeader->PointerToRawData || !rawdata) return 0;
rawdata = (const char*)this->ObjectImageHeader +
pDirectivesSectionHeader->PointerToRawData;
if (!pDirectivesSectionHeader->PointerToRawData || !rawdata)
return 0;
size = pDirectivesSectionHeader->SizeOfRawData;
const char* posImportFlag = rawdata;
while ((posImportFlag = StrNStr(posImportFlag, " /EXPORT:", size))) {
const char* lookingForDict = posImportFlag + 9;
if (!strncmp(lookingForDict, "_G__cpp_",8) ||
!strncmp(lookingForDict, "_G__set_cpp_",12)) {
if (!strncmp(lookingForDict, "_G__cpp_", 8) ||
!strncmp(lookingForDict, "_G__set_cpp_", 12)) {
posImportFlag = lookingForDict;
continue;
}
const char* lookingForDATA = posImportFlag + 9;
while (*(++lookingForDATA) && *lookingForDATA != ' ');
while (*(++lookingForDATA) && *lookingForDATA != ' ')
;
lookingForDATA -= 5;
// ignore DATA exports
if (strncmp(lookingForDATA, ",DATA", 5)) break;
if (strncmp(lookingForDATA, ",DATA", 5))
break;
posImportFlag = lookingForDATA + 5;
}
if(posImportFlag) {
if (posImportFlag) {
return true;
}
return false;
@ -233,9 +240,7 @@ public:
* Dump an object file's exported symbols.
*----------------------------------------------------------------------
*/
void DumpObjFile() {
this->DumpExternalsObjects();
}
void DumpObjFile() { this->DumpExternalsObjects(); }
/*
*----------------------------------------------------------------------
@ -244,7 +249,8 @@ public:
* Dumps a COFF symbol table from an OBJ.
*----------------------------------------------------------------------
*/
void DumpExternalsObjects() {
void DumpExternalsObjects()
{
unsigned i;
PSTR stringTable;
std::string symbol;
@ -252,63 +258,59 @@ public:
/*
* The string table apparently starts right after the symbol table
*/
stringTable = (PSTR)&this->SymbolTable[this->SymbolCount];
stringTable = (PSTR) & this->SymbolTable[this->SymbolCount];
SymbolTableType* pSymbolTable = this->SymbolTable;
for ( i=0; i < this->SymbolCount; i++ ) {
for (i = 0; i < this->SymbolCount; i++) {
if (pSymbolTable->SectionNumber > 0 &&
( pSymbolTable->Type == 0x20 || pSymbolTable->Type == 0x0)) {
(pSymbolTable->Type == 0x20 || pSymbolTable->Type == 0x0)) {
if (pSymbolTable->StorageClass == IMAGE_SYM_CLASS_EXTERNAL) {
/*
* The name of the Function entry points
*/
if (pSymbolTable->N.Name.Short != 0) {
symbol = "";
symbol.insert(0, (const char *)pSymbolTable->N.ShortName, 8);
symbol.insert(0, (const char*)pSymbolTable->N.ShortName, 8);
} else {
symbol = stringTable + pSymbolTable->N.Name.Long;
}
// clear out any leading spaces
while (isspace(symbol[0])) symbol.erase(0,1);
while (isspace(symbol[0]))
symbol.erase(0, 1);
// if it starts with _ and has an @ then it is a __cdecl
// so remove the @ stuff for the export
if(symbol[0] == '_') {
if (symbol[0] == '_') {
std::string::size_type posAt = symbol.find('@');
if (posAt != std::string::npos) {
symbol.erase(posAt);
}
}
// For 64 bit builds we don't need to remove _
if(!this->Is64Bit)
{
if (symbol[0] == '_')
{
symbol.erase(0,1);
if (!this->Is64Bit) {
if (symbol[0] == '_') {
symbol.erase(0, 1);
}
}
/*
Check whether it is "Scalar deleting destructor" and
"Vector deleting destructor"
*/
const char *scalarPrefix = "??_G";
const char *vectorPrefix = "??_E";
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;
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) ||
if (pSymbolTable->Type || !(SectChar & IMAGE_SCN_MEM_READ) ||
(SectChar & IMAGE_SCN_MEM_EXECUTE)) {
this->Symbols.insert(symbol);
} else {
@ -317,16 +319,17 @@ public:
}
}
}
}
else if (pSymbolTable->SectionNumber == IMAGE_SYM_UNDEFINED &&
} else if (pSymbolTable->SectionNumber == IMAGE_SYM_UNDEFINED &&
!pSymbolTable->Type && 0) {
/*
* The IMPORT global variable entry points
*/
if (pSymbolTable->StorageClass == IMAGE_SYM_CLASS_EXTERNAL) {
symbol = stringTable + pSymbolTable->N.Name.Long;
while (isspace(symbol[0])) symbol.erase(0,1);
if (symbol[0] == '_') symbol.erase(0,1);
while (isspace(symbol[0]))
symbol.erase(0, 1);
if (symbol[0] == '_')
symbol.erase(0, 1);
this->DataSymbols.insert(symbol);
}
}
@ -339,6 +342,7 @@ public:
pSymbolTable++;
}
}
private:
std::set<std::string>& Symbols;
std::set<std::string>& DataSymbols;
@ -349,9 +353,7 @@ private:
bool Is64Bit;
};
bool
DumpFile(const char* filename,
std::set<std::string>& symbols,
bool DumpFile(const char* filename, std::set<std::string>& symbols,
std::set<std::string>& dataSymbols)
{
HANDLE hFile;
@ -359,9 +361,9 @@ DumpFile(const char* filename,
LPVOID lpFileBase;
PIMAGE_DOS_HEADER dosHeader;
hFile = CreateFileW(cmsys::Encoding::ToWide(filename).c_str(),
GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
hFile = CreateFileW(cmsys::Encoding::ToWide(filename).c_str(), GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE) {
fprintf(stderr, "Couldn't open file '%s' with CreateFile()\n", filename);
@ -389,28 +391,24 @@ DumpFile(const char* filename,
return false;
}
/* Does it look like a i386 COFF OBJ file??? */
else if (
((dosHeader->e_magic == IMAGE_FILE_MACHINE_I386) ||
(dosHeader->e_magic == IMAGE_FILE_MACHINE_AMD64))
&& (dosHeader->e_sp == 0)
) {
else if (((dosHeader->e_magic == IMAGE_FILE_MACHINE_I386) ||
(dosHeader->e_magic == IMAGE_FILE_MACHINE_AMD64)) &&
(dosHeader->e_sp == 0)) {
/*
* The two tests above aren't what they look like. They're
* really checking for IMAGE_FILE_HEADER.Machine == i386 (0x14C)
* and IMAGE_FILE_HEADER.SizeOfOptionalHeader == 0;
*/
DumpSymbols<IMAGE_FILE_HEADER, IMAGE_SYMBOL>
symbolDumper((PIMAGE_FILE_HEADER) lpFileBase, symbols, dataSymbols,
DumpSymbols<IMAGE_FILE_HEADER, IMAGE_SYMBOL> symbolDumper(
(PIMAGE_FILE_HEADER)lpFileBase, symbols, dataSymbols,
(dosHeader->e_magic == IMAGE_FILE_MACHINE_AMD64));
symbolDumper.DumpObjFile();
} else {
// check for /bigobj format
cmANON_OBJECT_HEADER_BIGOBJ* h =
(cmANON_OBJECT_HEADER_BIGOBJ*) lpFileBase;
if(h->Sig1 == 0x0 && h->Sig2 == 0xffff) {
DumpSymbols<cmANON_OBJECT_HEADER_BIGOBJ, cmIMAGE_SYMBOL_EX>
symbolDumper((cmANON_OBJECT_HEADER_BIGOBJ*) lpFileBase, symbols,
dataSymbols,
cmANON_OBJECT_HEADER_BIGOBJ* h = (cmANON_OBJECT_HEADER_BIGOBJ*)lpFileBase;
if (h->Sig1 == 0x0 && h->Sig2 == 0xffff) {
DumpSymbols<cmANON_OBJECT_HEADER_BIGOBJ, cmIMAGE_SYMBOL_EX> symbolDumper(
(cmANON_OBJECT_HEADER_BIGOBJ*)lpFileBase, symbols, dataSymbols,
(h->Machine == IMAGE_FILE_MACHINE_AMD64));
symbolDumper.DumpObjFile();
} else {
@ -439,15 +437,15 @@ bool bindexplib::AddDefinitionFile(const char* filename)
std::string str;
while (std::getline(infile, str)) {
// skip the LIBRAY and EXPORTS lines (if any)
if ((str.compare(0,7,"LIBRARY") == 0) ||
(str.compare(0,7,"EXPORTS") == 0)) {
if ((str.compare(0, 7, "LIBRARY") == 0) ||
(str.compare(0, 7, "EXPORTS") == 0)) {
continue;
}
// remove leading tabs & spaces
str.erase(0, str.find_first_not_of(" \t"));
std::size_t found = str.find(" \t DATA");
if (found != std::string::npos) {
str.erase (found, std::string::npos);
str.erase(found, std::string::npos);
this->DataSymbols.insert(str);
} else {
this->Symbols.insert(str);
@ -459,7 +457,7 @@ bool bindexplib::AddDefinitionFile(const char* filename)
void bindexplib::WriteFile(FILE* file)
{
fprintf(file,"EXPORTS \n");
fprintf(file, "EXPORTS \n");
for (std::set<std::string>::const_iterator i = this->DataSymbols.begin();
i != this->DataSymbols.end(); ++i) {
fprintf(file, "\t%s \t DATA\n", i->c_str());