58 lines
1.1 KiB
C
58 lines
1.1 KiB
C
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
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);
|