diff --git a/doc/object_format.md b/doc/object_format.md new file mode 100644 index 0000000..3b67110 --- /dev/null +++ b/doc/object_format.md @@ -0,0 +1,55 @@ +# Linker file format + +```C + +struct object_file { + uint64_t magic; // ".oo-bin" + uint64_t version; // 1 + uint64_t architecture; // AMD64(0) + uint64_t offsets_offset; + + struct offsets { + uint64_t strings; + uint64_t sections; + uint64_t symbols; + uint64_t relocations; + } offsets; + + struct string_table { + uint64_t size; + uint8_t data[static size]; + } strings; + + struct section_table { + uint32_t count; + struct section_entry { + uint32_t name; + uint64_t offset; + uint64_t size_on_disk; + uint64_t size_in_memory; + uint64_t flags; + } sections[static count]; + } sections; + + struct symbol_table { + uint32_t count; + struct symbol_entry { + uint32_t name; + uint8_t kind; // IMPORT(0) | EXPORT(1) | LOCAL(2) + uint32_t section; + uint64_t offset; + } symbols[static count]; + } symbols; + + struct relocation_table { + uint32_t count; + struct relocation_entry { + uint32_t section; + uint64_t offset; + uint8_t size; + uint32_t symbol; + uint8_t kind; // ABSOLUTE(0) | RELATIVE(1) + } relocations[static count]; + } relocations; +}; +```