forked from KolibriOS/kolibrios
530 lines
34 KiB
C
530 lines
34 KiB
C
|
/**************************** 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
|