From df2c0f78100f8a6e780bdd730b91d9b703a49d95 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 8 Feb 2026 09:34:14 +0100 Subject: feat: Linker and assembler tweaks (WIP). Signed-off-by: Amlal El Mahrouss --- src/CompilerKit/ck-osx-san.json | 3 +- src/CompilerKit/ck-osx.json | 3 +- src/CompilerKit/ck-posix.json | 2 +- src/CompilerKit/src/Assemblers/Assembler+64x0.cc | 2 +- src/CompilerKit/src/Assemblers/Assembler+AMD64.cc | 27 ++++++++++------ src/CompilerKit/src/Assemblers/Assembler+ARM64.cc | 2 +- .../src/Linkers/DynamicLinker64+MachO.cc | 28 ++++++++--------- src/CompilerKit/src/Linkers/DynamicLinker64+PEF.cc | 36 +++++++++++----------- 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 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; } -- cgit v1.2.3