diff options
| -rw-r--r-- | dev/CompilerKit/AE.h | 23 | ||||
| -rw-r--r-- | dev/CompilerKit/PEF.h | 14 | ||||
| -rw-r--r-- | dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc | 20 |
3 files changed, 33 insertions, 24 deletions
diff --git a/dev/CompilerKit/AE.h b/dev/CompilerKit/AE.h index 6561baf..1c334ad 100644 --- a/dev/CompilerKit/AE.h +++ b/dev/CompilerKit/AE.h @@ -11,8 +11,10 @@ #include <CompilerKit/Defines.h> -#define kAEMag0 'A' -#define kAEMag1 'E' +#define kAEVer (0x0120) + +#define kAEMag0 'O' +#define kAEMag1 'B' #define kAESymbolLen (255) #define kAEPad (8) @@ -31,14 +33,15 @@ namespace CompilerKit { // One thing to keep in mind. // This object format, is reloctable. typedef struct AEHeader final { - Char fMagic[kAEMagLen]; - Char fArch; - Char fSubArch; - SizeType fCount; - Char fSize; - SizeType fStartCode; - SizeType fCodeSize; - Char fPad[kAEPad]; + Char fMagic[kAEMagLen] = {}; + UInt16 fVersion{kAEVer}; + Char fArch{}; + Char fSubArch{}; + SizeType fCount{}; + Char fSize{}; + SizeType fStartCode{}; + SizeType fCodeSize{}; + Char fPad[kAEPad] = {}; } PACKED AEHeader, *AEHeaderPtr; // @brief Advanced Executable Record. diff --git a/dev/CompilerKit/PEF.h b/dev/CompilerKit/PEF.h index b3950c1..a997f17 100644 --- a/dev/CompilerKit/PEF.h +++ b/dev/CompilerKit/PEF.h @@ -29,6 +29,7 @@ #define kPefCode64 ".code64" #define kPefData64 ".data64" +/* @note counting the \0 at the end */ #define kPefMagicLen (5) #define kPefVersion (0x0500) @@ -36,9 +37,11 @@ #define kPefBaseOrigin (0x40000000) +/* @note this doesn't have to be __ImageStart only, any C initialization stub will do. */ #define kPefStart "__ImageStart" namespace CompilerKit { + /* @brief Architecture type. */ enum { kPefArchIntel86S, kPefArchAMD64, @@ -51,8 +54,9 @@ enum { kPefArchInvalid = 0xFF, }; + /* @brief Architecture vendor. */ enum { - kPefSubArchGeneric, + kPefSubArchGeneric = 0, kPefSubArchAMD = 200, kPefSubArchIntel, kPefSubArchARM, @@ -60,6 +64,7 @@ enum { }; enum { + kPefKindInvalid = 0, kPefKindExec = 1, /* .exec */ kPefKindDylib = 2, /* .dylib */ kPefKindObject = 4, /* .obj */ @@ -68,7 +73,7 @@ enum { kPefKindCount, }; -/* PEF container */ +/* PEF container information */ typedef struct PEFContainer final { Char Magic[kPefMagicLen]; UInt32 Linker; /* Linker used to link executable */ @@ -88,6 +93,7 @@ typedef struct PEFContainer final { /* PEF executable section and commands. */ + /* @brief Command Header, a la Mach-O, designed with FAT binaries and virtual memory in mind. */ typedef struct PEFCommandHeader final { Char Name[kPefNameLen]; /* container name */ UInt32 Cpu; /* container cpu */ @@ -96,8 +102,8 @@ typedef struct PEFCommandHeader final { UInt16 Kind; /* container kind */ UIntPtr Offset; /* File offset */ SizeType OffsetSize; - UIntPtr VMAddress; /* Virtual Address */ - SizeType Size; /* Virtual Size */ + UIntPtr VirtualAddress; /* Virtual Address */ + SizeType VirtualSize; /* Virtual Size */ } PACKED PEFCommandHeader, *PEFCommandHeaderPtr; enum { diff --git a/dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc b/dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc index cfd5079..04dda25 100644 --- a/dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc +++ b/dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc @@ -311,13 +311,13 @@ NECTI_MODULE(DynamicLinker64PEF) { ld_mark_header: command_header.Offset = offset_of_obj; command_header.Kind = ae_records[ae_record_index].fKind; - command_header.Size = ae_records[ae_record_index].fSize; + command_header.VirtualSize = ae_records[ae_record_index].fSize; command_header.Cpu = hdr.fArch; - command_header.VMAddress = org; + command_header.VirtualAddress = org; command_header.SubCpu = hdr.fSubArch; command_header.OffsetSize = ae_records[ae_record_index].fSize; - org += command_header.Size; + org += command_header.VirtualSize; if (kVerbose) { kConsoleOut << "Record: " << ae_records[ae_record_index].fName << " is marked.\n"; @@ -457,7 +457,7 @@ NECTI_MODULE(DynamicLinker64PEF) { date_cmd_hdr.Flags = 0; date_cmd_hdr.Kind = CompilerKit::kPefZero; date_cmd_hdr.Offset = output_fc.tellp(); - date_cmd_hdr.Size = timeStampStr.size(); + date_cmd_hdr.VirtualSize = timeStampStr.size(); command_headers.push_back(date_cmd_hdr); @@ -487,7 +487,7 @@ NECTI_MODULE(DynamicLinker64PEF) { std::memcpy(abi_cmd_hdr.Name, abi.c_str(), abi.size()); - abi_cmd_hdr.Size = abi.size(); + abi_cmd_hdr.VirtualSize = abi.size(); abi_cmd_hdr.Offset = output_fc.tellp(); abi_cmd_hdr.Flags = 0; abi_cmd_hdr.Kind = CompilerKit::kPefLinkerID; @@ -498,7 +498,7 @@ NECTI_MODULE(DynamicLinker64PEF) { stack_cmd_hdr.Cpu = kArch; stack_cmd_hdr.Flags = 0; - stack_cmd_hdr.Size = sizeof(uintptr_t); + stack_cmd_hdr.VirtualSize = sizeof(uintptr_t); stack_cmd_hdr.Offset = 0; std::memcpy(stack_cmd_hdr.Name, kLinkerStackSizeSymbol, strlen(kLinkerStackSizeSymbol)); @@ -521,7 +521,7 @@ NECTI_MODULE(DynamicLinker64PEF) { std::memcpy(uuid_cmd_hdr.Name, "Container:GUID:4:", strlen("Container:GUID:4:")); std::memcpy(uuid_cmd_hdr.Name + strlen("Container:GUID:4:"), uuidStr.c_str(), uuidStr.size()); - uuid_cmd_hdr.Size = strlen(uuid_cmd_hdr.Name); + uuid_cmd_hdr.VirtualSize = strlen(uuid_cmd_hdr.Name); uuid_cmd_hdr.Offset = output_fc.tellp(); uuid_cmd_hdr.Flags = CompilerKit::kPefLinkerID; uuid_cmd_hdr.Kind = CompilerKit::kPefZero; @@ -546,7 +546,7 @@ NECTI_MODULE(DynamicLinker64PEF) { std::memcpy(end_exec_hdr.Name, "Container:Exec:END", strlen("Container:Exec:END")); - end_exec_hdr.Size = strlen(end_exec_hdr.Name); + end_exec_hdr.VirtualSize = strlen(end_exec_hdr.Name); command_headers.push_back(end_exec_hdr); @@ -569,7 +569,7 @@ NECTI_MODULE(DynamicLinker64PEF) { } command_headers[commandHeaderIndex].Offset += previous_offset; - previous_offset += command_headers[commandHeaderIndex].Size; + previous_offset += command_headers[commandHeaderIndex].VirtualSize; CompilerKit::STLString name = command_headers[commandHeaderIndex].Name; @@ -589,7 +589,7 @@ NECTI_MODULE(DynamicLinker64PEF) { if (kVerbose) { kConsoleOut << "Command name: " << name << "\n"; - kConsoleOut << "VMAddress of command content: " << command_headers[commandHeaderIndex].Offset + kConsoleOut << "VirtualAddress of command content: " << command_headers[commandHeaderIndex].Offset << "\n"; } |
