#pragma once #include #include typedef enum { Profile_Linked, Profile_Shared, Profile_Kern, } Profile; static const char* profile_strs[] = { "linked", "shared", "kern" }; typedef struct { const char* output_file; int input_files; Profile profile; } Args; typedef struct { int argc; char** argv; int files; } FileIter; const char* file_iter_next(FileIter* iter); typedef struct { uint16_t offset; char* ident; } HeaderGlobalSym; typedef struct { uint16_t id; char* ident; } HeaderExternSym; typedef struct { uint16_t id; uint16_t offset; } HeaderExternRef; typedef struct { uint16_t header_size; uint16_t global_syms_size; HeaderGlobalSym* global_syms; uint16_t extern_syms_size; HeaderExternSym* extern_syms; uint16_t extern_refs_size; HeaderExternRef* extern_refs; uint16_t program_size; } Header; void header_destroy(Header* header); int header_read_from(Header* header, FILE* fp, const char* filename); void header_print(const Header* header); int link_kern(const Args* args, FileIter input_files);