kolibrios-fun/programs/develop/objconv/converters.h

530 lines
34 KiB
C
Raw Normal View History

/**************************** converters.h ********************************
* Author: Agner Fog
* Date created: 2006-07-15
* Last modified: 2008-05-25
* Project: objconv
* Module: converters.h
* Description:
* Header file for file conversion classes.
*
* Copyright 2006-2008 GNU General Public License http://www.gnu.org/licenses
*****************************************************************************/
/******************************* Classes ********************************
This header file declares various classes for interpreting and converting
different types of object files. These classes are all derived from the
container class CFileBuffer, declared in containers.h.
See containers.h for an explanation of the container classes and the
operators >> and << which can transfer a data buffer from an object of one
class to an object of another class.
*****************************************************************************/
#ifndef CONVERTERS_H
#define CONVERTERS_H
// Structure for string index entry in library
struct SStringEntry {
uint32 String; // Offset to string
uint32 Member; // Library member
};
// Class CResponseFileBuffer is used for storage of a command line response file
class CResponseFileBuffer : public CFileBuffer {
public:
CResponseFileBuffer(char const * filename); // Constructor
~CResponseFileBuffer(); // Destructor
CResponseFileBuffer * next; // Linked list if more than one buffer
};
// Class for deciding what to do with input file
// Its memory buffer contains the input file and later the output file
class CMain : public CFileBuffer {
public:
CMain(); // Constructor
void Go(); // Do whatever the command line parameters say
};
// Class CConverter is used for converting or dumping a file of any type
class CConverter : public CFileBuffer {
public:
CConverter(); // Constructor
void Go(); // Do whatever the command line parameters say
protected:
void DumpCOF(); // Dump PE/COFF file
void DumpELF(); // Dump ELF file
void DumpMACHO(); // Dump Mach-O file
void DumpOMF(); // Dump OMF file
void ParseMACUnivBin(); // Dump Mac universal binary
void COF2COF(); // Make changes in PE file
void COF2ELF(); // Convert PE/COFF to ELF file
void COF2OMF(); // Convert PE/COFF to OMF file
void ELF2ELF(); // Make changes in ELF file
void ELF2COF(); // Convert ELF to PE file
void ELF2MAC(); // Convert ELF to Mach-O file
void OMF2COF(); // Convert OMF file to PE/COFF
void COF2ASM(); // Disassemble PE/COFF file
void ELF2ASM(); // Disassemble ELF file
void MAC2ELF(); // Convert Mach-O file to ELF file
void MAC2MAC(); // Make changes in Mach-O file
void MAC2ASM(); // Disassemble Mach-O file
void OMF2ASM(); // Disassemble OMF file
};
// Class for interpreting and dumping PE/COFF files
class CCOFF : public CFileBuffer {
public:
CCOFF(); // Default constructor
void ParseFile(); // Parse file buffer
void Dump(int options); // Dump file
void PrintSymbolTable(int symnum); // Dump symbol table entries
void PrintImportExport(); // Print imported and exported symbols
static void PrintSegmentCharacteristics(uint32 flags); // Print segment characteristics
char const * GetSymbolName(int8* Symbol); // Get symbol name from 8 byte entry
char const * GetSectionName(int8* Symbol); // Get section name from 8 byte entry
const char * GetFileName(SCOFF_SymTableEntry *); // Get file name from records in symbol table
const char * GetShortFileName(SCOFF_SymTableEntry*);// Same as above. Strips path before filename
char const * GetStorageClassName(uint8 sc); // Get storage class name
void PublicNames(CMemoryBuffer * Strings, CSList<SStringEntry> * Index, int m); // Make list of public names
int GetImageDir(uint32 n, SCOFF_ImageDirAddress * dir); // Find address of image directory for executable files
protected:
CArrayBuf<SCOFF_SectionHeader> SectionHeaders;// Copy of section headers
int NSections; // Number of sections
SCOFF_FileHeader * FileHeader; // File header
SCOFF_SymTableEntry * SymbolTable; // Pointer to symbol table (for object files)
char * StringTable; // Pointer to string table (for object files)
uint32 StringTableSize; // Size of string table (for object files)
int NumberOfSymbols; // Number of symbol table entries (for object files)
uint64 ImageBase; // Image base (for executable files)
SCOFF_OptionalHeader * OptionalHeader; // Optional header (for executable files)
SCOFF_IMAGE_DATA_DIRECTORY * pImageDirs; // Pointer to image directories (for executable files)
uint32 NumImageDirs; // Number of image directories (for executable files)
uint32 EntryPoint; // Entry point (for executable files)
};
// Class for interpreting and dumping ELF files. Has templates for 32 and 64 bit version
template <class TFileHeader, class TSectionHeader, class TSymbol, class TRelocation>
class CELF : public CFileBuffer {
public:
CELF(); // Default constructor
void ParseFile(); // Parse file buffer
void Dump(int options); // Dump file
void PublicNames(CMemoryBuffer * Strings, CSList<SStringEntry> * Index, int m); // Make list of public names
protected:
const char * SymbolName(uint32 index); // Get name of symbol
TFileHeader FileHeader; // Copy of file header
char * SecStringTable; // Section header string table
uint32 SecStringTableLen; // Length of section header string table
uint32 NSections; // Number of sections
int SectionHeaderSize; // Size of each section header
CArrayBuf<TSectionHeader> SectionHeaders; // Copy of section headers
uint32 SymbolTableOffset; // Offset to symbol table
uint32 SymbolTableEntrySize; // Entry size of symbol table
uint32 SymbolTableEntries; // Number of symbols
uint32 SymbolStringTableOffset; // Offset to symbol string table
uint32 SymbolStringTableSize; // Size of symbol string table
};
// Class for interpreting and dumping Mach-O files
class COMF : public CFileBuffer {
public:
COMF(); // Default constructor
void ParseFile(); // Parse file buffer
void Dump(int options); // Dump file
void PublicNames(CMemoryBuffer * Strings, CSList<SStringEntry> * Index, int m); // Make list of public names
protected:
uint32 NumRecords; // Number of records
CSList<SOMFRecordPointer> Records; // Record pointers (List is 0-based)
CMemoryBuffer NameBuffer; // Store segment names and symbol names
CSList<uint32> LocalNameOffset; // Offset into NameBuffer of segment names by name index
CSList<uint32> SegmentNameOffset; // Offset into NameBuffer of segment names by segment index
CSList<uint32> SymbolNameOffset; // Offset into NameBuffer of external symbol names
CSList<uint32> GroupNameOffset; // Offset into NameBuffer of group names
char * GetLocalName(uint32 i); // Get segment name by name index
uint32 GetLocalNameO(uint32 i); // Get segment name by converting name index offset into NameBuffer
const char * GetSegmentName(uint32 i); // Get segment name by segment index
const char * GetSymbolName(uint32 i); // Get external symbol name
const char * GetGroupName(uint32 i); // Get group name by index
static const char * GetRecordTypeName(uint32 i);// Get OMF record type name
void DumpRecordTypes(); // Dump summary of records
void DumpNames(); // Dump local names records
void DumpSymbols(); // Dump public and external names records
void DumpSegments(); // Dump segment records
void DumpRelocations(); // Dump fixup records
void DumpComments(); // Dump coment records
};
// Class for interpreting and dumping Mach-O files. Has templates for 32 and 64 bit version
template <class TMAC_header, class TMAC_segment_command, class TMAC_section, class TMAC_nlist, class MInt>
class CMACHO : public CFileBuffer {
public:
CMACHO(); // Default constructor
void ParseFile(); // Parse file buffer
void Dump(int options); // Dump file
void PublicNames(CMemoryBuffer * Strings, CSList<SStringEntry> * Index, int m); // Make list of public names
protected:
TMAC_header FileHeader; // Copy of file header
uint64 ImageBase; // Image base for executable file
uint32 SegmentOffset; // File offset of segment
uint32 SegmentSize; // Size of segment
uint32 SectionHeaderOffset; // File offset of section headers
uint32 NumSections; // Number of sections
uint32 SymTabOffset; // File offset of symbol table
uint32 SymTabNumber; // Number of entries in symbol table
uint32 StringTabOffset; // File offset of string table
uint32 StringTabSize; // Size of string table
uint32 ilocalsym; // index to local symbols
uint32 nlocalsym; // number of local symbols
uint32 iextdefsym; // index to public symbols
uint32 nextdefsym; // number of public symbols
uint32 iundefsym; // index to external symbols
uint32 nundefsym; // number of external symbols
uint32 IndirectSymTabOffset; // file offset to the indirect symbol table
uint32 IndirectSymTabNumber; // number of indirect symbol table entries
};
// Class for parsing Macintosh universal binary
class CMACUNIV : public CFileBuffer {
public:
CMACUNIV(); // Default constructor
void Go(int options); // Apply command line options to all components
};
// class CCOF2ELF handles conversion from PE/COFF file to ELF file. Has templates for 32 and 64 bit version
template <class TELF_Header, class TELF_SectionHeader, class TELF_Symbol, class TELF_Relocation>
class CCOF2ELF : public CCOFF {
public:
CCOF2ELF(); // Constructor
void Convert(); // Do the conversion
protected:
void MakeSegments(); // Convert subfunction: Segments
void MakeSymbolTable(); // Convert subfunction: Symbol table and string tables
void MakeRelocationTables(); // Convert subfunction: Relocation tables
void MakeBinaryFile(); // Convert subfunction: Putting sections together
int symtab; // Symbol table section number
int shstrtab; // Section name string table section number
int strtab; // Object name string table section number
int stabstr; // Debug string table section number
int NumSectionsNew; // Number of sections generated for 'to' file
int MaxSectionsNew; // Number of section buffers allocated for 'to' file
CArrayBuf<CMemoryBuffer> NewSections; // Buffers for building each section
CArrayBuf<TELF_SectionHeader> NewSectionHeaders;// Buffer for temporary section headers
CArrayBuf<int> NewSectIndex; // Buffers for array of new section indices
CArrayBuf<int> NewSymbolIndex; // Buffers for array of new symbol indices
CFileBuffer ToFile; // File buffer for ELF file
TELF_Header NewFileHeader; // New file header
};
// class CCOF2OMF handles conversion from PE/COFF file to OMF file
class CCOF2OMF : public CCOFF {
public:
CCOF2OMF(); // Constructor
void Convert(); // Do the conversion
protected:
void MakeSegmentList(); // Make temporary segment conversion list
void MakeSymbolList(); // Make temporary symbol conversion list
void MakeRelocationsList(); // Make temporary list of relocations (fixups) and sort it
void MakeLNAMES(); // Make THEADR and LNAMES records
void MakeSEGDEF(); // Make SEGDEF and GRPDEF records
void MakeEXTDEF(); // Make EXTDEF records
void MakePUBDEF(); // Make PUBDEF records
void MakeLEDATA(); // Make LEDATA, LIDATA and FIXUPP records
void MakeMODEND(); // Make MODEND record and finish file
CArrayBuf<SOMFSegmentList> SectionBuffer; // Summarize old sections. Translate section index to segment index
CArrayBuf<SOMFSymbolList> SymbolBuffer; // Translate old symbol index to new public/external index
CSList<SOMFRelocation> RelocationBuffer; // Summarize and sort relocations
CMemoryBuffer NameBuffer; // Temporary storage of text strings
COMFFileBuilder ToFile; // File buffer for new OMF file
int NumSegments; // Number of segments in new file
int SectionBufferNum; // Number of entries in SectionBuffer
uint32 NumPublicSymbols; // Number of public symbols in new file
uint32 NumExternalSymbols; // Number of external symbols in new file
uint32 NumRelocations; // Number of entries in RelocationBuffer
};
// class COMF2COF handles conversion from OMF file to PE/COFF file
class COMF2COF : public COMF {
public:
COMF2COF(); // Constructor
void Convert(); // Do the conversion
protected:
// Convert subfunctions:
void MakeFileHeader(); // File header
void MakeSymbolTable1(); // Make symbol table and string table entries for file and segments
void MakeSymbolTable2(); // Make symbol table and string table entries for external symbols
void MakeSymbolTable3(); // Make symbol table and string table entries for public symbols
void MakeSymbolTable4(); // Make symbol table and string table entries for communal symbols
void MakeSymbolTable5(); // Make symbol table and string table entries for local symbols
void MakeSections(); // Make sections and relocation tables
void MakeBinaryFile(); // Putting sections together
void CheckUnsupportedRecords(); // Make warnings if file containes unsupported record types
int NumSectionsNew; // Number of sections in new file
CFileBuffer ToFile; // File buffer for PE/COFF file
CSList<SCOFF_SymTableEntry> NewSymbolTable; // New symbol table entries
CSList<SCOFF_SectionHeader> NewSectionHeaders;// New section headers
CMemoryBuffer NewStringTable; // Buffer for building new string table
CMemoryBuffer NewData; // Raw data for each section in new file and its relocation table
CSList<uint32> SegmentTranslation; // Translate old segment number to new symbol table index
CSList<uint32> ExtdefTranslation; // Translate old external symbol number to new symbol table index
CSList<SOMFLocalSymbol> LocalSymbols; // List for assigning names to unnamed local symbols
SCOFF_FileHeader NewFileHeader; // New file header
};
// class CELF2COF handles conversion from ELF file to PE/COFF file. Has templates for 32 and 64 bit version
template <class TELF_Header, class TELF_SectionHeader, class TELF_Symbol, class TELF_Relocation>
class CELF2COF : public CELF<ELFSTRUCTURES> {
public:
CELF2COF(); // Constructor
void Convert(); // Do the conversion
protected:
void MakeFileHeader(); // Convert subfunction: File header
void MakeSectionsIndex(); // Convert subfunction: Make section index translation table
void MakeSections(); // Convert subfunction: Make sections and relocation tables
void MakeSymbolTable(); // Convert subfunction: Symbol table and string tables
void HideUnusedSymbols(); // Convert subfunction: Hide unused symbols
void MakeBinaryFile(); // Convert subfunction: Putting sections together
int NumSectionsNew; // Number of sections in new file
CArrayBuf<int32> NewSectIndex; // Array of new section indices
CArrayBuf<int32> SymbolsUsed; // Array of new symbol indices
CSList<int32> NewSymbolIndex; // Buffer for array of new symbol indices
CMemoryBuffer NewSymbolTable; // Buffer for building new symbol table
CMemoryBuffer NewStringTable; // Buffer for building new string table
CMemoryBuffer NewRawData; // Buffer for building new raw data area
uint32 RawDataOffset; // File offset for raw data
CFileBuffer ToFile; // File buffer for PE/COFF file
SCOFF_FileHeader NewFileHeader; // New file header
};
// class CELF2MAC handles conversion from ELF file to Mach-O file
template <class TELF_Header, class TELF_SectionHeader, class TELF_Symbol, class TELF_Relocation,
class TMAC_header, class TMAC_segment_command, class TMAC_section, class TMAC_nlist, class MInt>
class CELF2MAC : public CELF<ELFSTRUCTURES> {
public:
CELF2MAC(); // Constructor
void Convert(); // Do the conversion
protected:
void MakeFileHeader(); // Convert subfunction: File header
void MakeSectionsIndex(); // Convert subfunction: Make section index translation table
void MakeSections(); // Convert subfunction: Make sections and relocation tables
void MakeSymbolTable(); // Convert subfunction: Symbol table and string tables
void FindUnusedSymbols(); // Convert subfunction: Check if symbols used, remove unused symbols
void MakeBinaryFile(); // Convert subfunction: Putting sections together
// Translate relocations, seperate function for 32 and 64 bits:
void Elf2MacRelocations(Elf32_Shdr &, MAC_section_32 &, uint32 NewRawDataOffset, uint32 oldsec);
void Elf2MacRelocations(Elf64_Shdr &, MAC_section_64 &, uint32 NewRawDataOffset, uint32 oldsec);
int GetImagebaseSymbol(); // Symbol table index of __mh_execute_header
CFileBuffer ToFile; // File buffer for new Mach-O file
CMemoryBuffer NewRawData; // Buffer for building new raw data area
CMemoryBuffer NewRelocationTab; // Buffer for new relocation tables
CMemoryBuffer NewStringTable; // Buffer for building new string table
CMemoryBuffer UnnamedSymbolsTable; // Buffer for assigning names to unnamed symbols
CArrayBuf<int> NewSectIndex; // Array of new section indices
CArrayBuf<MInt> NewSectOffset; // Array of new section offsets
CArrayBuf<int> OldSymbolScope; // Table of symbol bindings: 0 = local, 1 = public, 2 = external
CArrayBuf<int> OldSymbolUsed; // Check if symbol is used
MacSymbolTableBuilder<TMAC_nlist, MInt> NewSymTab[3]; // New symbol tables for local, public, external symbols
uint32 NumSymbols[4]; // Accumulated number of entries in each NewSymTab[]
uint32 NewSectHeadOffset; // File offset to first section header
uint32 NewSymtabOffset; // File offset to symtab command
int NumSectionsNew; // Number of sections in new file
uint32 RawDataOffset; // Offset to raw data in old file
uint32 NumOldSymbols; // Number of symbols in old file
uint32 CommandOffset; // Offset to first load command = segment header
};
// class MAC2ELF handles conversion from Mach-O file to ELF file
template <class TMAC_header, class TMAC_segment_command, class TMAC_section, class TMAC_nlist, class MInt,
class TELF_Header, class TELF_SectionHeader, class TELF_Symbol, class TELF_Relocation>
class CMAC2ELF : public CMACHO<MACSTRUCTURES> {
public:
CMAC2ELF(); // Constructor
void Convert(); // Do the conversion
protected:
void MakeSegments(); // Convert subfunction: Segments
void MakeSymbolTable(); // Convert subfunction: Symbol table and string tables
void MakeRelocationTables(MAC_header_32&); // Convert subfunction: Relocation tables, 32-bit version
void MakeRelocationTables(MAC_header_64&); // Convert subfunction: Relocation tables, 64-bit version
void MakeImportTables(); // Convert subfunction: Fill import tables
void MakeBinaryFile(); // Convert subfunction: Putting sections together
void TranslateAddress(MInt addr, uint32 & section, uint32 & offset); // Translate address to section + offset
uint32 MakeGOTEntry(int symbol); // Make entry in fake GOT for symbol
void MakeGOT(); // Make fake Global Offset Table
int symtab; // Symbol table section number
int shstrtab; // Section name string table section number
int strtab; // Object name string table section number
int stabstr; // Debug string table section number
uint32 NumSectionsNew; // Number of sections generated for 'to' file
uint32 MaxSectionsNew; // Number of section buffers allocated for 'to' file
uint32 HasGOT; // Contains references to global offset table
int FakeGOTSection; // Fake GOT section number
int FakeGOTSymbol; // Symbol index for fake GOT
TELF_Header NewFileHeader; // New file header
CArrayBuf<CMemoryBuffer> NewSections; // Buffers for building each section
CArrayBuf<TELF_SectionHeader> NewSectionHeaders;// Array of temporary section headers
CArrayBuf<int> NewSectIndex; // Array of new section indices
CArrayBuf<int> NewSymbolIndex; // Array of new symbol indices
CArrayBuf<int> SectionSymbols; // Array of new symbol indices for sections
CFileBuffer ToFile; // File buffer for ELF file
CSList<int> GOTSymbols; // List of symbols needing GOT entry
};
// class CCOF2COF handles symbol changes in a PE/COFF file
class CCOF2COF : public CCOFF {
public:
CCOF2COF(); // Constructor
void Convert(); // Do the conversion
protected:
void MakeSymbolTable(); // Convert subfunction: Symbol table and string tables
void MakeBinaryFile(); // Convert subfunction: Putting sections together
CMemoryBuffer NewSymbolTable; // Buffers for building new symbol table
CMemoryBuffer NewStringTable; // Buffers for building new string table
CFileBuffer ToFile; // File buffer for modified PE file
};
// class CELF2ELF handles symbol changes in ELF file. Has templates for 32 and 64 bit version
template <class TELF_Header, class TELF_SectionHeader, class TELF_Symbol, class TELF_Relocation>
class CELF2ELF : public CELF<ELFSTRUCTURES> {
public:
CELF2ELF(); // Constructor
void Convert(); // Do the conversion
protected:
void MakeSymbolTable(); // Convert subfunction: Symbol table and string tables
void ChangeSections(); // Convert subfunction: Change section names if needed
void MakeBinaryFile(); // Convert subfunction: Putting sections together
uint32 isymtab[2]; // static and dynamic symbol table section number
uint32 istrtab[4]; // string table section number: symbols, dynamic symbols, sections, debug
CMemoryBuffer NewSymbolTable[2]; // Buffers for building new symbol tables: static, dynamic
CMemoryBuffer NewStringTable[4]; // Buffers for building new string tables: symbols, dynamic symbols, sections, debug
CArrayBuf<uint32> NewSymbolIndex; // Array for translating old to new symbol indices
uint32 NumOldSymbols; // Size of NewSymbolIndex table
uint32 FirstGlobalSymbol; // Index to first global symbol in .symtab
CFileBuffer ToFile; // File buffer for modified PE file
};
// class CMAC2MAC handles symbol changes in Mach-O file. Has templates for 32 and 64 bit version
template <class TMAC_header, class TMAC_segment_command, class TMAC_section, class TMAC_nlist, class MInt>
class CMAC2MAC : public CMACHO<MACSTRUCTURES> {
public:
CMAC2MAC(); // Constructor
void Convert(); // Do the conversion
protected:
void MakeSymbolTable(); // Convert subfunction: Symbol table and string tables
void ChangeSegments(); // Convert subfunction: Change segment names if needed
void ChangeSections(uint32 HeaderOffset, uint32 Num);// Convert subfunction: Change section names and relocation records if needed
void ChangeImportTable(uint32 FileOffset, uint32 Num);// Convert subfunction: Change symbol indices in import table if needed
void MakeBinaryFile(); // Convert subfunction: Putting sections together
int NewSymbolIndex(int OldIndex); // Convert subfunction: Translate old to new symbol index
uint32 NewFileOffset(uint32 OldOffset); // Convert subfunction: Translate old to new file offset
MacSymbolTableBuilder<TMAC_nlist, MInt> NewSymbols[3];// Buffers for building new symbol tables: local, public, external
CMemoryBuffer NewSymbolTable; // Buffer for building new symbol table
CMemoryBuffer NewStringTable; // Buffer for building new string table
CFileBuffer ToFile; // File buffer for modified PE file
uint32 NumOldSymbols; // Size of NewSymbolIndex table
uint32 NewIlocalsym; // index to local symbols
uint32 NewNlocalsym; // number of local symbols
uint32 NewIextdefsym; // index to public symbols
uint32 NewNextdefsym; // number of public symbols
uint32 NewIundefsym; // index to external symbols
uint32 NewNundefsym; // number of external symbols
uint32 NewSymtabOffset; // Offset to new symbol table
uint32 NewStringtabOffset; // Offset to new string table
uint32 NewStringtabEnd; // Offset to end of new string table
uint32 OldTablesEnd; // End of old symbol table and string table
int32 SizeDifference; // Size of new file minus size of old file
};
// class CCOF2ASM handles disassembly of PE/COFF file
class CCOF2ASM : public CCOFF {
public:
CCOF2ASM(); // Constructor
void Convert(); // Do the conversion
protected:
CDisassembler Disasm; // Disassembler
void MakeSectionList(); // Make Sections list and Relocations list in Disasm
void MakeSymbolList(); // Make Symbols list in Disasm
void MakeDynamicRelocations(); // Make dynamic base relocations for executable files
void MakeImportList(); // Make imported symbols for executable files
void MakeExportList(); // Make exported symbols for executable files
void MakeListLabels(); // Attach names to all image directories
};
// class CELF2ASM handles disassembly of ELF file
template <class TELF_Header, class TELF_SectionHeader, class TELF_Symbol, class TELF_Relocation>
class CELF2ASM : public CELF<ELFSTRUCTURES> {
public:
CELF2ASM(); // Constructor
void Convert(); // Do the conversion
protected:
CDisassembler Disasm; // Disassembler
CArrayBuf<int32>SectionNumberTranslate; // Translate section numbers in source file to section numbers in asm file
CArrayBuf<uint32>SymbolTableOffset; // Addend to add to symbol number for each symbol table
int64 ImageBase; // Image base if executable file
uint32 ExeType; // File type: 0 = object, 1 = DLL/shared object, 2 = executable
uint32 NumSymbols; // Number of symbols defined
void FindImageBase(); // Find image base
void MakeSectionList(); // Make Sections list in Disasm
void MakeSymbolList(); // Make Symbols list in Disasm
void MakeRelocations(); // Make relocations for object and executable files
void MakeImportList(); // Make imported symbols for executable files
void MakeExportList(); // Make exported symbols for executable files
void MakeListLabels(); // Attach names to all image directories
};
// class CMAC2ASM handles disassembly of Mach-O file
template <class TMAC_header, class TMAC_segment_command, class TMAC_section, class TMAC_nlist, class MInt>
class CMAC2ASM : public CMACHO<MACSTRUCTURES> {
public:
CMAC2ASM(); // Constructor
void Convert(); // Do the conversion
protected:
void MakeSectionList(); // Make Sections list in Disasm
void MakeSymbolList(); // Make Symbols list in Disasm
void MakeRelocations(); // Make relocation list in Disasm
void MakeImports(); // Make symbol entries for imported symbols
CDisassembler Disasm; // Disassembler
CMemoryBuffer StringBuffer; // Buffer for making section names
CSList<MAC_SECT_WITH_RELOC> RelocationQueue; // List of relocation tables
CSList<TMAC_section*> ImportSections; // List of sections needing extra symbols: import tables, literals, etc.
};
// class COMF2ASM handles disassembly of OMF object files
class COMF2ASM : public COMF {
public:
COMF2ASM(); // Constructor
void Convert(); // Do the conversion
protected:
void CountSegments(); // Make temporary Segments table
void MakeExternalSymbolsTable(); // Make external symbols in Disasm
void MakePublicSymbolsTable(); // Make symbol table entries for public symbols
void MakeCommunalSymbolsTable(); // Make symbol table entries for communal symbols
void MakeGroupDefinitions(); // Make segment group definitions
void MakeSegmentList(); // Make Segments list in Disasm
void MakeRelocations(int32 Segment, uint32 RecNum, uint32 SOffset, uint32 RSize, uint8 * SData);// Make relocation list in Disasm
CDisassembler Disasm; // Disassembler
CSList<SOMFSegment> Segments; // Name, size, etc. of all segments
CSList<uint32> ExtdefTranslation; // Translate old external symbol number to disasm symbol table index
CSList<uint32> PubdefTranslation; // Translate old public symbol number to disasm symbol table index
CMemoryBuffer SegmentData; // Binary segment data
int32 NumSegments; // Number of segments
int32 FirstComDatSection; // First COMDAT section. All sections before this are SEGDEF segments
};
#endif // #ifndef CONVERTERS_H