diff options
Diffstat (limited to 'rts/linker/JitObjectCoff.c')
| -rw-r--r-- | rts/linker/JitObjectCoff.c | 47 |
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; +} + |
