NODE genLeaf(int op, int val, double rval, char *id) { NODE t; struct Symbol* s; if (id != NULL&&!findSymbol(id)) { FILE *txt; txt = fopen("outputParser.txt", "a"); fprintf(txt, "\nError at line %d: Undeclared identifier: %s", line_number, id); fclose(txt); PrintSymbolTable(); exit(1); } t = (NODE)malloc(sizeof(struct node)); t->num_val.val = val; t->op = op; if (id != NULL) t->name = id; else t->name = ""; t->s1 = NULL; t->s2 = NULL; t->s3 = NULL; t->children = 0; switch (op) { case IDE: t->type = findSymbol(id)->type; break; case INTCONST: t->type = INTEGER; t->num_val.val = val; break; case REALCONST: t->type = FLOAT; t->num_val.rval = rval; break; case TRUE: case FALSE: t->type = BOOLEAN; break; } return(t); }
// PassOne, should make sure pFile is valid int PassOne(FILE* pFile, MODULE_t ** pMT) { int result; result = ParseFile(pFile, pMT); if (result != 0) return -result; AddressCheck(*pMT); PrintSymbolTable(*pMT); return 0; }
int CoffLoader::ParseCoff(FILE *fp) { if ( !LoadCoffHModule(fp) ) { printf("Failed to load/find COFF hModule header\n"); return 0; } if ( !LoadSymTable(fp) || !LoadStringTable(fp) || !LoadSections(fp) ) return 0; PerformFixups(); #ifdef DUMPING_DATA PrintSymbolTable(); PrintStringTable(); #endif return 1; }
// Debug dump void CCOFF::Dump(int options) { uint32 i, j; if (options & DUMP_FILEHDR) { // File header printf("\nDump of PE/COFF file %s", FileName); printf("\n-----------------------------------------------"); printf("\nFile size: %i", GetDataSize()); printf("\nFile header:"); printf("\nMachine: %s", Lookup(COFFMachineNames,FileHeader->Machine)); printf("\nTimeDate: 0x%08X", FileHeader->TimeDateStamp); printf(" - %s", timestring(FileHeader->TimeDateStamp)); printf("\nNumber of sections: %2i", FileHeader->NumberOfSections); printf("\nNumber of symbols: %2i", FileHeader->NumberOfSymbols); printf("\nOptional header size: %i", FileHeader->SizeOfOptionalHeader); printf("\nFlags: 0x%04X", FileHeader->Flags); // May be removed: printf("\nSymbol table offset: %i", FileHeader->PSymbolTable); printf("\nString table offset: %i", FileHeader->PSymbolTable + FileHeader->NumberOfSymbols * SIZE_SCOFF_SymTableEntry); printf("\nSection headers offset: %i", (uint32)sizeof(SCOFF_FileHeader) + FileHeader->SizeOfOptionalHeader); // Optional header if (OptionalHeader) { printf("\n\nOptional header:"); if (OptionalHeader->h32.Magic != COFF_Magic_PE64) { // 32 bit optional header printf("\nMagic number: 0x%X", OptionalHeader->h32.Magic); printf("\nSize of code: 0x%X", OptionalHeader->h32.SizeOfCode); printf("\nSize of uninitialized data: 0x%X", OptionalHeader->h32.SizeOfInitializedData); printf("\nAddress of entry point: 0x%X", OptionalHeader->h32.AddressOfEntryPoint); printf("\nBase of code: 0x%X", OptionalHeader->h32.BaseOfCode); printf("\nBase of data: 0x%X", OptionalHeader->h32.BaseOfData); printf("\nImage base: 0x%X", OptionalHeader->h32.ImageBase); printf("\nSection alignment: 0x%X", OptionalHeader->h32.SectionAlignment); printf("\nFile alignment: 0x%X", OptionalHeader->h32.FileAlignment); printf("\nSize of image: 0x%X", OptionalHeader->h32.SizeOfImage); printf("\nSize of headers: 0x%X", OptionalHeader->h32.SizeOfHeaders); printf("\nDll characteristics: 0x%X", OptionalHeader->h32.DllCharacteristics); printf("\nSize of stack reserve: 0x%X", OptionalHeader->h32.SizeOfStackReserve); printf("\nSize of stack commit: 0x%X", OptionalHeader->h32.SizeOfStackCommit); printf("\nSize of heap reserve: 0x%X", OptionalHeader->h32.SizeOfHeapReserve); printf("\nSize of heap commit: 0x%X", OptionalHeader->h32.SizeOfHeapCommit); } else { // 64 bit optional header printf("\nMagic number: 0x%X", OptionalHeader->h64.Magic); printf("\nSize of code: 0x%X", OptionalHeader->h64.SizeOfCode); printf("\nSize of uninitialized data: 0x%X", OptionalHeader->h64.SizeOfInitializedData); printf("\nAddress of entry point: 0x%X", OptionalHeader->h64.AddressOfEntryPoint); printf("\nBase of code: 0x%X", OptionalHeader->h64.BaseOfCode); printf("\nImage base: 0x%08X%08X", HighDWord(OptionalHeader->h64.ImageBase), uint32(OptionalHeader->h64.ImageBase)); printf("\nSection alignment: 0x%X", OptionalHeader->h64.SectionAlignment); printf("\nFile alignment: 0x%X", OptionalHeader->h64.FileAlignment); printf("\nSize of image: 0x%X", OptionalHeader->h64.SizeOfImage); printf("\nSize of headers: 0x%X", OptionalHeader->h64.SizeOfHeaders); printf("\nDll characteristics: 0x%X", OptionalHeader->h64.DllCharacteristics); printf("\nSize of stack reserve: 0x%08X%08X", HighDWord(OptionalHeader->h64.SizeOfStackReserve), uint32(OptionalHeader->h64.SizeOfStackReserve)); printf("\nSize of stack commit: 0x%08X%08X", HighDWord(OptionalHeader->h64.SizeOfStackCommit), uint32(OptionalHeader->h64.SizeOfStackCommit)); printf("\nSize of heap reserve: 0x%08X%08X", HighDWord(OptionalHeader->h64.SizeOfHeapReserve), uint32(OptionalHeader->h64.SizeOfHeapReserve)); printf("\nSize of heap commit: 0x%08X%08X", HighDWord(OptionalHeader->h64.SizeOfHeapCommit), uint32(OptionalHeader->h64.SizeOfHeapCommit)); } // Data directories SCOFF_ImageDirAddress dir; for (i = 0; i < NumImageDirs; i++) { if (GetImageDir(i, &dir)) { printf("\nDirectory %2i, %s:\n Address 0x%04X, Size 0x%04X, Section %i, Offset 0x%04X", i, dir.Name, dir.VirtualAddress, dir.Size, dir.Section, dir.SectionOffset); } } } } if ((options & DUMP_STRINGTB) && FileHeader->PSymbolTable && StringTableSize > 4) { // String table char * p = StringTable + 4; uint32 nread = 4, len; printf("\n\nString table:"); while (nread < StringTableSize) { len = (int)strlen(p); if (len > 0) { printf("\n>>%s<<", p); nread += len + 1; p += len + 1; } } } // Symbol tables if (options & DUMP_SYMTAB) { // Symbol table (object file) if (NumberOfSymbols) PrintSymbolTable(-1); // Import and export tables (executable file) if (OptionalHeader) PrintImportExport(); } // Section headers if (options & (DUMP_SECTHDR | DUMP_SYMTAB | DUMP_RELTAB)) { for (j = 0; j < (uint32)NSections; j++) { SCOFF_SectionHeader * SectionHeader = &SectionHeaders[j]; printf("\n\n%2i Section %s", j+1, GetSectionName(SectionHeader->Name)); //printf("\nFile offset of header: 0x%X", (int)((int8*)SectionHeader-buffer)); printf("\nVirtual size: 0x%X", SectionHeader->VirtualSize); if (SectionHeader->VirtualAddress) { printf("\nVirtual address: 0x%X", SectionHeader->VirtualAddress);} if (SectionHeader->PRawData || SectionHeader->SizeOfRawData) { printf("\nSize of raw data: 0x%X", SectionHeader->SizeOfRawData); printf("\nRaw data pointer: 0x%X", SectionHeader->PRawData); } printf("\nCharacteristics: "); PrintSegmentCharacteristics(SectionHeader->Flags); // print relocations if ((options & DUMP_RELTAB) && SectionHeader->NRelocations > 0) { printf("\nRelocation entries: %i", SectionHeader->NRelocations); printf("\nRelocation entries pointer: 0x%X", SectionHeader->PRelocations); // Pointer to relocation entry union { SCOFF_Relocation * p; // pointer to record int8 * b; // used for address calculation and incrementing } Reloc; Reloc.b = Buf() + SectionHeader->PRelocations; printf("\nRelocations:"); for (i = 0; i < SectionHeader->NRelocations; i++) { printf("\nAddr: 0x%X, symi: %i, type: %s", Reloc.p->VirtualAddress, Reloc.p->SymbolTableIndex, (WordSize == 32) ? Lookup(COFF32RelNames,Reloc.p->Type) : Lookup(COFF64RelNames,Reloc.p->Type)); if (Reloc.p->Type < COFF32_RELOC_SEG12) { // Check if address is within file if (SectionHeader->PRawData + Reloc.p->VirtualAddress < GetDataSize()) { int32 addend = *(int32*)(Buf() + SectionHeader->PRawData + Reloc.p->VirtualAddress); if (addend) printf(", Implicit addend: %i", addend); } else { printf(". Error: Address is outside file"); } } PrintSymbolTable(Reloc.p->SymbolTableIndex); Reloc.b += SIZE_SCOFF_Relocation; // Next relocation record } } // print line numbers if (SectionHeader->NLineNumbers > 0) { printf("\nLine number entries: %i", SectionHeader->NLineNumbers); printf(" Line number pointer: %i\nLines:", SectionHeader->PLineNumbers); // Pointer to line number entry union { SCOFF_LineNumbers * p; // pointer to record int8 * b; // used for address calculation and incrementing } Linnum; Linnum.b = Buf() + SectionHeader->PLineNumbers; for (i = 0; i < SectionHeader->NLineNumbers; i++) { if (Linnum.p->Line) { // Record contains line number printf(" %i:%i", Linnum.p->Line, Linnum.p->Addr); } else { // Record contains function name } Linnum.b += SIZE_SCOFF_LineNumbers; // Next line number record } } } } }