summaryrefslogtreecommitdiff
path: root/rts/linker/JitObjectCoff.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/linker/JitObjectCoff.c')
-rw-r--r--rts/linker/JitObjectCoff.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/rts/linker/JitObjectCoff.c b/rts/linker/JitObjectCoff.c
new file mode 100644
index 0000000000..77ce9fecc9
--- /dev/null
+++ b/rts/linker/JitObjectCoff.c
@@ -0,0 +1,47 @@
+#include "BufferBuilder.h"
+#include "JitObject.h"
+#include "LinkerInternals.h"
+#include "RtsUtils.h"
+
+struct BufferBuilder build_jit_object(ObjectCode *oc)
+{
+ struct BufferBuilder bb = buffer_builder_new(4096);
+
+ // COFF header
+ buffer_builder_uint16(&bb, IMAGE_FILE_MACHINE_AMD64);
+ buffer_builder_uint16(&bb, 1); // NumberOfSections
+ buffer_builder_uint32(&bb, 0); // TimeDateStamp
+ uint32_t *ptr_to_symbol_table = buffer_builder_uint32(&bb, 0); // PointerToSymbolTable
+ buffer_builder_uint32(&bb, n_syms); // NumberOfSymbols
+ buffer_builder_uint16(&bb, 0); // SizeOfOptionalHeader
+ buffer_builder_uint16(&bb, 0); // Characteristics
+
+ // Sections
+ buffer_builder_push(&bb, ".text\0\0\0", 8); // Name
+ buffer_builder_uint32(&bb, sect_sz); // VirtualSize
+ buffer_builder_uint32(&bb, sect_base); // VirtualAddress
+ buffer_builder_uint32(&bb, 0); // SizeOfRawData
+ buffer_builder_uint32(&bb, 0); // PointerToRawData
+ buffer_builder_uint32(&bb, 0); // PointerToRelocations
+ buffer_builder_uint32(&bb, 0); // PointerToLinenumbers
+ buffer_builder_uint16(&bb, 0); // NumberOfRelocations
+ buffer_builder_uint16(&bb, 0); // NumberOfLinenumbers
+ buffer_builder_uint32(&bb, 0); // Characteristics
+
+ struct BufferBuilder strings = buffer_builder_new(4096);
+ for (int i=0; i < oc->n_symbols; i++) {
+ Symbol_t *sym = &oc->symbols[i];
+ size_t offset = buffer_builder_filled_size(&strings);
+ buffer_builder_push(&strings, sym->name, strlen(sym->name));
+ buffer_builder_uint32(&bb, 0);
+ buffer_builder_uint32(&bb, offset); // RawName index
+ buffer_builder_uint32(&bb, value); // Value
+ buffer_builder_uint16(&bb, 1); // SectionNumber
+ buffer_builder_uint8(&bb, 0x20); // StorageClass
+ buffer_builder_uint8(&bb, 0); // NumberOfAuxSymbols
+ }
+
+ buffer_builder_append(&bb, strings);
+ return bb;
+}
+