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

📄 binimg.h

📁 OXCC is a multipass, interpreting C compiler with several language extensions. It generates an Archi
💻 H
📖 第 1 页 / 共 4 页
字号:
/* binimg.h -- defs for a.out+coff+elf+pe+exe+ne+le+omf formats */

#ifndef __GNUC__
#pragma pack(1)
#define __attribute__()
#endif

/* ****************** MAGIC NUMBERS ************************ */
#define OBJMAGIC 0x80   /* omf THEADR record type, first byte */
#define LIBMAGIC 0xF0   /* omf LIBR first byte */
#define ARMAGIC  0x3c21 /* !< beginning of unix style archive */
#define OMAGIC   0x0107	/* a.out object file 0407 */
#define NMAGIC   0x0108	/* a.out pure executable 0410 */
#define ZMAGIC   0x010b	/* a.out demand paged executable 0413 */
#define IMAGIC   0x014c	/* coff header f_magic for i386 */
#define AIXMAGIC 0x0175	/* coff header f_magic for aix i386 */
#define MIBMAGIC 0x0162 /* coff header f_magic for mips big endian R3000 */
#define MI3MAGIC 0x0162 /* coff header f_magic for mips little endian R3000 */
#define MI4MAGIC 0x0166 /* coff header f_magic for mips little endian R4000 */
#define MI1MAGIC 0x0166 /* coff header f_magic for mips little endian R10000 */
#define AL1MAGIC 0x0184 /* coff header f_magic for Alpha AXP */
#define AL2MAGIC 0x0186 /* coff header f_magic for Alpha APX */
#define M68MAGIC 0x0268 /* coff header f_magic for M68000 series */
#define PPCMAGIC 0x01f0 /* coff header f_magic for PowerPC little endian */
#define PAMAGIC  0x0290 /* coff header f_magic for HP PA RISC */
#define DOSMAGIC 0x5A4D	/* MZ start of .exe files */
#define NEMAGIC  0x454E	/* NE os2,win31 16bit */
#define LEMAGIC  0x454C /* LE os2,vxd 32 bit */
#define PEMAGIC  0x4550 /* PE nt,win95,win32s */
#define NTMAGIC  0x010b /* NT OPTIONAL HEADER */
#define ROMMAGIC 0x0107 /* NT ROM OPTIONAL HEADER */
#define OPOMAGIC 0x0104 /* coff optional header object file, as output */
#define OPZMAGIC 0x010b /* coff optional header demand load format, ld output */
#define OPTMAGIC 0x0101 /* coff optional header target shared library */
#define OPHMAGIC 0x0123 /* coff optional header host shared library */
#define ELFMAGIC 0x457f /* beginning of elf ident "\177ELF" */

/* ********************* FILE HEADERS *************************** */

#define NEW_EXECUTABLE(ptr) (ptr->e_lfarlc >= 0x0040)

typedef struct {      /* DOS .EXE header */
    unsigned short   e_magic;       /* 00 Magic number */
    unsigned short   e_cblp;        /* 02 Bytes on last page of file */
    unsigned short   e_cp;          /* 04 Pages in file */
    unsigned short   e_crlc;        /* 06 Relocations */
    unsigned short   e_cparhdr;     /* 08 Size of header in paragraphs */
    unsigned short   e_minalloc;    /* 0A Minimum extra paragraphs needed */
    unsigned short   e_maxalloc;    /* 0C Maximum extra paragraphs needed */
    unsigned short   e_ss;          /* 0E Initial (relative) SS value */
    unsigned short   e_sp;          /* 10 Initial SP value */
    unsigned short   e_csum;        /* 12 Checksum */
    unsigned short   e_ip;          /* 14 Initial IP value */
    unsigned short   e_cs;          /* 16 Initial (relative) CS value */
    unsigned short   e_lfarlc;      /* 18 File address of relocation table */
    unsigned short   e_ovno;        /* 1A Overlay number */
    unsigned short   e_res[4];      /* 1C Reserved words */
    unsigned short   e_oemid;       /* 24 OEM identifier (for e_oeminfo) */
    unsigned short   e_oeminfo;     /* 26 OEM information; e_oemid specific */
    unsigned short   e_res2[10];    /* 28 Reserved words */
    long   e_lfanew __attribute__((packed));  /* 3C File address of new exe header */
  } DOS_HDR, *PDOS_HDR;

