⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coff.h

📁 SimpleGraphicOperatingSystem 32位图形化操作系统 多进程 支持FAT32 详见www.sgos.net.cn
💻 H
字号:

#ifndef _COFF_H_
#define _COFF_H_



/* Coff Header */
typedef struct _FILEHDR{
  unsigned short usMagic;  // 魔法数字
  unsigned short usNumSec;  // 段落(Section)数
  unsigned long  ulTime;  // 时间戳
  unsigned long  ulSymbolOffset;  // 符号表偏移
  unsigned long  ulNumSymbol;  // 符号数
  unsigned short usOptHdrSZ;  // 可选头长度
  unsigned short usFlags;  // 文件标记
} FILEHDR, FileHeader, *pFileHeader;


#define F_RELFLG 0x0001   // 无重定位信息标记。
#define F_EXEC 0x0002   // 可执行标记
#define F_LNNO 0x0004   // 文件中所有行号已经被去掉
#define F_LSYMS 0x0008   // 文件中的符号信息已经被去掉。
#define F_AR32WR 0x0100   // 无

#define IS_OBJ( flag ) (!(flag&(F_EXEC|F_LSYMS)))
#define IS_EXE( flag ) ( flag&F_EXEC )

//可选头部
typedef struct _IMAGE_OPTIONAL_HEADER {
  // 标准域
  USHORT Magic;
  UCHAR MajorLinkerVersion;
  UCHAR MinorLinkerVersion;
  ULONG SizeOfCode;
  ULONG SizeOfInitializedData;
  ULONG SizeOfUninitializedData;
  ULONG AddressOfEntryPoint;
  ULONG BaseOfCode;
  ULONG BaseOfData;
  // NT附加域
  ULONG ImageBase;
  ULONG SectionAlignment;
  ULONG FileAlignment;
  USHORT MajorOperatingSystemVersion;
  USHORT MinorOperatingSystemVersion;
  USHORT MajorImageVersion;
  USHORT MinorImageVersion;
  USHORT MajorSubsystemVersion;
  USHORT MinorSubsystemVersion;
  ULONG Reserved1;
  ULONG SizeOfImage;
  ULONG SizeOfHeaders;
  ULONG CheckSum;
  USHORT Subsystem;
  USHORT DllCharacteristics;
  ULONG SizeOfStackReserve;
  ULONG SizeOfStackCommit;
  ULONG SizeOfHeapReserve;
  ULONG SizeOfHeapCommit;
  ULONG LoaderFlags;
  ULONG NumberOfRvaAndSizes;
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER, OptionalHeader, *POptionalHeader;


//Import dir entry
typedef struct ImageImportEntry{
	char 						Name;	//名
	unsigned char 	Flag;	//Public or Private loaded
	unsigned short 	FileVersion;	//
	unsigned long 	Address;	//load at this address
}ImportEntry, *PImportEntry;
//目录
typedef struct ImageDirecotry{
	unsigned char		Type;	//类型
	union{
		struct ImageImportEntry *ImportEntry;
	}e;
}ImageDir, *PImageDir;

typedef struct _SECHDR{
  char           cName[8];  // 段名
  unsigned long  ulVSize;  // 虚拟大小
  unsigned long  ulVAddr;  // 虚拟地址
  unsigned long  ulSize;  // 段长度
  unsigned long  ulSecOffset;  // 段数据偏移
  unsigned long  ulRelOffset;  // 段重定位表偏移
  unsigned long  ulLNOffset;  // 行号表偏移
  unsigned short ulNumRel;  // 重定位表长度
  unsigned short ulNumLN;  // 行号表长度
  unsigned long  ulFlags;  // 段标识
} SECHDR, SecHdr, *PSecHdr;

#define STYP_TEXT 0x0020   //正文段标识,说明该段是代码。
#define STYP_DATA 0x0040   //数据段标识,有些标识的段将用来保存已初始化数据。
#define STYP_BSS 0x0080   //有这个标识段也是用来保存数据,不过这里的数据是未初始化数据。

typedef struct __attribute__((packed)){
  unsigned long  ulAddr;  // 定位偏移
  unsigned long  ulSymbol;  // 符号
  unsigned short usType;  // 定位类型
} RELOC, Relocation, *PRelocation;
#define RELOC_ADDR32 6   //32位绝对定位
#define RELOC_REL32 0x14   //32位相对定位

typedef struct __attribute__((packed)){
  union {
    char cName[8];            // 符号名称
    struct {
      unsigned long ulZero;   // 字符串表标识
      unsigned long ulOffset; // 字符串偏移
    } e;
  } e;
  unsigned long ulValue;     // 符号值
  short iSection;            // 符号所在段
  unsigned short usType;     // 符号类型
  unsigned char usClass;     // 符号存储类型
  unsigned char usNumAux;    // 符号附加记录数
} SYMENT, SymbolEntry, *PSymbolEntry;

#define SYM_CLASS_NULL 0 //无存储类型。
#define SYM_CLASS_AUTOMATIC 1 //自动类型。通常是在栈中分配的变量。
#define SYM_CLASS_EXTERNAL 2 //外部符号。当为外部符号时,iSection的值应该为0,如果不为0,则ulValue为符号在段中的偏移。
#define SYM_CLASS_STATIC 3 //静态类型。ulValue为符号在段中的偏移。如果偏移为0,那么这个符号代表段名。。
#define SYM_CLASS_REGISTER 4 //寄存器变量。
#define SYM_CLASS_MEMBER_OF_STRUCT 8 //结构成员。ulValue值为该符号在结构中的顺序。
#define SYM_CLASS_STRUCT_TAG 10 //结构标识符。
#define SYM_CLASS_MEMBER_OF_UNION 11 //联合成员。ulValue值为该符号在联合中的顺序。
#define SYM_CLASS_UNION_TAG 12 //联合标识符。
#define SYM_CLASS_TYPE_DEFINITION 13 //类型定义。
#define SYM_CLASS_FUNCTION 101 //函数名。
#define SYM_CLASS_FILE 102 //文件名。


#endif //_COFF_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -