?? binimg.h
字號:
/* 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 + -