typedef struct {      /* OS/2 .EXE header */
    unsigned short   ne_magic;     /* Magic number */
    char   ne_ver;                 /* Version number */
    char   ne_rev;                 /* Revision number */
    unsigned short   ne_enttab __attribute__((packed));/* Offset of Entry Table */
    unsigned short   ne_cbenttab;  /* Number of bytes in Entry Table */
    long   ne_crc __attribute__((packed)); /* Checksum of whole file */
    unsigned short   ne_flags;     /* Flag word */
    unsigned short   ne_autodata;  /* Automatic data segment number */
    unsigned short   ne_heap;      /* Initial heap allocation */
    unsigned short   ne_stack;     /* Initial stack allocation */
    long   ne_csip __attribute__((packed)); /* Initial CS:IP setting */
    long   ne_sssp;                /* Initial SS:SP setting */
    unsigned short   ne_cseg;      /* Count of file segments */
    unsigned short   ne_cmod;      /* Entries in Module Reference Table */
    unsigned short   ne_cbnrestab; /* Size of non-resident name table */
    unsigned short   ne_segtab;    /* Offset of Segment Table */
    unsigned short   ne_rsrctab;   /* Offset of Resource Table */
    unsigned short   ne_restab;    /* Offset of resident name table */
    unsigned short   ne_modtab;    /* Offset of Module Reference Table */
    unsigned short   ne_imptab;    /* Offset of Imported Names Table */
    long   ne_nrestab __attribute__((packed)); /* Offset of Non-resident Names Table */
    unsigned short   ne_cmovent;   /* Count of movable entries */
    unsigned short   ne_align;     /* Segment alignment shift count */
    unsigned short   ne_cres;      /* Count of resource segments */
    unsigned char   ne_exetyp;     /* Target Operating system */
    unsigned char   ne_flagsothers; /* Other .EXE flags */
    unsigned short   ne_pretthunks __attribute__((packed)); /* offset to return thunks */
    unsigned short   ne_psegrefbytes; /* offset to segment ref. bytes */
    unsigned short   ne_swaparea;     /* Minimum code swap area size */
    unsigned short   ne_expver;       /* Expected Windows version number */
  } OS2_HDR, *POS2_HDR;

typedef struct {      /* WIN31 .EXE header */
    unsigned short   ne_magic;     /* Magic number */
    char   ne_ver;                 /* Version number */
    char   ne_rev;                 /* Revision number */
    unsigned short   ne_enttab __attribute__((packed));/* Offset of Entry Table */
    unsigned short   ne_cbenttab;  /* Number of bytes in Entry Table */
    long   ne_crc __attribute__((packed)); /* Checksum of whole file */
    unsigned short   ne_flags;     /* Flag word */
    unsigned short   ne_autodata;  /* Automatic data segment number */
    unsigned short   ne_heap;      /* Initial heap allocation */
    unsigned short   ne_stack;     /* Initial stack allocation */
    long   ne_csip __attribute__((packed)); /* Initial CS:IP setting */
    long   ne_sssp;                /* Initial SS:SP setting */
    unsigned short   ne_cseg;      /* Count of file segments */
    unsigned short   ne_cmod;      /* Entries in Module Reference Table */
    unsigned short   ne_cbnrestab; /* Size of non-resident name table */
    unsigned short   ne_segtab;    /* Offset of Segment Table */
    unsigned short   ne_rsrctab;   /* Offset of Resource Table */
    unsigned short   ne_restab;    /* Offset of resident name table */
    unsigned short   ne_modtab;    /* Offset of Module Reference Table */
    unsigned short   ne_imptab;    /* Offset of Imported Names Table */
    long   ne_nrestab __attribute__((packed)); /* Offset of Non-resident Names Table */
    unsigned short   ne_cmovent;   /* Count of movable entries */
    unsigned short   ne_align;     /* Segment alignment shift count */
    unsigned short   ne_cres;      /* Count of resource segments */
    unsigned char   ne_exetyp;     /* Target Operating system */
    unsigned char   ne_flagsothers; /* Other .EXE flags */
    unsigned short   ne_fastload __attribute__((packed)); /* ofs in sectors to fast load area */
    unsigned short   ne_fastsize; /* size in sectors of fast load area */
    unsigned short   ne_swaparea;     /* reserved */
    unsigned short   ne_expver;       /* Expected Windows version number */
  } WIN31_HDR, *PWIN31_HDR;

typedef struct {      /* Windows VXD header */
    unsigned short   e32_magic;       /* Magic number */
    unsigned char   e32_border;       /* The byte ordering for the VXD */
    unsigned char   e32_worder;       /* The word ordering for the VXD */
    unsigned long  e32_level __attribute__((packed));/* The EXE format level for now = 0 */
    unsigned short   e32_cpu;         /* The CPU type */
    unsigned short   e32_os;          /* The OS type */
    unsigned long  e32_ver __attribute__((packed)); /* Module version */
    unsigned long  e32_mflags;        /* Module flags */
    unsigned long  e32_mpages;        /* Module # pages */
    unsigned long  e32_startobj;      /* Object # for instruction pointer */
    unsigned long  e32_eip;           /* Extended instruction pointer */
    unsigned long  e32_stackobj;      /* Object # for stack pointer */
    unsigned long  e32_esp;           /* Extended stack pointer */
    unsigned long  e32_pagesize;      /* VXD page size */
    unsigned long  e32_lastpagesize;  /* Last page size in VXD */
    unsigned long  e32_fixupsize;     /* Fixup section size */
    unsigned long  e32_fixupsum;      /* Fixup section checksum */
    unsigned long  e32_ldrsize;       /* Loader section size */
    unsigned long  e32_ldrsum;        /* Loader section checksum */
    unsigned long  e32_objtab;        /* Object table offset */
    unsigned long  e32_objcnt;        /* Number of objects in module */
    unsigned long  e32_objmap;        /* Object page map offset */
    unsigned long  e32_itermap;       /* Object iterated data map offset */
    unsigned long  e32_rsrctab;       /* Offset of Resource Table */
    unsigned long  e32_rsrccnt;       /* Number of resource entries */
    unsigned long  e32_restab;        /* Offset of resident name table */
    unsigned long  e32_enttab;        /* Offset of Entry Table */
    unsigned long  e32_dirtab;        /* Offset of Module Directive Table */
    unsigned long  e32_dircnt;        /* Number of module directives */
    unsigned long  e32_fpagetab;      /* Offset of Fixup Page Table */
    unsigned long  e32_frectab;       /* Offset of Fixup Record Table */
    unsigned long  e32_impmod;        /* Offset of Import Module Name Table */
    unsigned long  e32_impmodcnt;     /* Number of entries in Import Module Name Table */
    unsigned long  e32_impproc;       /* Offset of Import Procedure Name Table */
    unsigned long  e32_pagesum;       /* Offset of Per-Page Checksum Table */
    unsigned long  e32_datapage;      /* Offset of Enumerated Data Pages */
    unsigned long  e32_preload;       /* Number of preload pages */
    unsigned long  e32_nrestab;       /* Offset of Non-resident Names Table */
    unsigned long  e32_cbnrestab;     /* Size of Non-resident Name Table */
    unsigned long  e32_nressum;       /* Non-resident Name Table Checksum */
    unsigned long  e32_autodata;      /* Object # for automatic data object */
    unsigned long  e32_debuginfo;     /* Offset of the debugging information */
    unsigned long  e32_debuglen;      /* The length of the debugging info. in bytes */
    unsigned long  e32_instpreload;   /* Number of instance pages in preload section of VXD file */
    unsigned long  e32_instdemand;    /* Number of instance pages in demand load section of VXD file */
    unsigned long  e32_heapsize;      /* Size of heap - for 16-bit apps */
    unsigned char   e32_res3[12];     /* Reserved words */
    unsigned long  e32_winresoff __attribute__((packed));
    unsigned long  e32_winreslen;
    unsigned short   e32_devid;       /* Device ID for VxD */
    unsigned short   e32_ddkver;      /* DDK version for VxD */
  } VXD_HDR, *PVXD_HDR;

typedef struct exec
{
  short a_magic;     /* a magic number */
  short a_whocares;	 /* machtype and flags, set to zero */
  unsigned a_text __attribute__((packed));   /* length of text, in bytes */
  unsigned a_data;   /* length of data, in bytes */
  unsigned a_bss;    /* length of uninitialized data area for file, in bytes */
  unsigned a_syms;   /* length of symbol table data in file, in bytes */
  unsigned a_entry;  /* start address */
  unsigned a_trsize; /* length of relocation info for text, in bytes */
  unsigned a_drsize; /* length of relocation info for data, in bytes */
} EXEC_HDR, *PEXEC_HDR;

