|
@@ -0,0 +1,375 @@
|
|
|
+{ Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details
|
|
|
+
|
|
|
+ ( MvdV: GPL/LGPL, I can't exactly make out from that file what this is, and
|
|
|
+ it doesn't matter for me, since FPC is also GPL/LGPL)
|
|
|
+
|
|
|
+ FPC Pascal conversion by Marco van de Voort (C) 2001.
|
|
|
+}
|
|
|
+
|
|
|
+Unit coff;
|
|
|
+
|
|
|
+
|
|
|
+interface
|
|
|
+
|
|
|
+{$packrecords C}
|
|
|
+
|
|
|
+type cushort =word;
|
|
|
+ culong =cardinal;
|
|
|
+ cshort =integer;
|
|
|
+ cuchar =byte;
|
|
|
+
|
|
|
+{** coff information for Intel 386/486. }
|
|
|
+
|
|
|
+{********************* FILE HEADER *********************}
|
|
|
+
|
|
|
+TYPE External_FileHDR = Record
|
|
|
+ f_magic : cushort; { magic number }
|
|
|
+ f_nscns : cushort; { number of sections }
|
|
|
+ f_timdat : culong; { time & date stamp }
|
|
|
+ f_symptr : culong; { file pointer to symtab }
|
|
|
+ f_nsyms : culong; { number of symtab entries }
|
|
|
+ f_opthdr : cushort; { sizeof(optional hdr) }
|
|
|
+ f_flags : cushort; { flags }
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+{ Bits for f_flags:
|
|
|
+ * F_RELFLG relocation info stripped from file
|
|
|
+ * F_EXEC file is executable (no unresolved external references)
|
|
|
+ * F_LNNO line numbers stripped from file
|
|
|
+ * F_LSYMS local symbols stripped from file
|
|
|
+ * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax)
|
|
|
+ }
|
|
|
+
|
|
|
+ FILHDR = external_filehdr;
|
|
|
+
|
|
|
+
|
|
|
+Const
|
|
|
+ F_RELFLG =00001;
|
|
|
+ F_EXEC =00002;
|
|
|
+ F_LNNO =00004;
|
|
|
+ F_LSYMS =00008;
|
|
|
+
|
|
|
+
|
|
|
+ I386MAGIC =$14c;
|
|
|
+ I386AIXMAGIC =$175;
|
|
|
+// I386BADMAG(x) (((x).f_magic!=I386MAGIC) && (x).f_magic!=I386AIXMAGIC)
|
|
|
+
|
|
|
+
|
|
|
+ FILHSZ = sizeof(FILHDR);
|
|
|
+
|
|
|
+
|
|
|
+{********************* AOUT "OPTIONAL HEADER" *********************}
|
|
|
+
|
|
|
+
|
|
|
+TYPE AOUTHDR = Record
|
|
|
+
|
|
|
+ magic : cushort; { type of file }
|
|
|
+ vstamp : cushort; { version stamp }
|
|
|
+ tsize : culong; { text size in bytes, padded to FW bdry}
|
|
|
+ dsize : culong; { initialized data " " }
|
|
|
+ bsize : culong; { uninitialized data " " }
|
|
|
+ entry : culong; { entry pt. }
|
|
|
+ text_start : culong; { base of text used for this file }
|
|
|
+ data_start : culong; { base of data used for this file }
|
|
|
+ end;
|
|
|
+
|
|
|
+ gnu_aout = Record
|
|
|
+ info,
|
|
|
+ tsize,
|
|
|
+ dsize,
|
|
|
+ bsize,
|
|
|
+ symsize,
|
|
|
+ entry,
|
|
|
+ txrel,
|
|
|
+ dtrel : culong;
|
|
|
+ end;
|
|
|
+
|
|
|
+const
|
|
|
+ AOUTSZ =sizeof(AOUTHDR);
|
|
|
+
|
|
|
+ OMAGIC =0404; { object files, eg as output }
|
|
|
+ ZMAGIC =0413; { demand load format, eg normal ld output }
|
|
|
+ STMAGIC =0401; { target shlib }
|
|
|
+ SHMAGIC =0443; { host shlib }
|
|
|
+
|
|
|
+
|
|
|
+{********************* SECTION HEADER *********************}
|
|
|
+
|
|
|
+
|
|
|
+type external_scnhdr = Record
|
|
|
+ s_name : array[0..7] OF CHAR; { section name }
|
|
|
+ s_paddr, { physical address, aliased s_nlib }
|
|
|
+ s_vaddr, { virtual address }
|
|
|
+ s_size, { section size }
|
|
|
+ s_scnptr, { file ptr to raw data for section }
|
|
|
+ s_relptr, { file ptr to relocation }
|
|
|
+ s_lnnoptr : culong; { file ptr to line numbers }
|
|
|
+ s_nreloc, { number of relocation entries }
|
|
|
+ s_nlnno : cushort; { number of line number entries}
|
|
|
+ s_flags : culong; { flags }
|
|
|
+ end;
|
|
|
+ SCNHDR = external_scnhdr;
|
|
|
+
|
|
|
+const SCNHSZ=sizeof(SCNHDR);
|
|
|
+
|
|
|
+
|
|
|
+{
|
|
|
+ * names of "special" sections
|
|
|
+ }
|
|
|
+
|
|
|
+CONST
|
|
|
+ special_TEXT ='.text';
|
|
|
+ special_DATA ='.data';
|
|
|
+ special_BSS ='.bss';
|
|
|
+ special_COMMENT ='.comment';
|
|
|
+ special_LIB ='.lib';
|
|
|
+
|
|
|
+{
|
|
|
+ * s_flags "type"
|
|
|
+ }
|
|
|
+ STYP_TEXT =$20; { section contains text only }
|
|
|
+ STYP_DATA =$40; { section contains data only }
|
|
|
+ STYP_BSS =$80; { section contains bss only }
|
|
|
+
|
|
|
+{********************* LINE NUMBERS *********************}
|
|
|
+
|
|
|
+{ 1 line number entry for every "breakpointable" source line in a section.
|
|
|
+ * Line numbers are grouped on a per function basis; first entry in a function
|
|
|
+ * grouping will have l_lnno = 0 and in place of physical address will be the
|
|
|
+ * symbol table index of the function name.
|
|
|
+ }
|
|
|
+
|
|
|
+type aux_lineno = Packed Record
|
|
|
+ case boolean of
|
|
|
+ false:( l_symndx:culong); { function name symbol index, iff l_lnno == 0 }
|
|
|
+ true:( l_paddr :culong); { (physical) address of line number }
|
|
|
+ end;
|
|
|
+
|
|
|
+ external_lineno = packed record {should be 6 bytes, check!}
|
|
|
+ l_addr : aux_lineno;
|
|
|
+ l_lnno : cushort; { line number }
|
|
|
+ end;
|
|
|
+
|
|
|
+ lineno=external_lineno;
|
|
|
+
|
|
|
+
|
|
|
+const LINESZ =sizeof(LINENO);
|
|
|
+
|
|
|
+
|
|
|
+{********************* SYMBOLS *********************}
|
|
|
+
|
|
|
+ E_SYMNMLEN =8; { # characters in a symbol name }
|
|
|
+ E_FILNMLEN =14; { # characters in a file name }
|
|
|
+ E_DIMNUM =4; { # array dimensions in auxiliary entry }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+type aux_aux_external_syment = packed record
|
|
|
+ e_zeroes : culong;
|
|
|
+ e_offset : culong;
|
|
|
+ end;
|
|
|
+ aux_external_syment = packed record
|
|
|
+ case boolean of
|
|
|
+ false: (e_name : array[0..E_SYMNMLEN-1] OF Char);
|
|
|
+ true : (e:aux_aux_external_syment);
|
|
|
+ end;
|
|
|
+
|
|
|
+ external_syment = packed record {packed, check if necessary!}
|
|
|
+ e : aux_external_syment;
|
|
|
+ e_value : culong;
|
|
|
+ e_scnum : cshort;
|
|
|
+ e_type : cushort;
|
|
|
+ e_sclass : cuchar;
|
|
|
+ e_numaux : cuchar;
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+CONST
|
|
|
+ N_BTMASK =$F;
|
|
|
+ N_TMASK =$30;
|
|
|
+ N_BTSHFT =$4;
|
|
|
+ N_TSHIFT =$2;
|
|
|
+
|
|
|
+
|
|
|
+type tx_lnsz = packed record
|
|
|
+ x_lnno,
|
|
|
+ x_size : cushort;
|
|
|
+ end;
|
|
|
+
|
|
|
+ tx_misc = packed record
|
|
|
+ case boolean of
|
|
|
+ false : (x_lnsz : tx_lnsz);
|
|
|
+ true : (x_fsize : culong);
|
|
|
+ end;
|
|
|
+
|
|
|
+ tx_fcn = packed record
|
|
|
+ x_lnnoptr,
|
|
|
+ x_endndx : culong;
|
|
|
+ end;
|
|
|
+
|
|
|
+ tx_ary = packed record
|
|
|
+ x_dimen : array[0..E_DIMNUM-1] OF cushort;
|
|
|
+ end;
|
|
|
+
|
|
|
+ tx_fcnary = packed record
|
|
|
+ case boolean of
|
|
|
+ false : ( x_fcn : tx_fcn);
|
|
|
+ true : ( x_ary : tx_ary);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ tx_sym = packed record
|
|
|
+ x_tagndx : culong;
|
|
|
+ x_misc : tx_misc;
|
|
|
+ x_fcnary : tx_fcnary;
|
|
|
+ x_tvndx : cushort;
|
|
|
+ end;
|
|
|
+
|
|
|
+ tx_n = packed record
|
|
|
+ x_zeroes,
|
|
|
+ x_offset : culong;
|
|
|
+ end;
|
|
|
+ tx_file = packed record
|
|
|
+ case boolean of
|
|
|
+ false: ( x_fname : array [0..E_FILNMLEN-1] of char);
|
|
|
+ true : (x_n : tx_n);
|
|
|
+ end;
|
|
|
+ tx_scn = packed record
|
|
|
+ x_scnlen : culong;
|
|
|
+ x_nreloc,
|
|
|
+ x_nlinno : cushort;
|
|
|
+ end;
|
|
|
+ tx_tv = packed record
|
|
|
+ x_tvfill : culong;
|
|
|
+ x_tvlen : cushort;
|
|
|
+ x_tvran : array[0..1] of cushort;
|
|
|
+ end;
|
|
|
+
|
|
|
+ external_auxent = packed record
|
|
|
+ case byte of
|
|
|
+ 0: (x_sym : tx_sym);
|
|
|
+ 1: (x_file: tx_file);
|
|
|
+ 2: (x_scn : tx_scn);
|
|
|
+ 3: (x_tv : tx_tv);
|
|
|
+ end;
|
|
|
+ SYMENT= external_syment;
|
|
|
+ AUXENT= external_auxent;
|
|
|
+
|
|
|
+const
|
|
|
+ SYMESZ = SIZEOF(SYMENT);
|
|
|
+ AUXESZ = SIZEOF(AUXENT);
|
|
|
+
|
|
|
+{ define _ETEXT "etext"}
|
|
|
+
|
|
|
+{ Relocatable symbols have number of the section in which they are defined,
|
|
|
+ or one of the following: }
|
|
|
+
|
|
|
+ N_UNDEF = 0; { undefined symbol }
|
|
|
+ N_ABS =-1; { value of symbol is absolute }
|
|
|
+ N_DEBUG =-2; { debugging symbol -- value is meaningless }
|
|
|
+ N_TV =-3; { indicates symbol needs preload transfer vector }
|
|
|
+ P_TV =-4; { indicates symbol needs postload transfer vector}
|
|
|
+
|
|
|
+{
|
|
|
+ * Type of a symbol, in low N bits of the word
|
|
|
+ }
|
|
|
+ T_NULL =0;
|
|
|
+ T_VOID =1; { function argument (only used by compiler) }
|
|
|
+ T_CHAR =2; { character }
|
|
|
+ T_SHORT =3; { short integer }
|
|
|
+ T_INT =4; { integer }
|
|
|
+ T_LONG =5; { long integer }
|
|
|
+ T_FLOAT =6; { floating point }
|
|
|
+ T_DOUBLE =7; { double word }
|
|
|
+ T_STRUCT =8; { structure }
|
|
|
+ T_UNION =9; { union }
|
|
|
+ T_ENUM =10; { enumeration }
|
|
|
+ T_MOE =11; { member of enumeration}
|
|
|
+ T_UCHAR =12; { unsigned character }
|
|
|
+ T_USHORT =13; { unsigned short }
|
|
|
+ T_UINT =14; { unsigned integer }
|
|
|
+ T_ULONG =15; { unsigned long }
|
|
|
+ T_LNGDBL =16; { long double }
|
|
|
+
|
|
|
+{
|
|
|
+ * derived types, in n_type
|
|
|
+}
|
|
|
+ DT_NON =0; { no derived type }
|
|
|
+ DT_PTR =1; { pointer }
|
|
|
+ DT_FCN =2; { function }
|
|
|
+ DT_ARY =3; { array }
|
|
|
+
|
|
|
+{
|
|
|
+\\ BTYPE(x) ((x) & N_BTMASK)
|
|
|
+
|
|
|
+\\ ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))
|
|
|
+\\ ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))
|
|
|
+\\ ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))
|
|
|
+\\ ISTAG(x) ((x)==C_STRTAG||(x)==C_UNTAG||(x)==C_ENTAG)
|
|
|
+\\ DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
|
|
|
+}
|
|
|
+{********************* STORAGE CLASSES *********************}
|
|
|
+
|
|
|
+{ This used to be defined as -1, but now n_sclass is unsigned. }
|
|
|
+ C_EFCN =$ff; { physical end of function }
|
|
|
+ C_NULL =0;
|
|
|
+ C_AUTO =1; { automatic variable }
|
|
|
+ C_EXT =2; { external symbol }
|
|
|
+ C_STAT =3; { static }
|
|
|
+ C_REG =4; { register variable }
|
|
|
+ C_EXTDEF =5; { external definition }
|
|
|
+ C_LABEL =6; { label }
|
|
|
+ C_ULABEL =7; { undefined label }
|
|
|
+ C_MOS =8; { member of structure }
|
|
|
+ C_ARG =9; { function argument }
|
|
|
+ C_STRTAG =10; { structure tag }
|
|
|
+ C_MOU =11; { member of union }
|
|
|
+ C_UNTAG =12; { union tag }
|
|
|
+ C_TPDEF =13; { type definition }
|
|
|
+ C_USTATIC =14; { undefined static }
|
|
|
+ C_ENTAG =15; { enumeration tag }
|
|
|
+ C_MOE =16; { member of enumeration }
|
|
|
+ C_REGPARM =17; { register parameter }
|
|
|
+ C_FIELD =18; { bit field }
|
|
|
+ C_AUTOARG =19; { auto argument }
|
|
|
+ C_LASTENT =20; { dummy entry (end of block) }
|
|
|
+ C_BLOCK =100; { ".bb" or ".eb" }
|
|
|
+ C_FCN =101; { ".bf" or ".ef" }
|
|
|
+ C_EOS =102; { end of structure }
|
|
|
+ C_FILE =103; { file name }
|
|
|
+ C_LINE =104; { line # reformatted as symbol table entry }
|
|
|
+ C_ALIAS =105; { duplicate tag }
|
|
|
+ C_HIDDEN =106; { ext symbol in dmert public lib }
|
|
|
+
|
|
|
+{********************* RELOCATION DIRECTIVES *********************}
|
|
|
+
|
|
|
+
|
|
|
+type external_reloc = packed record
|
|
|
+ r_vaddr,
|
|
|
+ r_symndx : culong;
|
|
|
+ r_type : cushort;
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ RELOC = external_reloc;
|
|
|
+ PRELOC= ^RELOC; {not in original header}
|
|
|
+const
|
|
|
+ RELSZ =sizeof(RELOC);
|
|
|
+
|
|
|
+ RELOC_REL32 =20; { 32-bit PC-relative address }
|
|
|
+ RELOC_ADDR32 =6; { 32-bit absolute address }
|
|
|
+
|
|
|
+ DEFAULT_DATA_SECTION_ALIGNMENT =4;
|
|
|
+ DEFAULT_BSS_SECTION_ALIGNMENT =4;
|
|
|
+ DEFAULT_TEXT_SECTION_ALIGNMENT =4;
|
|
|
+
|
|
|
+{ For new sections we havn't heard of before }
|
|
|
+
|
|
|
+ DEFAULT_SECTION_ALIGNMENT =4;
|
|
|
+
|
|
|
+Implementation
|
|
|
+
|
|
|
+end.
|