| /* XDF - Extended Dynamic Object Format */ |
| /* Version 2.0 */ |
| /* $Id$ */ |
| |
| /* FILE HEADER */ |
| /* SECTION HEADERS [] */ |
| /* SYMBOL TABLE [] */ |
| /* STRINGS */ |
| /* */ |
| /* SECTION DATA */ |
| /* SECTION REL [] */ |
| /* */ |
| /* SECTION DATA */ |
| /* SECTION REL [] */ |
| /* */ |
| /* ... */ |
| |
| #ifndef XDF_H_INCLUDED |
| #define XDF_H_INCLUDED |
| |
| #include <stdint.h> |
| |
| typedef uint8_t u8; |
| typedef uint16_t u16; |
| typedef uint32_t u32; |
| typedef uint64_t u64; |
| |
| typedef enum { |
| |
| XDF_MAGIC = 0x87654322 |
| |
| } xdf_magic; |
| |
| |
| typedef enum { |
| |
| XDF_SECT_ABSOLUTE = 0x01, /* Segment has an absolute offset */ |
| XDF_SECT_FLAT = 0x02, /* Data displacements relative to 0, otherwise relative to segment */ |
| XDF_SECT_BSS = 0x04, /* Segment has no data */ |
| |
| XDF_SECT_USE_16 = 0x10, |
| XDF_SECT_USE_32 = 0x20, |
| XDF_SECT_USE_64 = 0x40, |
| |
| } xdf_sect_flags; |
| |
| typedef enum { |
| |
| XDF_SYM_EXTERN = 1, /* External Symbol */ |
| XDF_SYM_GLOBAL = 2, /* Global Symbol */ |
| XDF_SYM_EQU = 4, /* EQUate Symbol (value, not address) */ |
| |
| } xdf_sym_flags; |
| |
| typedef enum { |
| |
| XDF_RELOC_REL = 1, /* DISP = ADDRESS - SEGMENT (Relative to a segment) */ |
| XDF_RELOC_WRT = 2, /* DISP = ADDRESS - SYMBOL (Relative to a symbol) */ |
| XDF_RELOC_RIP = 4, /* DISP = ADDRESS - RIP - RELOC_SIZE (Relative to end of an instruction) */ |
| XDF_RELOC_SEG = 8, /* DISP = SEGMENT/SELECTOR OF SYMBOL (Not symbol itself, but which segment it's in) */ |
| |
| } xdf_rtype; |
| |
| typedef enum { |
| |
| XDF_RELOC_8 = 1, |
| XDF_RELOC_16 = 2, |
| XDF_RELOC_32 = 4, |
| XDF_RELOC_64 = 8, |
| |
| } xdf_rsize; |
| |
| |
| typedef struct { /* 16 bytes */ |
| |
| u32 f_magic; /* magic number */ |
| u32 f_nsect; /* number of sections */ |
| u32 f_nsyms; /* number of symtab entries */ |
| u32 f_size; /* size of sect headers + symbol table + strings */ |
| |
| } FILE_HEADER; |
| |
| #define FILE_HEADER_SIZE (4+4+4+4) |
| |
| typedef struct { /* 40 bytes */ |
| |
| u32 s_name_idx; /* section name in symtab */ |
| u64 s_addr; /* physical address */ |
| u64 s_vaddr; /* virtual address */ |
| u16 s_align; /* section alignment (0 ... 4096) */ |
| u16 s_flags; /* flags */ |
| |
| u32 s_data_off; /* file offset to section data */ |
| u32 s_data_size; /* section data size */ |
| u32 s_reltab_off; /* file offset to relocation table */ |
| u32 s_num_reloc; /* number of relocations entries */ |
| |
| } SECTION_HEADER; |
| |
| #define SECTION_HEADER_SIZE (4+8+8+2+2+4+4+4+4) |
| |
| typedef struct { /* 16 bytes */ |
| |
| u32 e_sect_idx; /* section index to which symbol belongs (-1 = EXTERN) */ |
| u32 e_sect_off; /* symbol offset into section data */ |
| u32 e_name_off; /* file offset to null terminated strings */ |
| u32 e_flags; /* EXTERN, GLOBAL */ |
| |
| } SYMBOL_ENTRY; |
| |
| #define SYMBOL_ENTRY_SIZE (4+4+4+4) |
| |
| typedef struct { /* 16 bytes */ |
| |
| u32 r_off; /* offset into current section */ |
| u32 r_targ_idx; /* target symbol */ |
| u32 r_base_idx; /* base symbol if WRT */ |
| u8 r_type; /* type of relocation (ABS,SEG,RIP,WRT) */ |
| u8 r_size; /* size of relocation (1,2,4,8) */ |
| u8 r_shift; /* relocation shift (0,4,8,16,24,32) */ |
| u8 r_flags; |
| |
| } RELOCATION_ENTRY; |
| |
| |
| #endif /* XDF_H_INCLUDED */ |
| |
| |