mpir/yasm/tools/xdf/xdf.h

129 lines
3.5 KiB
C

/* XDF - Extended Dynamic Object Format */
/* Version 2.0 */
/* $Id: xdf.h 2027 2008-01-19 08:30:21Z peter $ */
/* 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 */