summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dev/CompilerKit/AE.h23
-rw-r--r--dev/CompilerKit/PEF.h14
-rw-r--r--dev/CompilerKit/src/Linker/DynamicLinker64PEF.cc20
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";
}