The Pedigree Project 0.1
ModuleImage.h
1/* Copyright (c) 2026, Pedigree Developers. */
2#ifndef KERNEL_LINKER_MODULEIMAGE_H
3#define KERNEL_LINKER_MODULEIMAGE_H
4
5#include "pedigree/kernel/linker/Elf.h"
6
8class EXPORTED_PUBLIC ModuleImage {
9 public:
10 static constexpr size_t MaximumImageBytes = 1024 * 1024;
11 static constexpr size_t MaximumMappedBytes = 1024 * 1024;
12 static constexpr size_t MaximumSegments = 16;
13 static constexpr size_t MaximumSections = 256;
14 static constexpr size_t MaximumSymbols = 4096;
15 static constexpr size_t MaximumRelocations = 16384;
16 static constexpr size_t MaximumDependencies = 16;
17 static constexpr size_t MaximumLifecycleFunctions = 128;
18 static constexpr size_t NameBytes = 56;
19 static constexpr size_t SymbolNameBytes = 256;
20
21 enum class Result { Valid, Malformed, Unsupported, TooLarge };
27 using Dynamic = Elf::ElfDyn_t;
28
30 Result preflight(const uint8_t* image, size_t length);
31
32 bool symbol(size_t index, Symbol& result, bool dynamic = true) const;
33 const char* symbolName(const Symbol& value, bool dynamic = true) const;
34 bool findSymbol(const char* name, Symbol& result, bool dynamic = false) const;
35 bool relocation(size_t index, Relocation& result) const;
36 bool contains(uintptr_t address, size_t length, size_t flags = PF_R) const;
37 bool fileOffset(uintptr_t address, size_t length, size_t& offset) const;
38 bool localPointer(uintptr_t address, uintptr_t& target) const;
39 bool validateMaterialized(uintptr_t base) const;
40 bool exportedSymbol(size_t index, Symbol& result) const;
41
42 const uint8_t* bytes;
43 size_t byteCount;
44 Segment segments[MaximumSegments];
45 size_t segmentCount;
46 size_t mappedBytes;
47 size_t symbolCount;
48 size_t relocationCount;
49 char name[NameBytes];
50 char dependencies[MaximumDependencies][NameBytes];
51 size_t dependencyCount;
52 char optionalDependencies[MaximumDependencies][NameBytes];
53 size_t optionalDependencyCount;
54 uintptr_t entry;
55 uintptr_t exit;
56 uintptr_t constructors[MaximumLifecycleFunctions];
57 size_t constructorCount;
58 uintptr_t destructors[MaximumLifecycleFunctions];
59 size_t destructorCount;
60
61 private:
62 bool section(size_t index, Section& result) const;
63 bool string(size_t tableOffset, size_t tableBytes, size_t offset, const char*& result,
64 size_t maximum) const;
65 bool mappedString(uintptr_t address, const char*& result, size_t maximum) const;
66 bool namedObject(const char* name, size_t size, Symbol& result) const;
67 bool dependenciesAt(const char* symbolName, char names[][NameBytes], size_t& count,
68 bool optional) const;
69 bool lifecycle(const char* startName, const char* endName, uintptr_t* targets,
70 size_t& count) const;
71 Result validateSections(const Header& header);
72 Result validateDynamic();
73 Result validateRelocations();
74 Result validateMetadata();
75
76 size_t sectionOffset;
77 size_t sectionCount;
78 size_t sectionStrings;
79 size_t sectionStringBytes;
80 size_t dynamicOffset;
81 size_t dynamicBytes;
82 size_t symbols;
83 size_t symbolBytes;
84 size_t strings;
85 size_t stringBytes;
86 size_t fullSymbols;
87 size_t fullSymbolBytes;
88 size_t fullStrings;
89 size_t fullStringBytes;
90 size_t relocations;
91 size_t relocationBytes;
92 uintptr_t symbolAddress;
93 uintptr_t stringAddress;
94 uintptr_t relocationAddress;
95 uintptr_t constructorAddress;
96 size_t constructorBytes;
97 uintptr_t destructorAddress;
98 size_t destructorBytes;
99};
100
101#endif