jwasm/H/coffspec.h
2014-06-18 19:16:56 +04:00

289 lines
10 KiB
C

/* the MS COFF declarations, as far as it's relevant for JWasm.
* The full declarations can be found in MS PSDK, WinNT.h.
*/
/* Machine values */
#define IMAGE_FILE_MACHINE_I386 0x014c /* Intel 386 or later processors */
#define IMAGE_FILE_MACHINE_AMD64 0x8664 /* AMD64 (K8) */
/* Characteristics flags */
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // no relocations
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // is executable
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // no line number info
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // no local symbols
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // App can handle >2gb addresses
#define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.
struct IMAGE_FILE_HEADER {
uint_16 Machine;
uint_16 NumberOfSections;
uint_32 TimeDateStamp;
uint_32 PointerToSymbolTable;
uint_32 NumberOfSymbols;
uint_16 SizeOfOptionalHeader;
uint_16 Characteristics;
};
#define IMAGE_SIZEOF_SHORT_NAME 8
struct IMAGE_SECTION_HEADER {
char Name[IMAGE_SIZEOF_SHORT_NAME];
union {
uint_32 PhysicalAddress;
uint_32 VirtualSize;
} Misc;
uint_32 VirtualAddress;
uint_32 SizeOfRawData;
uint_32 PointerToRawData;
uint_32 PointerToRelocations;
uint_32 PointerToLinenumbers;
uint_16 NumberOfRelocations;
uint_16 NumberOfLinenumbers;
uint_32 Characteristics;
};
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
#define IMAGE_SCN_TYPE_REG 0
#define IMAGE_SCN_TYPE_DSECT 1
#define IMAGE_SCN_TYPE_NOLOAD 2
#define IMAGE_SCN_TYPE_GROUP 4
#define IMAGE_SCN_TYPE_NO_PAD 8
#define IMAGE_SCN_TYPE_COPY 16
#define IMAGE_SCN_CNT_CODE 0x00000020
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
#define IMAGE_SCN_LNK_OTHER 0x00000100
#define IMAGE_SCN_LNK_INFO 0x00000200
#define IMAGE_SCN_TYPE_OVER 0x00000400
#define IMAGE_SCN_LNK_REMOVE 0x00000800
#define IMAGE_SCN_LNK_COMDAT 0x00001000
#define IMAGE_SCN_GPREL 0x00008000 /* Valid only for IA64 */
#define IMAGE_SCN_MEM_FARDATA 0x00008000 /* Not in PECOFF v8 spec */
#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
#define IMAGE_SCN_MEM_16BIT 0x00020000
#define IMAGE_SCN_MEM_LOCKED 0x00040000
#define IMAGE_SCN_MEM_PRELOAD 0x00080000
#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
#define IMAGE_SCN_ALIGN_2BYTES 0x00200000
#define IMAGE_SCN_ALIGN_4BYTES 0x00300000
#define IMAGE_SCN_ALIGN_8BYTES 0x00400000
#define IMAGE_SCN_ALIGN_16BYTES 0x00500000
#define IMAGE_SCN_ALIGN_32BYTES 0x00600000
#define IMAGE_SCN_ALIGN_64BYTES 0x00700000
#define IMAGE_SCN_ALIGN_128BYTES 0x00800000
#define IMAGE_SCN_ALIGN_256BYTES 0x00900000
#define IMAGE_SCN_ALIGN_512BYTES 0x00a00000
#define IMAGE_SCN_ALIGN_1024BYTES 0x00b00000
#define IMAGE_SCN_ALIGN_2048BYTES 0x00c00000
#define IMAGE_SCN_ALIGN_4096BYTES 0x00d00000
#define IMAGE_SCN_ALIGN_8192BYTES 0x00e00000
#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
#define IMAGE_SCN_MEM_SHARED 0x10000000
#define IMAGE_SCN_MEM_EXECUTE 0x20000000
#define IMAGE_SCN_MEM_READ 0x40000000
#define IMAGE_SCN_MEM_WRITE 0x80000000
#pragma pack(push,2)
typedef struct _IMAGE_RELOCATION {
union {
uint_32 VirtualAddress;
uint_32 RelocCount;
};
uint_32 SymbolTableIndex;
uint_16 Type;
} IMAGE_RELOCATION;
#pragma pack(pop)
#define IMAGE_REL_I386_ABSOLUTE 0x0000 /* relocation is ignored */
#define IMAGE_REL_I386_DIR16 0x0001 /* 16bit VA */
#define IMAGE_REL_I386_REL16 0x0002 /* 16bit PC-relative offset */
#define IMAGE_REL_I386_DIR32 0x0006 /* 32bit VA */
#define IMAGE_REL_I386_DIR32NB 0x0007 /* 32bit RVA (IMAGEREL) */
#define IMAGE_REL_I386_SEG12 0x0009 /* ??? */
#define IMAGE_REL_I386_SECTION 0x000A /* 16bit section index */
#define IMAGE_REL_I386_SECREL 0x000B /* 32bit offset (SECTIONREL) */
#define IMAGE_REL_I386_TOKEN 0x000C /* CLR token */
#define IMAGE_REL_I386_SECREL7 0x000D /* 7bit offset */
#define IMAGE_REL_I386_REL32 0x0014 /* 32bit PC-relative offset */
// X86-64 relocations
#define IMAGE_REL_AMD64_ABSOLUTE 0x0000 /* Reference is absolute, no relocation is necessary */
#define IMAGE_REL_AMD64_ADDR64 0x0001 /* 64-bit address (VA).*/
#define IMAGE_REL_AMD64_ADDR32 0x0002 /* 32-bit address (VA).*/
#define IMAGE_REL_AMD64_ADDR32NB 0x0003 /* 32-bit address w/o image base (RVA).*/
#define IMAGE_REL_AMD64_REL32 0x0004 /* 32-bit relative address from byte following reloc */
#define IMAGE_REL_AMD64_REL32_1 0x0005 /* 32-bit relative address from byte distance 1 from reloc */
#define IMAGE_REL_AMD64_REL32_2 0x0006 /* 32-bit relative address from byte distance 2 from reloc */
#define IMAGE_REL_AMD64_REL32_3 0x0007 /* 32-bit relative address from byte distance 3 from reloc */
#define IMAGE_REL_AMD64_REL32_4 0x0008 /* 32-bit relative address from byte distance 4 from reloc */
#define IMAGE_REL_AMD64_REL32_5 0x0009 /* 32-bit relative address from byte distance 5 from reloc */
#define IMAGE_REL_AMD64_SECTION 0x000A /* Section index */
#define IMAGE_REL_AMD64_SECREL 0x000B /* 32 bit offset from base of section containing target */
#define IMAGE_REL_AMD64_SECREL7 0x000C /* 7 bit unsigned offset from base of section containing target */
#define IMAGE_REL_AMD64_TOKEN 0x000D /* 32 bit metadata token */
#define IMAGE_SIZEOF_SYMBOL 18
#define IMAGE_SIZEOF_AUX_SYMBOL 18
#pragma pack(push,2)
typedef struct _IMAGE_SYMBOL {
union {
/* v2.08 */
//char ShortName[8];
uint_8 ShortName[8];
struct {
uint_32 Short;
uint_32 Long;
} Name;
/* v2.07: don't use pointers in COFF structures! */
//unsigned char *LongName[2];
uint_32 LongName[2];
} N;
uint_32 Value;
uint_16 SectionNumber;
uint_16 Type;
uint_8 StorageClass;
uint_8 NumberOfAuxSymbols;
} IMAGE_SYMBOL;
/* special section numbers */
#define IMAGE_SYM_UNDEFINED 0
#define IMAGE_SYM_ABSOLUTE (-1)
#define IMAGE_SYM_DEBUG (-2)
#define IMAGE_SYM_TYPE_NULL 0
#define IMAGE_SYM_TYPE_VOID 1
#define IMAGE_SYM_TYPE_CHAR 2
#define IMAGE_SYM_TYPE_SHORT 3
#define IMAGE_SYM_TYPE_INT 4
#define IMAGE_SYM_TYPE_LONG 5
#define IMAGE_SYM_TYPE_FLOAT 6
#define IMAGE_SYM_TYPE_DOUBLE 7
#define IMAGE_SYM_TYPE_STRUCT 8
#define IMAGE_SYM_TYPE_UNION 9
#define IMAGE_SYM_TYPE_ENUM 10
#define IMAGE_SYM_TYPE_MOE 11
#define IMAGE_SYM_TYPE_BYTE 12
#define IMAGE_SYM_TYPE_WORD 13
#define IMAGE_SYM_TYPE_UINT 14
#define IMAGE_SYM_TYPE_DWORD 15
#define IMAGE_SYM_TYPE_PCODE 32768
#define IMAGE_SYM_DTYPE_NULL 0
#define IMAGE_SYM_DTYPE_POINTER 1
#define IMAGE_SYM_DTYPE_FUNCTION 2
#define IMAGE_SYM_DTYPE_ARRAY 3
/* StorageClass values */
#define IMAGE_SYM_CLASS_END_OF_FUNCTION (-1)
#define IMAGE_SYM_CLASS_NULL 0
#define IMAGE_SYM_CLASS_AUTOMATIC 1
#define IMAGE_SYM_CLASS_EXTERNAL 2
#define IMAGE_SYM_CLASS_STATIC 3
#define IMAGE_SYM_CLASS_REGISTER 4
#define IMAGE_SYM_CLASS_EXTERNAL_DEF 5
#define IMAGE_SYM_CLASS_LABEL 6
#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7
#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8
#define IMAGE_SYM_CLASS_ARGUMENT 9
#define IMAGE_SYM_CLASS_STRUCT_TAG 10
#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11
#define IMAGE_SYM_CLASS_UNION_TAG 12
#define IMAGE_SYM_CLASS_TYPE_DEFINITION 13
#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14
#define IMAGE_SYM_CLASS_ENUM_TAG 15
#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16
#define IMAGE_SYM_CLASS_REGISTER_PARAM 17
#define IMAGE_SYM_CLASS_BIT_FIELD 18
#define IMAGE_SYM_CLASS_FAR_EXTERNAL 68 /* Not in PECOFF v8 spec */
#define IMAGE_SYM_CLASS_BLOCK 100
#define IMAGE_SYM_CLASS_FUNCTION 101
#define IMAGE_SYM_CLASS_END_OF_STRUCT 102
#define IMAGE_SYM_CLASS_FILE 103
#define IMAGE_SYM_CLASS_SECTION 104
#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105
#define IMAGE_SYM_CLASS_CLR_TOKEN 107
/* values for IMAGE_AUX_SYMBOL.Section.Selection */
#define IMAGE_COMDAT_SELECT_NODUPLICATES 1
#define IMAGE_COMDAT_SELECT_ANY 2
#define IMAGE_COMDAT_SELECT_SAME_SIZE 3
#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
#define IMAGE_COMDAT_SELECT_LARGEST 6
#define IMAGE_COMDAT_SELECT_NEWEST 7
/* values for IMAGE_AUX_SYMBOL.Sym.Characteristics(=TotalSize) */
#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2
#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3
typedef union _IMAGE_AUX_SYMBOL {
/* AUX format 2: .bf and .ef entries */
struct {
uint_32 TagIndex;
union {
struct {
uint_16 Linenumber;
uint_16 Size;
} LnSz;
uint_32 TotalSize;
} Misc;
union {
struct {
uint_32 PointerToLinenumber;
uint_32 PointerToNextFunction;
} Function;
struct {
uint_16 Dimension[4];
} Array;
} FcnAry;
uint_16 TvIndex;
} Sym;
/* AUX format 4: file entries */
struct {
/* v2.08 */
//char Name[IMAGE_SIZEOF_SYMBOL];
uint_8 Name[IMAGE_SIZEOF_SYMBOL];
} File;
/* AUX format 5: section entries */
struct {
uint_32 Length;
uint_16 NumberOfRelocations;
uint_16 NumberOfLinenumbers;
uint_32 CheckSum;
uint_16 Number;
uint_8 Selection;
} Section;
} IMAGE_AUX_SYMBOL;
#pragma pack(pop)
typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
uint_32 NumberOfSymbols;
uint_32 LvaToFirstSymbol;
uint_32 NumberOfLinenumbers;
uint_32 LvaToFirstLinenumber;
uint_32 RvaToFirstByteOfCode;
uint_32 RvaToLastByteOfCode;
uint_32 RvaToFirstByteOfData;
uint_32 RvaToLastByteOfData;
} IMAGE_COFF_SYMBOLS_HEADER;
#pragma pack(push,2)
typedef struct _IMAGE_LINENUMBER {
union {
uint_32 SymbolTableIndex;
uint_32 VirtualAddress;
} Type;
uint_16 Linenumber;
} IMAGE_LINENUMBER;
#pragma pack(pop)