typedef struct {
	unsigned short f_magic;		/* magic number, machine type		*/
	unsigned short f_nscns;		/* number of sections		*/
	unsigned long f_timdat __attribute__((packed));	/* time & date stamp */
	unsigned long f_symptr;		/* file pointer to symtab	*/
	unsigned long f_nsyms;		/* number of symtab entries	*/
	unsigned short f_opthdr;	/* sizeof(optional hdr)		*/
	unsigned short f_flags;		/* flags			*/
} COFF_HDR, *PCOFF_HDR;


/* Bits for f_flags:
 *	F_RELFLG	relocation info stripped from file
 *	F_EXEC		file is executable (no unresolved external references)
 *	F_LINNO		line numbers stripped from file
 *	F_LSYMS		local symbols stripped from file
 *  F_MINIMAL	minimal object, reserved NT
 *  F_UPDATE	update object, reserved NT
 *	F_16BIT		16 bit machine, reserved NT
 *	F_LILEND	file has little endian byte ordering
 *	F_32BIT		32 bit machine
 *	F_DEBUG		debug info stripped
 *  F_PATCH		reserved NT
 *	F_SYSTEM	system file, not a user pgm NT
 *	F_DLL		dynamic link library, NT
 *	F_BIGEND	file has big endian byte ordering
 */

#define F_RELFLG		(0x0001)
#define COFF_F_RELFLG	(0x0001)
#define F_EXEC			(0x0002)
#define COFF_F_EXEC		(0x0002)
#define F_LINNO			(0x0004)
#define COFF_F_LINNO	(0x0004)
#define F_LSYMS			(0x0008)
#define COFF_F_LSYMS	(0x0008)
#define F_MINIMAL		(0x0010)
#define COFF_F_MINMAL	(0x0020)
#define F_UPDATE		(0x0020)
#define COFF_F_UPDATE	(0x0040)
#define F_16BIT			(0x0040)
#define F_LILEND		(0x0080)
#define F_32BIT			(0x0100)
#define COFF_F_SWABD	(0x0100)
#define F_DEBUG			(0x0200)
#define COFF_F_AR16WR	(0x0200)
#define F_PATCH			(0x0400)
#define COFF_F_AR32WR	(0x0400)
#define F_SYSTEM		(0x1000)
#define COFF_F_AR32W	(0x1000)
#define F_DLL			(0x2000)
#define COFF_F_PATCH	(0x2000)
#define COFF_F_NODF		(0x2000)
#define F_BIGEND		(0x8000)

/*
 * These defines are byte order independent. There is no alignment of fields
 * permitted in the structures. Therefore they are declared as characters
 * and the values loaded from the character positions. It also makes it
 * nice to have it "endian" independent.
 */
 
/* Load a short int from the following tables with little-endian formats */
#define COFF_SHORT_L(ps) ((short)(((unsigned short)((unsigned char)ps[1])<<8)|\
				  ((unsigned short)((unsigned char)ps[0]))))

/* Load a long int from the following tables with little-endian formats */
#define COFF_LONG_L(ps) (((long)(((unsigned long)((unsigned char)ps[3])<<24) |\
				 ((unsigned long)((unsigned char)ps[2])<<16) |\
				 ((unsigned long)((unsigned char)ps[1])<<8)  |\
				 ((unsigned long)((unsigned char)ps[0])))))
 
/* Load a short int from the following tables with big-endian formats */
#define COFF_SHORT_H(ps) ((short)(((unsigned short)((unsigned char)ps[0])<<8)|\
				  ((unsigned short)((unsigned char)ps[1]))))

/* Load a long int from the following tables with big-endian formats */
#define COFF_LONG_H(ps) (((long)(((unsigned long)((unsigned char)ps[0])<<24) |\
				 ((unsigned long)((unsigned char)ps[1])<<16) |\
				 ((unsigned long)((unsigned char)ps[2])<<8)  |\
				 ((unsigned long)((unsigned char)ps[3])))))

/* These may be overridden later by brain dead implementations which generate
   a big-endian header with little-endian data. In that case, generate a
   replacement macro which tests a flag and uses either of the two above
   as appropriate. */

#define COFF_LONG(v)   COFF_LONG_L(v)
#define COFF_SHORT(v)  COFF_SHORT_L(v)

/* linux style info */

struct COFF_filehdr {
	char f_magic[2];	/* magic number			*/
	char f_nscns[2];	/* number of sections		*/
	char f_timdat[4];	/* time & date stamp		*/
	char f_symptr[4];	/* file pointer to symtab	*/
	char f_nsyms[4];	/* number of symtab entries	*/
	char f_opthdr[2];	/* sizeof(optional hdr)		*/
	char f_flags[2];	/* flags			*/
};

