summaryrefslogtreecommitdiffhomepage
path: root/src/CompilerKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2026-02-08 09:34:14 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2026-02-08 09:34:14 +0100
commitdf2c0f78100f8a6e780bdd730b91d9b703a49d95 (patch)
treea82709c9f9ca533c6202d72cbff7d1fc721ab5ae /src/CompilerKit
parent7632cad62b4f8a89526d990e6bcaeb36a8e0aa2f (diff)
feat: Linker and assembler tweaks (WIP).
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/CompilerKit')
-rw-r--r--src/CompilerKit/ck-osx-san.json3
-rw-r--r--src/CompilerKit/ck-osx.json3
-rw-r--r--src/CompilerKit/ck-posix.json2
-rw-r--r--src/CompilerKit/src/Assemblers/Assembler+64x0.cc2
-rw-r--r--src/CompilerKit/src/Assemblers/Assembler+AMD64.cc27
-rw-r--r--src/CompilerKit/src/Assemblers/Assembler+ARM64.cc2
-rw-r--r--src/CompilerKit/src/Linkers/DynamicLinker64+MachO.cc28
-rw-r--r--src/CompilerKit/src/Linkers/DynamicLinker64+PEF.cc36
8 files changed, 57 insertions, 46 deletions
diff --git a/src/CompilerKit/ck-osx-san.json b/src/CompilerKit/ck-osx-san.json
index 754e5e2..bd4010b 100644
--- a/src/CompilerKit/ck-osx-san.json
+++ b/src/CompilerKit/ck-osx-san.json
@@ -26,5 +26,6 @@
"__NECTAR__=202505",
"CK_USE_STRUCTS=1",
"kDistReleaseBranch=$(git rev-parse --abbrev-ref HEAD)-$(uuidgen)"
- ]
+ ],
+ "description": "CompilerKit for OSX with Asan/Ubsan."
}
diff --git a/src/CompilerKit/ck-osx.json b/src/CompilerKit/ck-osx.json
index 6b84b89..88e6a5b 100644
--- a/src/CompilerKit/ck-osx.json
+++ b/src/CompilerKit/ck-osx.json
@@ -22,5 +22,6 @@
"CK_USE_STRUCTS=1",
"CK_USE_MACHO_LINKER=1",
"kDistReleaseBranch=$(git rev-parse --abbrev-ref HEAD)-$(uuidgen)"
- ]
+ ],
+ "description": "CompilerKit for OSX."
}
diff --git a/src/CompilerKit/ck-posix.json b/src/CompilerKit/ck-posix.json
index 4480a41..c8c561d 100644
--- a/src/CompilerKit/ck-posix.json
+++ b/src/CompilerKit/ck-posix.json
@@ -21,6 +21,6 @@
"CK_USE_STRUCTS=1",
"kDistReleaseBranch=$(git rev-parse --abbrev-ref HEAD)-$(uuidgen)"
],
- "run_after_build": true
+ "description": "CompilerKit for POSIX."
}
diff --git a/src/CompilerKit/src/Assemblers/Assembler+64x0.cc b/src/CompilerKit/src/Assemblers/Assembler+64x0.cc
index 5fa1344..bbb8447 100644
--- a/src/CompilerKit/src/Assemblers/Assembler+64x0.cc
+++ b/src/CompilerKit/src/Assemblers/Assembler+64x0.cc
@@ -272,7 +272,7 @@ static bool asm_read_attributes(std::string line) {
/// sanity check to avoid stupid linker errors.
if (name.size() == 0) {
- CompilerKit::Detail::print_error("Invalid extern_segment", "power-as");
+ CompilerKit::Detail::print_error("Invalid extern_segment", "Nectar");
throw std::runtime_error("invalid_extern_segment");
}
diff --git a/src/CompilerKit/src/Assemblers/Assembler+AMD64.cc b/src/CompilerKit/src/Assemblers/Assembler+AMD64.cc
index 6043026..e10d313 100644
--- a/src/CompilerKit/src/Assemblers/Assembler+AMD64.cc
+++ b/src/CompilerKit/src/Assemblers/Assembler+AMD64.cc
@@ -262,20 +262,20 @@ NECTAR_MODULE(AssemblerMainAMD64) {
++record_count;
for (auto& sym : kUndefinedSymbols) {
- CompilerKit::AERecordHeader _record_hdr{0};
+ CompilerKit::AERecordHeader undefined_sym{0};
if (kVerbose) kStdOut << "AssemblerAMD64: Wrote symbol " << sym << " to file...\n";
- _record_hdr.fKind = kAENullType;
- _record_hdr.fSize = sym.size();
- _record_hdr.fOffset = record_count;
+ undefined_sym.fKind = CompilerKit::kKindRelocationAtRuntime;
+ undefined_sym.fSize = sym.size();
+ undefined_sym.fOffset = record_count;
++record_count;
- memset(_record_hdr.fPad, kAENullType, kAEPad);
- memcpy(_record_hdr.fName, sym.c_str(), sym.size());
+ memset(undefined_sym.fPad, kAENullType, kAEPad);
+ memcpy(undefined_sym.fName, sym.c_str(), sym.size());
- file_ptr_out << _record_hdr;
+ file_ptr_out << undefined_sym;
++kCounter;
}
@@ -338,17 +338,19 @@ static bool asm_read_attributes(std::string line) {
auto name_pos = pos + strlen("extern_segment") + 1;
if (pos == std::string::npos || name_pos >= line.size()) {
- CompilerKit::Detail::print_error("Invalid extern_segment", "power-as");
+ CompilerKit::Detail::print_error("Invalid extern_segment", "Nectar");
throw std::runtime_error("invalid_extern_segment");
}
auto name = line.substr(name_pos);
if (name.size() == 0) {
- CompilerKit::Detail::print_error("Invalid extern_segment", "power-as");
+ CompilerKit::Detail::print_error("Invalid extern_segment", "Nectar");
throw std::runtime_error("invalid_extern_segment");
}
+ kUndefinedSymbols.push_back(name);
+
std::string result = std::to_string(name.size());
result += kUndefinedSymbol;
@@ -1758,11 +1760,18 @@ bool CompilerKit::EncoderAMD64::WriteLine(std::string line, std::string file) {
} else if (name == "jmp" || name == "call") {
kAppBytes.emplace_back(opcodeAMD64.fOpcode);
+ if (auto it = std::find(kUndefinedSymbols.begin(), kUndefinedSymbols.end(), name);
+ it != kUndefinedSymbols.end()) {
+ auto number_str = std::to_string(kOrigin + name.size());
+ this->WriteNumber(0, number_str);
+ }
+
if (kRegisterBitWidth == 64) {
this->WriteNumber(line.find(name) + name.size() + 1, line);
} else {
this->WriteNumber32(line.find(name) + name.size() + 1, line);
}
+
break;
}
diff --git a/src/CompilerKit/src/Assemblers/Assembler+ARM64.cc b/src/CompilerKit/src/Assemblers/Assembler+ARM64.cc
index 63076b1..fa41e6d 100644
--- a/src/CompilerKit/src/Assemblers/Assembler+ARM64.cc
+++ b/src/CompilerKit/src/Assemblers/Assembler+ARM64.cc
@@ -204,7 +204,7 @@ NECTAR_MODULE(AssemblerMainARM64) {
if (kVerbose) kStdOut << "AssemblerARM64: Wrote symbol " << sym << " to file...\n";
- undefined_sym.fKind = kAENullType;
+ undefined_sym.fKind = CompilerKit::kKindRelocationAtRuntime;
undefined_sym.fSize = sym.size();
undefined_sym.fOffset = record_count;
diff --git a/src/CompilerKit/src/Linkers/DynamicLinker64+MachO.cc b/src/CompilerKit/src/Linkers/DynamicLinker64+MachO.cc
index a7e48dd..c3bbd9e 100644
--- a/src/CompilerKit/src/Linkers/DynamicLinker64+MachO.cc
+++ b/src/CompilerKit/src/Linkers/DynamicLinker64+MachO.cc
@@ -39,7 +39,7 @@ static bool kDuplicateSymbols = false;
static bool kIsDylib = false;
static Int64 kMachODefaultStackSz = 0;
-static CompilerKit::STLString kLinkerStart = "__ImageStart";
+static CompilerKit::STLString kLinkerStart = "_main";
/* object code and list. */
static std::vector<CompilerKit::STLString> kObjectList;
@@ -130,33 +130,33 @@ NECTAR_MODULE(DynamicLinker64MachO) {
kConsoleOut << "-version: Show linker version.\n";
kConsoleOut << "-help: Show linker help.\n";
kConsoleOut << "-verbose: Enable linker trace.\n";
- kConsoleOut << "-dylib: Output as a Dynamic Library.\n";
- kConsoleOut << "-fat: Output as a FAT binary.\n";
- kConsoleOut << "-amd64: Output as an x86_64 Mach-O.\n";
- kConsoleOut << "-arm64: Output as an ARM64 Mach-O.\n";
+ kConsoleOut << "-fdylib: Output as a Dynamic Library.\n";
+ kConsoleOut << "-ffat: Output as a FAT binary.\n";
+ kConsoleOut << "-famd64: Output as an x86_64 Mach-O.\n";
+ kConsoleOut << "-farm64: Output as an ARM64 Mach-O.\n";
kConsoleOut << "-output: Select the output file name.\n";
- kConsoleOut << "-start: Specify entry point symbol.\n";
+ kConsoleOut << "-fstart: Specify entry point symbol.\n";
return NECTAR_SUCCESS;
} else if (std::strcmp(argv[linker_arg], "-version") == 0) {
kLinkerSplash();
return NECTAR_SUCCESS;
- } else if (std::strcmp(argv[linker_arg], "-fat") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-ffat") == 0) {
kFatBinaryEnable = true;
continue;
- } else if (std::strcmp(argv[linker_arg], "-amd64") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-famd64") == 0) {
kCpuType = CPU_TYPE_X86_64;
kCpuSubType = CPU_SUBTYPE_X86_64_ALL;
continue;
- } else if (std::strcmp(argv[linker_arg], "-arm64") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-farm64") == 0) {
kCpuType = CPU_TYPE_ARM64;
kCpuSubType = CPU_SUBTYPE_ARM64_ALL;
continue;
- } else if (std::strcmp(argv[linker_arg], "-start") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-fstart") == 0) {
if (argv[linker_arg + 1] == nullptr || argv[linker_arg + 1][0] == '-') continue;
kLinkerStart = argv[linker_arg + 1];
@@ -167,7 +167,7 @@ NECTAR_MODULE(DynamicLinker64MachO) {
kVerbose = true;
continue;
- } else if (std::strcmp(argv[linker_arg], "-dylib") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-fdylib") == 0) {
kIsDylib = true;
if (kOutput.find(kMachOExt) != CompilerKit::STLString::npos) {
@@ -271,7 +271,7 @@ NECTAR_MODULE(DynamicLinker64MachO) {
macho_add_symbol(symbolName, symType, sectNum, ae_records[ae_record_index].fOffset);
if (kVerbose) {
- kConsoleOut << "Added symbol: " << symbolName
+ kConsoleOut << "added symbol: " << symbolName
<< " at offset: " << ae_records[ae_record_index].fOffset << "\n";
}
}
@@ -286,7 +286,7 @@ NECTAR_MODULE(DynamicLinker64MachO) {
kStartFound = true;
if (kVerbose) {
- kConsoleOut << "Found entry point " << kLinkerStart << " at offset: " << entryIt->second
+ kConsoleOut << "found entry point " << kLinkerStart << " at offset: " << entryIt->second
<< "\n";
}
}
@@ -319,7 +319,7 @@ NECTAR_MODULE(DynamicLinker64MachO) {
// Check for entry point in executables
if (!kStartFound && !kIsDylib) {
- kConsoleOut << "Undefined entrypoint " << kLinkerStart << " for executable: " << kOutput
+ kConsoleOut << "undefined entrypoint " << kLinkerStart << " for executable: " << kOutput
<< "\n";
}
diff --git a/src/CompilerKit/src/Linkers/DynamicLinker64+PEF.cc b/src/CompilerKit/src/Linkers/DynamicLinker64+PEF.cc
index e076d10..5dddfb3 100644
--- a/src/CompilerKit/src/Linkers/DynamicLinker64+PEF.cc
+++ b/src/CompilerKit/src/Linkers/DynamicLinker64+PEF.cc
@@ -5,7 +5,7 @@
/// @author Amlal El Mahrouss (amlal@nekernel.org)
/// @brief NeKernel.org 64-bit PEF Linker.
-/// Last Rev: Sat Apr 19 CET 2025
+/// Last Rev: Sun Feb 8 CET 2026
/// @note Do not look up for anything with .code64/.data64/.zero64!
/// It will be loaded when the program loader will start the image.
@@ -82,14 +82,14 @@ NECTAR_MODULE(DynamicLinker64PEF) {
kConsoleOut << "-version: Show linker version.\n";
kConsoleOut << "-help: Show linker help.\n";
kConsoleOut << "-verbose: Enable linker trace.\n";
- kConsoleOut << "-dylib: Output as a Dynamic PEF.\n";
- kConsoleOut << "-fat: Output as a FAT PEF.\n";
- kConsoleOut << "-32k: Output as a 32x0 PEF.\n";
- kConsoleOut << "-64k: Output as a 64x0 PEF.\n";
- kConsoleOut << "-amd64: Output as a AMD64 PEF.\n";
- kConsoleOut << "-rv64: Output as a RISC-V PEF.\n";
- kConsoleOut << "-power64: Output as a POWER PEF.\n";
- kConsoleOut << "-arm64: Output as a ARM64 PEF.\n";
+ kConsoleOut << "-fdylib: Output as a Dynamic PEF.\n";
+ kConsoleOut << "-ffat: Output as a FAT PEF.\n";
+ kConsoleOut << "-f32k: Output as a 32x0 PEF.\n";
+ kConsoleOut << "-f64k: Output as a 64x0 PEF.\n";
+ kConsoleOut << "-famd64: Output as a AMD64 PEF.\n";
+ kConsoleOut << "-frv64: Output as a RISC-V PEF.\n";
+ kConsoleOut << "-fpower64: Output as a POWER PEF.\n";
+ kConsoleOut << "-farm64: Output as a ARM64 PEF.\n";
kConsoleOut << "-output: Select the output file name.\n";
return NECTAR_SUCCESS;
@@ -97,38 +97,38 @@ NECTAR_MODULE(DynamicLinker64PEF) {
kLinkerSplash();
return NECTAR_SUCCESS;
- } else if (std::strcmp(argv[linker_arg], "-fat") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-ffat") == 0) {
kFatBinaryEnable = true;
continue;
- } else if (std::strcmp(argv[linker_arg], "-64k") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-f64k") == 0) {
kArch = CompilerKit::kPefArch64000;
continue;
- } else if (std::strcmp(argv[linker_arg], "-amd64") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-famd64") == 0) {
kArch = CompilerKit::kPefArchAMD64;
continue;
- } else if (std::strcmp(argv[linker_arg], "-start") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-fstart") == 0) {
if (argv[linker_arg + 1] == nullptr || argv[linker_arg + 1][0] == '-') continue;
kLinkerStart = argv[linker_arg + 1];
linker_arg += 1;
continue;
- } else if (std::strcmp(argv[linker_arg], "-32k") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-f32k") == 0) {
kArch = CompilerKit::kPefArch32000;
continue;
- } else if (std::strcmp(argv[linker_arg], "-power64") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-fpower64") == 0) {
kArch = CompilerKit::kPefArchPowerPC;
continue;
- } else if (std::strcmp(argv[linker_arg], "-riscv64") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-friscv64") == 0) {
kArch = CompilerKit::kPefArchRISCV;
continue;
- } else if (std::strcmp(argv[linker_arg], "-arm64") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-farm64") == 0) {
kArch = CompilerKit::kPefArchARM64;
continue;
@@ -136,7 +136,7 @@ NECTAR_MODULE(DynamicLinker64PEF) {
kVerbose = true;
continue;
- } else if (std::strcmp(argv[linker_arg], "-dylib") == 0) {
+ } else if (std::strcmp(argv[linker_arg], "-fdylib") == 0) {
if (kOutput.empty()) {
continue;
}