|
|
1.1 ! root 1: Some Unix languages such as gcc and g++ produce assembler rather than object ! 2: code. This approach radically slows down the compiler and produces amazing ! 3: unneeded complexity, especially if debug information is to be placed on ! 4: object files. ! 5: ! 6: The compiler starts with type and line information in a format much like that ! 7: of the desired COFF output files. It must break this down into lines to ship ! 8: through the assembler, the assembler then must rebuild the information into ! 9: COFF format for output. ! 10: ! 11: In line with its function the Mark Williams assembler not only supports this ! 12: sillyness it documents it. (Not a Unix assembler notion). However error ! 13: checking of these is minamum and bad debug information can corrupt the ! 14: generated COFF output. ! 15: ! 16: This section must be read with a listing of coff.h for reference. ! 17: ! 18: .file "filename" ! 19: If used this should be the first statement in the file. It produces a ! 20: SYMENT of n_sclass = C_FILE and an AUXENT with ae_fname = filename. This ! 21: connects the object file to the original source file. ! 22: ! 23: .def symbolName ! 24: This initializes this SYMENT with n_name = symbolName. If there is a symbol ! 25: by that name on the assemblers internal symbol table it is marked to ! 26: prevent output to the symbol table, any RELOC references will point to ! 27: this table entry so its n_value had better end up correct. Because this ! 28: kind of code is assumed to be the result of a compiler we assume it is ! 29: right. The following commands upto and including .endef refer to this ! 30: SYMENT. ! 31: ! 32: .type number ! 33: This sets this SYMENT's n_type with number. If number indicates a function, ! 34: DT_FCN, An LINENO record is built pointing at this SYMENT. ! 35: ! 36: .val symbol or number ! 37: This sets this SYMENT's n_value and if it is a symbol it sets n_scnum ! 38: to the symbols section number. ! 39: ! 40: .scl number ! 41: This sets this SYMENT's n_sclass to number. ! 42: ! 43: .dim number [, number [, number [, number]]] ! 44: This sets up to 4 entries in an AUXENT's ae_dimen. It is used to describe ! 45: multi dimensioned arrays to COFF. Past 4 dimensional arrays the COFF specs ! 46: are admittedly buggy. One of the reasons that people are playing with other ! 47: output formats. ! 48: ! 49: .size n ! 50: This sets this AUXENT ae_size to n. ! 51: ! 52: .tag name ! 53: This scans backwards on the SYMENTs for a matching n_name. It points this ! 54: ae_tagndx to that names symbol number and that ae_endndx to the next symbol ! 55: number. A good example is a struct, It would start with a SYMENT of type ! 56: T_STRUCT, then there would be SYMENTs for its members. At the end there would ! 57: be a C_EOS (end of structure) with a tag that gets us back to the ! 58: symbol's name. .tag connects the forward and backward pointers. ! 59: ! 60: .line n ! 61: This sets the AUXENT's ae_lnno to n. ! 62: ! 63: .endef ! 64: This marks the end of a SYMENT started by .def. If the n_sclass == C_EFCN ! 65: (end of function) it builds the functions ae_fsize and ae_endndx and does ! 66: not output this syment. If any AUXENT fields were set an AUXENT record will ! 67: follow this SYMENT. ! 68: ! 69: .ln number ! 70: This builds a LINENO record with l_lnno = n and l_addr.l_paddr = the current ! 71: location.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.