#define COFF_STMAGIC	0401
#define COFF_OMAGIC     0404
#define COFF_JMAGIC     0407    /* dirty text and data image, can't share  */
#define COFF_DMAGIC     0410    /* dirty text segment, data aligned        */
#define COFF_ZMAGIC     0413    /* The proper magic number for executables  */
#define COFF_SHMAGIC	0443	/* shared library header                   */

/* ************************** A.OUT DEFS ************************** */
#define N_MAGIC(x) ((x).a_magic)
#define P_MAGIC(x) ((x)->a_magic)

/* file offsets */
#define N_TXTOFF(x) (sizeof(struct exec))
#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text)
#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data)
#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize)
#define N_SYMOFF(x) (N_DRELOFF(x) + (x).a_drsize)
#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms)

#define P_TXTOFF(x) sizeof(struct exec)
#define P_DATOFF(x) (P_TXTOFF(x) + (x)->a_text)
#define P_TRELOFF(x) (P_DATOFF(x) + (x)->a_data)
#define P_DRELOFF(x) (P_TRELOFF(x) + (x)->a_trsize)
#define P_SYMOFF(x) (P_DRELOFF(x) + (x)->a_drsize)
#define P_STROFF(x) (P_SYMOFF(x) + (x)->a_syms)

/* loaded offsets */
#define N_TXTADDR(x) (0) /* depends on operating system and linker used */
#define N_DATADDR(x) (N_TXTADDR(x)+(x).a_text) 
#define N_BSSADDR(x) (N_DATADDR(x)+(x).a_data)

#define P_TXTADDR(x) (0) /* depends on operating system and linker used */
#define P_DATADDR(x) (N_TXTADDR(x)+(x)->a_text) 
#define P_BSSADDR(x) (N_DATADDR(x)+(x)->a_data)

typedef struct nlist {
  union {
    char *n_name;
    struct nlist *n_next;
    long n_strx;
  } n_un;
  unsigned char n_type;
  char n_other;
  short n_desc;
  unsigned long n_value;
} NLIST, *PNLIST;

/* entries in the n_type field */
#define N_UNDF 0x00
#define N_ABS 0x02
#define N_TEXT 0x04
#define N_DATA 0x06
#define N_BSS 0x08
#define N_NDC 0x10
#define N_COMM 0x12
#define N_FN 0x0f
#define N_EXT 0x01
#define N_TYPE 0x1e
#define N_STAB 0xe0
#define N_SWTAB 0x20			/* oxcc switch table entry */
#define N_STDCAL 0x24			/* rsxnt stuff */
#define N_THUNK 0x30
#define N_SETA  0x14            /* Absolute set element symbol */
#define N_SETT  0x16            /* Text set element symbol */
#define N_SETD  0x18            /* Data set element symbol */
#define N_SETB  0x1A            /* Bss set element symbol */
#define N_SETV  0x1C            /* Pointer to set vector in data area.  */

#define sym_in_text_section(sym) \
(((sym)->n_type  & (N_ABS | N_TEXT | N_DATA | N_BSS))== N_TEXT)
#define sym_in_data_section(sym) \
(((sym)->n_type  & (N_ABS | N_TEXT | N_DATA | N_BSS))== N_DATA)
#define sym_in_bss_section(sym) \
(((sym)->n_type  & (N_ABS | N_TEXT | N_DATA | N_BSS))== N_BSS)
#define sym_is_undefined(sym) \
((sym)->n_type == (N_EXT) && (sym)->n_value == 0)
#define sym_is_global_defn(sym) \
(((sym)->n_type & N_EXT) && (sym)->n_type & N_TYPE)
#define sym_is_debugger_info(sym) \
((sym)->n_type & ~(N_EXT | N_TYPE))
#define sym_is_fortrancommon(sym)       \
(((sym)->n_type == (N_EXT)) && (sym)->n_value != 0)
#define sym_is_absolute(sym) \
(((sym)->n_type  & N_TYPE)== N_ABS)
#define sym_is_indirect(sym) \
(((sym)->n_type & N_TYPE)== N_INDR)


typedef struct relocation_info
{
  /* Address (within segment) to be relocated.  */
  int r_address;

⌨️ 快捷键说明

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