summaryrefslogtreecommitdiffhomepage
path: root/src/CompilerKit/AE.h
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-11-24 03:05:29 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2025-11-24 03:05:29 +0100
commitbbe2c77243c541ca7e0075149f5be3262eb89523 (patch)
treeae5d59d299344fd19584a2c3642bacd788e841d4 /src/CompilerKit/AE.h
parentb5adf16a96b9cbb80c74cf30404ed5bcff03ac34 (diff)
feat! breaking changes on necti sources.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/CompilerKit/AE.h')
-rw-r--r--src/CompilerKit/AE.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/CompilerKit/AE.h b/src/CompilerKit/AE.h
new file mode 100644
index 0000000..7b6d9b4
--- /dev/null
+++ b/src/CompilerKit/AE.h
@@ -0,0 +1,136 @@
+/*
+ * ========================================================
+ *
+ * CompilerKit
+ * Copyright (C) 2024-2025 Amlal El Mahrouss, Licensed under the Apache 2.0 license.
+ *
+ * ========================================================
+ */
+
+#ifndef _NECTI_AE_H_
+#define _NECTI_AE_H_
+
+#include <CompilerKit/Defines.h>
+
+#define kAEVer (0x0121)
+
+#define kAEMag0 'A'
+#define kAEMag1 'E'
+
+#define kAESymbolLen (255)
+#define kAEPad (8)
+#define kAEMagLen (2)
+#define kAENullType (0x00)
+
+/// @author Amlal El Mahrouss
+
+/// @brief
+// Advanced Executable File Format for ld64.
+// Reloctable by offset is the default strategy.
+// You can also relocate at runtime but that's up to the operating system loader.
+
+namespace CompilerKit {
+// @brief Advanced Executable Header
+// One thing to keep in mind.
+// This object format, is reloctable.
+typedef struct AEHeader final {
+ 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.
+// Could be data, code or bss.
+// fKind must be filled with PEF fields.
+
+typedef struct AERecordHeader final {
+ Char fName[kAESymbolLen];
+ SizeType fKind;
+ SizeType fSize;
+ SizeType fFlags;
+ UIntPtr fOffset;
+ Char fPad[kAEPad];
+} PACKED AERecordHeader, *AERecordHeaderPtr;
+
+enum {
+ kKindRelocationByOffset = 0x23f,
+ kKindRelocationAtRuntime = 0x34f,
+};
+} // namespace CompilerKit
+
+// provide operator<< for AE
+
+inline std::ofstream& operator<<(std::ofstream& fp, CompilerKit::AEHeader& container) {
+ fp.write((char*) &container, sizeof(CompilerKit::AEHeader));
+
+ return fp;
+}
+
+inline std::ofstream& operator<<(std::ofstream& fp, CompilerKit::AERecordHeader& container) {
+ fp.write((char*) &container, sizeof(CompilerKit::AERecordHeader));
+
+ return fp;
+}
+
+inline std::ifstream& operator>>(std::ifstream& fp, CompilerKit::AEHeader& container) {
+ fp.read((char*) &container, sizeof(CompilerKit::AEHeader));
+ return fp;
+}
+
+inline std::ifstream& operator>>(std::ifstream& fp, CompilerKit::AERecordHeader& container) {
+ fp.read((char*) &container, sizeof(CompilerKit::AERecordHeader));
+ return fp;
+}
+
+namespace CompilerKit::Utils {
+/**
+ * @brief AE Reader protocol
+ *
+ */
+class AEReadableProtocol final {
+ public:
+ std::ifstream file_pointer_;
+
+ public:
+ explicit AEReadableProtocol() = default;
+ ~AEReadableProtocol() = default;
+
+ NECTI_COPY_DELETE(AEReadableProtocol);
+
+ /**
+ * @brief Read AE Record headers.
+ *
+ * @param raw the containing buffer
+ * @param sz it's size (1 = one AERecordHeader, 2 two AERecordHeader(s))
+ * @return AERecordHeaderPtr
+ */
+ AERecordHeaderPtr Read(char* raw, std::size_t sz) {
+ if (!raw) return nullptr;
+
+ return this->Read_<AERecordHeader>(raw, sz * sizeof(AERecordHeader));
+ }
+
+ private:
+ /**
+ * @brief Implementation of Read for raw classes.
+ *
+ * @tparam TypeClass The class to read.
+ * @param raw the buffer
+ * @param sz the size
+ * @return TypeClass* the returning class.
+ */
+ template <typename TypeClass>
+ TypeClass* Read_(char* raw, std::size_t sz) {
+ file_pointer_.read(raw, std::streamsize(sz));
+ return reinterpret_cast<TypeClass*>(raw);
+ }
+};
+} // namespace CompilerKit::Utils
+
+#endif /* ifndef _NECTI_AE_H_ */ \ No newline at end of file