home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / omf.zip / OMF.INF (.txt)
OS/2 Help File  |  1993-04-26  |  104KB  |  3,939 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Introduction ΓòÉΓòÉΓòÉ
  3.  
  4. IBM OS/2 32 bit Object Module Format (OMF) 
  5.  
  6. and Linear eXecutable Module Format (LX) 
  7.  
  8. Revision 6 
  9.  
  10. Boca Programming Center 
  11.  
  12. Boca Raton, Florida 
  13.  
  14. This document is intended to describe the interface that is used by language 
  15. translators and generators as their intermediate output to the linker for the 
  16. 32-bit OS/2 operating system. The linker will generate the executable module 
  17. that is used by the loader to invoke the .EXE and .DLL programs at execution 
  18. time. 
  19.  
  20.  
  21. ΓòÉΓòÉΓòÉ 1.1. Purpose of this document ΓòÉΓòÉΓòÉ
  22.  
  23. THIS DOCUMENT PROVIDED BY IBM SHALL BE PROVIDED ON AN "AS IS" BASIS WITHOUT ANY 
  24. WARRANTY OF ANY KIND EITHER EXPRESS OR IMPLIED. THE IMPLIED WARRANTIES OF 
  25. MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY DISCLAIMED. 
  26.  
  27. FURTHERMORE, THIS DOCUMENTATION IS IN A PRELIMINARY FORM; IS NOT COMPLETE; HAS 
  28. NOT YET BEEN TESTED, VALIDATED OR REVIEWED; MAY CONTAIN ERRORS, OMISSIONS, 
  29. INACCURACIES OR THE LIKE; AND IS SUBJECT TO BEING CHANGED, REVISED OR 
  30. SUPERSEDED IN WHOLE OR IN PART BY IBM. IBM DOES NOT ASSUME ANY RESPONSIBILITY 
  31. TO NOTIFY ANY PARTIES, COMPANIES, USERS, AND OR OTHERS OF DEFECTS, 
  32. DEFICIENCIES, CHANGES, ERRORS OR OTHER FAILINGS OR SHORTCOMING OF THE 
  33. DOCUMENTATION. 
  34.  
  35. RECIPIENT'S USE OF THIS DOCUMENT IS LIMITED TO RECIPIENT'S PERSONAL USE FOR THE 
  36. SOLE PURPOSE OF CREATING TOOLS FOR THE OS/2Reference OPERATING SYSTEM. 
  37.  
  38.  
  39. ΓòÉΓòÉΓòÉ 1.2. Major changes to this document ΓòÉΓòÉΓòÉ
  40.  
  41. Draft 1   = Combined information from several documents into one. 
  42.  
  43. Draft 2   = Added Comments from Lexington and Toronto. 
  44.  
  45. Draft 3   = Added the Linear Executable format (LX). 
  46.  
  47. Draft 4   = Minor corrections. 
  48.  
  49. Draft 5   = Added StackSize to LX structure. 
  50.  
  51. Revision 6 = Added IDMDLL COMENT record 
  52.  
  53. Revision 7 = Added 16-bit object record definitions 
  54.  
  55.  
  56. ΓòÉΓòÉΓòÉ 2. THE 16/32-BIT OBJECT MODULE FORMAT ΓòÉΓòÉΓòÉ
  57.  
  58.  
  59. ΓòÉΓòÉΓòÉ 2.1. Record Format: ΓòÉΓòÉΓòÉ
  60.  
  61. All object records confirm to the following format: 
  62.  
  63.      1 byte       2 byte         <variable length>           1 byte
  64. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  65. ΓöéRecord Type Γöé Record Length  Γöé Record Contents          Γöé Chk Sum or 0 Γöé
  66. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  67.                                <------- record length in bytes -------->
  68. Standard object module record format
  69.  
  70. The   Record  Type  field  is  a  1 - byte  field  containing  the  hexadecimal 
  71. number  that  identifies  the  type  of  object  record .  The  format  is 
  72. determined  by  the  least  significant  bit  of  the  Record  Type  field . 
  73. Note  that  this  does  not  govern  Use32 / Use16  segment  attributes ;  it 
  74. simply  specifies  the  size  of  certain  numeric  fields  within  the  record 
  75. .  An  odd  Record  Type  indicates  that  32 - bit  values  are  present .  An 
  76. even  Record  Type  indicates  that  those  fields  contain  16 - bit  values . 
  77. The  fields  affected  are  described  with  each  record . 
  78.  
  79. An  entire  record  occupies   Record  Length  +  3  bytes .  The  record 
  80. length  does  not  include  the  count  for  the  record  type  and  record 
  81. length  fields .  Unless  otherwise  noted  within  the  record  definition , 
  82. the  record  length  should  not  exceed  1024  bytes . 
  83.  
  84. The   Record  Contents  are  determined  by  the  record  type . 
  85.  
  86. The   Chk  Sum  field  is  a  1 - byte  field  that  contains  the  negative 
  87. sum  ( modulo  256 )  of  all  other  bytes  in  the  record .  The  byte  sum 
  88. over  the  entire  record ,  ignoring  overflow ,  is  zero . 
  89. NOTES : 
  90.  
  91. LINK386  ignores  the  value  of  the  Chk  Sum  byte . 
  92.  
  93.  
  94. ΓòÉΓòÉΓòÉ 2.2. Frequent Object Record Subfields ΓòÉΓòÉΓòÉ
  95.  
  96. The  contents  of  each  record  are  determined  by  the  record  type ,  but 
  97. certain  subfields  appear  frequently ;  the  format  of  such  fields  is 
  98. described  next . 
  99.  
  100.  
  101. ΓòÉΓòÉΓòÉ 2.2.1. Names ΓòÉΓòÉΓòÉ
  102.  
  103. Name  strings  are  encoded  as  an  8 - bit  unsigned  count  followed  by  a 
  104. string  of  " count "  characters .   The  character  set  is  usually  some 
  105. ASCII  subset .   A  null  name  is  specified  by  a  single  byte  of  0  ( 
  106. indicating  a  string  of  length  zero ) . 
  107.  
  108.  
  109. ΓòÉΓòÉΓòÉ 2.2.2. Indexed References ΓòÉΓòÉΓòÉ
  110.  
  111. Certain  items  are  ordered  by  occurrence ,  and  referenced  by  index  ( 
  112. starting  index  is  1 ) .   Index  fields  can  contain  0 ,  indicating  not 
  113. - present ,  or  values  from  1  through  7FFF .   The  index  is  encoded  as 
  114. 1  or  2  bytes . 
  115.  
  116. If  the  index  number  is  in  the  range  0 - 7H ,  the  high - order  bit  ( 
  117. bit  7 )  is  0  and  the  low - order  bits  contain  the  index  number ,  so 
  118. the  field  is  only  1  byte  long .  If  the  index  number  is  in  the 
  119. range  80 - 7FFFH ,  the  field  is  2  bytes  long .  The  high - order  bit 
  120. of  the  first  byte  in  the  field  is  set  to  1 ,  and  the  high - order 
  121. byte  of  the  index  number  which  must  be  in  the  range  ( 0 - 7FH ) 
  122. fits  in  the  remaining  7  bits .  The  low - order  byte  of  the  index 
  123. number  is  specified  in  the  second  byte  of  the  field .  A  16 - bit 
  124. value  is  obtained  as  follows :   if  ( first _ byte    0x80 )      index _ 
  125. word   =  ( first _ byte    7F )  *  0x100   +   second _ byte ;  else 
  126. index _ word  =  first _ byte 
  127.  
  128.  
  129. Type  indices 
  130.  
  131. The  type  index  is  treated  as  an  index  field  when  a  record  is 
  132. parsed  ( occupies  one  or  two  bytes ,  occurs  in  PUBDEF ,  COMDEF , 
  133. EXTDEF  records ) .  They  are  encoded  as  described  under  indexed 
  134. references . 
  135.  
  136. NOTE :  At  present ,  no  type  checking  is  done  by  the  linker .  If  any 
  137. link - time  semantics  are  defined ,  that  information  will  be  recorded 
  138. somewhere  within  this  document . 
  139.  
  140.  
  141. Ordered  Collections 
  142.  
  143. Certain  records  and  record  groups  are  ordered ;  the  ordering  is 
  144. obtained  from  the  order  of  the  record  types  within  the  file  together 
  145. with  the  ordering  of  repeated  fields  within  these  records .  Such 
  146. ordered  collections  are  referenced  by  index ,  counting  from  1  ( index 
  147. 0  indicates  unknown  or  decline - to - state ) . 
  148.  
  149. For  example ,  there  may  be  many  LNAMES  records  within  a  module  and 
  150. each  of  those  records  may  contain  many  names .  The  names  are  indexed 
  151. starting  at  1  for  the  first  name  in  the  first  LNAMES  record 
  152. encountered  while  reading  the  file ,  2  for  the  second  name  in  the 
  153. first  record ,  etc . ,  and  the  highest  index  for  the  last  name  in 
  154. the  last  LNAMES  record  encountered . 
  155.  
  156. The  ordered  collections  are : 
  157.  
  158. o NAMES :  ordered  by  LNAMES  record  and  names  within  each .  Referenced 
  159.   as  a  Name  Index . 
  160.  
  161. o LOGICAL  SEGMENTS :  ordered  by  SEGDEF  records  in  file .  Referenced  as 
  162.   a  Segment  Index . 
  163.  
  164. o GROUPS :  ordered  by  GRPDEF  of  records  in  file .  Referenced  as  a 
  165.   Group  Index . 
  166.  
  167. o EXTERNAL  SYMBOLS :  ordered  by  EXTDEF  and  COMDEF  records  and  symbols 
  168.   within  each .  Referenced  as  an  External  Index  ( in  FIXUPs ) . 
  169.  
  170.  
  171. ΓòÉΓòÉΓòÉ 2.2.3. Numeric 2 and 4 byte fields ΓòÉΓòÉΓòÉ
  172.  
  173. Words  and  double  words  ( 16  and  32  bit  quantities )  are  stored  in 
  174. Intel  byte  order  ( lowest  address  is  least  significant ) . 
  175.  
  176. Certain  records ,  notably  SEGDEF ,  PUBDEF ,  LINNUM ,  LEDATA ,  LIDATA , 
  177. FIXUPP  and  MODEND ,  contain  size ,  offset ,  and  displacement  values 
  178. which  may  be  32  bit  quantities  for  Use32  segments .  The  encoding  is 
  179. as  follows . 
  180.  
  181. o When  the  least  significant  bit  of  the  record  type  byte  is  set  ( 
  182.   ie  record  type  is  an  odd  number ) ,  the  numeric  fields  are  4 
  183.   bytes . 
  184.  
  185. o When  the  least  significant  bit  of  the  record  type  byte  is  clear , 
  186.   the  fields  occupy  2  bytes  ( 16  bit  Object  Module  Format ) .  The 
  187.   values  are  zero - extended  when  applied  to  Use32  segments . 
  188.  
  189. See  the  description  of  SEGDEF  records  for  an  explanation  of  Use16 / 
  190. Use32  segments . 
  191.  
  192.  
  193. ΓòÉΓòÉΓòÉ 2.3. Order of records ΓòÉΓòÉΓòÉ
  194.  
  195. The  record  order  is  chosen  so  that  bind / link  passes  through  an 
  196. object  module  are  minimized .   This  differs  from  the  previous  less 
  197. specific  ordering  in  that  all  symbolic  information  ( in  particular , 
  198. all  export  and  public  symbols )  must  occur  at  the  start  of  the 
  199. object  module .  This  order  is  recommended  but  not  mandatory . 
  200.  
  201. Identifier  record ( s ) : 
  202.  
  203. Must  be  the  first  record . 
  204.  
  205. o THEADR  or  LHEADR 
  206.  
  207.   Records  processed  by  Link  Pass  one : 
  208.  
  209.   May  occur  in  any  order  but  must  precede  the  Link  pass  separator 
  210.   if  it  is  present . 
  211.  
  212. o  COMENT  class  AF  providing  name  of  Identifier  Manipulator  Dynamic 
  213.   Link  Library  ( should  be  near  the  beginning  of  the  file ) 
  214.  
  215. o  COMENT  identifying  object  format  and  extensions 
  216.  
  217. o  COMENT  any ,  other  than  link  pass  separator  comment 
  218.  
  219. o  LNAMES  providing  ordered  name  list 
  220.  
  221. o  SEGDEF  providing  ordered  list  of  program  segments 
  222.  
  223. o  GRPDEF  providing  ordered  list  of  logical  segments 
  224.  
  225. o  TYPDEF  ( no  longer  used ) 
  226.  
  227. o  ALIAS  records 
  228.  
  229. o  PUBDEF  locating  and  naming  public  symbols 
  230.  
  231. o  LPUBDEF  locating  and  naming  private  symbols . 
  232.  
  233. o  COMDEF ,  EXTDEF ,  LCOMDEF ,  LEXTDEF  records 
  234.  
  235.    This  group  of  records  is  indexed  together ,  so  External  Index 
  236.    fields  in  FIXUPP  records  may  refer  to  any  of  the  record  types 
  237.    listed . 
  238.  
  239. o  COMDAT  records 
  240.  
  241.   Link  pass  separator  ( optional ) : 
  242.  
  243. o  COMENT  class  A2  indicating  that  pass  1  of  the  linker  is  complete 
  244.   . 
  245.  
  246.    When  this  record  is  encountered ,  LINK  immediately  starts  Pass  2 ; 
  247.    no  records  after  this  comment  are  read  in  Pass  1 .  All  the  above 
  248.    listed  records  must  come  before  this  comment  record .  For  greater 
  249.    linking  speed ,  all  LIDATA ,  LEDATA ,  FIXUPP  and  LINNUM  records 
  250.    should  come  after  the  A2  comment  record ,  but  this  is  not 
  251.    required . 
  252.  
  253.    In  LINK ,  Pass  2  begins  again  at  the  start  of  the  object  module 
  254.    ,  so  LIDATA  records ,  etc . ,  are  processed  in  Pass  2  no  matter 
  255.    where  they  are  placed  in  the  object  module .  sk 
  256.  
  257. Records  ignored  by  link  pass  one  and  processed  by  link  pass  two : 
  258.  
  259.  May  come  before  or  after  link  pass  two : 
  260.  
  261. o  LIDATA  or  LEDATA  records  followed  by  applicable  FIXUPP  records . 
  262.  
  263. o  FIXUPPs  containing  THREADs  only . 
  264.  
  265. o  BAKPAT  and  NBAKPAT  fixupps . 
  266.  
  267. o  LINNUM  and  LINSYM  providing  line  number  to  program  code  or  data 
  268.   association . 
  269.  
  270.   Terminator 
  271.  
  272. o  MODEND  indicating  end  of  module  with  optional  start  address . 
  273.  
  274.  
  275. ΓòÉΓòÉΓòÉ 2.4. Object Record Types ΓòÉΓòÉΓòÉ
  276.  
  277.  
  278. ΓòÉΓòÉΓòÉ 2.4.1. 80H THEADR  Translator Header Record ΓòÉΓòÉΓòÉ
  279.  
  280.  
  281. Description :  The  THEADR  record  contains  the  name  of  the  object 
  282. module .  This  name  identifies  an  object  module  within  an  object 
  283. library  or  in  messages  produced  by  the  linker . 
  284.  
  285.   1 byte     2 byte        1 byte    < variable length >       1 byte
  286. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  287. Γöé  80   Γöé Record         Γöé String Γöé    Name String            ΓöéChk Sum Γöé
  288. Γöé       Γöé  Length        Γöé Length Γöé                           Γöéor 0    Γöé
  289. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  290.  
  291. THEADR record type definition 
  292.  
  293. The  String Length byte gives the number of characters in the name string; the 
  294. name string itself is ASCII.  This name is usually that of the source program 
  295. (if supplied by the language translator), or may be specified directly by the 
  296. programmer (e.g. TITLE pseudo-op). 
  297.  
  298. This record must occur as the first object record.  More than one header record 
  299. is allowed (as a result of an object bind, or if source arose from multiple 
  300. files as a result of include processing). 
  301. NOTES: 
  302.  
  303. The name string is always present; a null name is allowed but not recommended 
  304. (not much information for a debugger that way). 
  305.  
  306. It is recommended that the module be generated with the full path and filename 
  307. containing the source code. 
  308.  
  309. The THEADR record must be the first record of the object module. 
  310.  
  311. More than one header record is allowed (as a result of source from multiple 
  312. files during the include process). 
  313.  
  314.  
  315. ΓòÉΓòÉΓòÉ 2.4.2. 82H LHEADR  Library Header Record ΓòÉΓòÉΓòÉ
  316.  
  317.  
  318. Description: This record is very similar to the THEADR record. It is used to 
  319. indicate the name of a module within a library file (which has a different 
  320. organization internally than an object module). 
  321. Record format: 
  322.  
  323.   1 byte     2 byte        1 byte   <variable length>        1 byte
  324. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  325. Γöé  82   Γöé Record         Γöé String Γöé  Name String           ΓöéChk Sum Γöé
  326. Γöé       Γöé  Length        Γöé Length Γöé                        Γöéor 0    Γöé
  327. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  328.  
  329. LHEADR record type definition 
  330.  
  331. NOTES: 
  332.  
  333. In LINK, THEADR and LHEADR records are handled identically. 
  334.  
  335.  
  336. ΓòÉΓòÉΓòÉ 2.4.3. 88H COMENT  Comment Record ΓòÉΓòÉΓòÉ
  337.  
  338.  
  339. Description: The COMENT record contains a character string that may represent a 
  340. plain text comment, a symbol meaningful to a program such as LINK or LIB, or 
  341. some binary coded information that alters the linking process. The comment 
  342. records are actually a group of items, classified by "comment class". 
  343.  
  344.   1 byte  2 byte
  345. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  346. Γöé  88   Γöé Record         Γöé
  347. Γöé       Γöé  Length        Γöé
  348. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  349.  
  350.  
  351.           1 byte  1 byte   <Record length - 3>      1 byte
  352.        --ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  353.          ΓöéCommentΓöéCommentΓöé Commentary byte string ΓöéChk SumΓöé
  354.          Γöé Type  Γöé Class Γöé    (optional)          Γöéor 0   Γöé
  355.        --ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  356.  
  357. COMENT record type definition 
  358.  
  359.  
  360. Comment Type 
  361.  
  362. The comment type byte is bit-significant; layout is: 
  363.  
  364. <----------------------- 1 byte ------------------------------>
  365. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  366. Γöé NP    Γöé NL    Γöé   0   Γöé   0   Γöé   0   Γöé   0   Γöé   0   Γöé   0   Γöé
  367. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  368. where 
  369.  
  370. NP  is set if the comment is to be preserved by object bind utilities 
  371. NL  is set if the comment is not for display by object bind utilities 
  372.  
  373.  
  374. Comment class and commentary byte string 
  375.  
  376. The comment class is an 8-bit numeric which conveys information by its value 
  377. (accompanied by a null byte string), or indicates the information to be found 
  378. in the accompanying byte string. The byte string's length is determined from 
  379. the record length, not by an initial count byte. 
  380.  
  381. The values in use currently are the following: 
  382.  
  383. 0  Translator 
  384.     For translator; may name the source language or translator. Recommended: 
  385.     translator name and version plus optimization level used for compilation be 
  386.     recorded here.  Other compiler or assembler options can be included, 
  387.     although current practice seems to be to place these under comment class 
  388.     9D. 
  389.  
  390. 1  Intel copyright 
  391.     Ignored by the linker. 
  392.  
  393. 2 through 9B  Intel reserved 
  394.     The values from 9C through FF are ignored by Intel products. 
  395.  
  396. 9C  MS-DOS version -- obsolete 
  397.     Ignored by linker 
  398.  
  399. 9D  Memory Model -- ignored 
  400.     Ignored by linker 
  401.  
  402. 9E  DOSSEG 
  403.     Sets the linkers DOSSEG switch. The byte string is null. This record is 
  404.     included in the startup module in each language library. It directs the 
  405.     linker to use the standardized segment ordering, according to the naming 
  406.     conventions documented with DOS, OS/2 and accompanying language products. 
  407.  
  408. 9F  Library indicator 
  409.     The byte string contains a library file name (without a lead count byte and 
  410.     without an extension). Can be over-ridden via NOD link switch. 
  411.  
  412. A0  OMF extensions 
  413.     This class consists of a set of records, identified by subtype (first byte 
  414.     of commentary string).  Values supported by the OS/2 2.0 linker are 
  415.  
  416.    01          IMPDEF 
  417.                Import definition record. See IMPDEF section for complete 
  418.                description. 
  419.    02          EXPDEF 
  420.                Export definition record. See EXPDEF section for complete 
  421.                description. 
  422.    03          INCDEF 
  423.                Incremental compilation record. See INCDEF section for complete 
  424.                description. 
  425.    04          Protected Memory Library 
  426.                Relevant to 32 bit DLL's.This comment record is inserted in the 
  427.                object module by the compiler when it encounters a compiler 
  428.                option or pragma indicating a protected DLL. The linker then 
  429.                sets a flag in the header of the executable file (DLL) to 
  430.                indicate that the DLL should be loaded in such a way that its 
  431.                shared code and data is protected from corruption. 
  432.  
  433.                When the flag is set in the EXE header, the loader loads the 
  434.                selector of the protected memory area into the DS while 
  435.                performing run-time fixups (relocations). All other DLL's and 
  436.                applications get the regular DGROUP selector, which doesn't 
  437.                allow access to the protected memory area set up by the 
  438.                operating system. 
  439.    05          LNKDIR 
  440.                C++ linker directives record. See LNKDIR section for complete 
  441.                description. 
  442.    06-FF       Reserved for Microsoft. 
  443.    NOTE:       presence of any unrecognized subtype causes LINKER to generate a 
  444.                fatal error. 
  445.  
  446. A1  Symbolic debug information 
  447.     This comment class is now used solely to indicate the version of the 
  448.     symbolic debug information. 
  449.  
  450.     The byte string will be a version number (8-bit numeric) followed by an 
  451.     ASCII character string indicating the style of symbol and line number 
  452.     (LINNUM) information. Current values are 
  453.  
  454.    n,'C','V' CodeView style 
  455.    n,'D','X' AIX style 
  456.    n,'H','L' IBM PM Debugger 
  457.  
  458. A2  Link Pass 
  459.     This record conveys information to the linker about the organization of the 
  460.     file.  At present, a single sub-extension is defined. The commentary string 
  461.     is 
  462.  
  463.               ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ--------ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  464.               Γöé   01    Γöé  Optional              Γöé
  465.               ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ--------ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  466.     Subclass 01 indicates the start of link pass 2 records; this may be 
  467.     followed by anything at all, which will be ignored by the linker 
  468.     (determined from the RecLength). When this comment appears, the linker can 
  469.     rest assured that only LEDATA, LIDATA, FIXUPP, LINNUM and the terminal 
  470.     MODEND records will occur after this.  All other record types, plus THREAD 
  471.     fixups, occur before. 
  472.  
  473.     WARNING: It is assumed that this comment will not be present in a module 
  474.     whose MODEND record contains a program starting address. 
  475.  
  476. A3  LIBMOD indicator 
  477.     Library module comment record. Ignored by LINK386. 
  478.  
  479. A4  EXESTR indicator 
  480.     Executable Module Identification String 
  481.  
  482.     A commentary string specifying a string to be placed in the executable 
  483.     module, but which is not loaded with the load module. 
  484.  
  485. A6 
  486.     INCERR 
  487.  
  488.     Incremental compilation error. See INCERR section for a complete 
  489.     description. 
  490.  
  491. A7 NOPAD 
  492.  
  493. No segment padding. Ignored by LINK386. 
  494.  
  495. A8  WKEXT 
  496.     Weak Extern record.  See WKEXT section for a complete description. 
  497.  
  498. A9  LZEXT 
  499.     Lazy Extern record. Ignored by LINK386. 
  500.  
  501. AA  PHARLAP 
  502.     PharLap Format record. Ignored by LINK386. 
  503.  
  504. AF  IDMDLL indicator 
  505.     Identifier Manipulator Dynamic Link Library.  See IDMDLL section for a 
  506.     complete description 
  507.  
  508. B2H-BFH 
  509.     Unused 
  510.  
  511. C0H-FFH 
  512.     Reserved for user-defined comment classes. 
  513.  
  514. Notes: 
  515.  
  516. A COMENT record can appear almost anywhere in an object module. Only two 
  517. restrictions apply: 
  518.  
  519. o A COMENT record cannot be placed between a FIXUPP record and the LEDATA or 
  520.   LIDATA record to which it refers. 
  521.  
  522. o A COMENT record can not be the first or last record in an object module. (The 
  523.   first record must always be a THEADR record and the last must always be a 
  524.   MODEND). 
  525.  
  526.  
  527. ΓòÉΓòÉΓòÉ 2.4.4. 88H IMPDEF  Import Definition Record (comment class A0, subtype 01) ΓòÉΓòÉΓòÉ
  528.  
  529.  
  530. Description: 
  531.  
  532. This record describes the imported names for a module. 
  533. Record format: 
  534.  
  535. One import symbol is described; the subrecord format is 
  536.  
  537.     1       1        <variable>        <variable>      2or<var>   (bytes)
  538. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  539. Γöé  01   Γöé Ord    Γöé  Internal      Γöé  Module         Γöé Entry               Γöé
  540. Γöé       Γöé Flag   Γöé  Name          Γöé  Name           Γöé Ident               Γöé
  541. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  542.  
  543. IMPDEF record type definition 
  544.  
  545. where: 
  546.  
  547. 01        identifies the subtype as an IMPDEF 
  548.  
  549. OrdFlag   is a byte; if zero the import is identified by name. If nonzero, it 
  550.           is identified by ordinal. Determines the form of the EntryIdent 
  551.           field. 
  552.  
  553. InternalName in <count, char> string format and is the name used within this 
  554.           module for the import symbol. This name will occur again in an EXTDEF 
  555.           record. 
  556.  
  557. ModuleName in <count, char> string format and is the name of the module which 
  558.           supplies an export symbol matching this import. 
  559.  
  560. EntryIdent is an ordinal or the name used by the exporting module for the 
  561.           symbol, depending upon the OrdFlag. 
  562.  
  563.           If this field is an ordinal (OrdFlag nonzero), it is a 16-bit word. 
  564.           If this is a name, and the first byte of the name is zero, then the 
  565.           exported name is the same as the import name (in the InternalName 
  566.           field). Otherwise, it is the imported name in <count, char> string 
  567.           format (as exported by ModuleName ). 
  568.  
  569.  
  570. Notes: IMPDEF records are created by the utility IMPLIB, which builds an 
  571. "import library" from a module definition file or dynamic-link library. 
  572.  
  573.  
  574. ΓòÉΓòÉΓòÉ 2.4.5. 88H EXPDEF  Export Definition Record (comment class A0, subtype 02) ΓòÉΓòÉΓòÉ
  575.  
  576.  
  577. Description: 
  578.  
  579. This record describes the exported names for a module. 
  580. Record format: 
  581.  
  582. One exported entry point is described; the subrecord format is 
  583.  
  584.     1        1          < variable >         < variable >        2  (bytes)
  585. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  586. Γöé  02   Γöé Exp       Γöé  Exported        Γöé   Internal         Γöé  Export      Γöé
  587. Γöé       Γöé Flag      Γöé  Name            Γöé   Name             Γöé  Ordinal     Γöé
  588. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  589.                                                               <conditional>
  590.  
  591. IMPDEF record type definition 
  592.  
  593. where: 
  594.  
  595. 02        identifies the subtype as an EXPDEF 
  596.  
  597. ExpFlag   is a bit-significant 8-bit field. 
  598.  
  599. <------------------------ 1 byte ------------------------->
  600. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  601. Γöé Ord    Γöé  Resident  Γöé  No    Γöé       Parm               Γöé
  602. Γöé Bit    Γöé  Name      Γöé  Data  Γöé       Count              Γöé
  603. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  604.   1            1          1     <------- 5 bits --------->
  605.  
  606. OrdBit    Set if the item is exported by ordinal; in this case the 
  607.           ExportOrdinal field is present. 
  608.  
  609. ResName   Set if the exported name is to be kept resident by the system loader; 
  610.           this is an optimization for frequently used items imported by name. 
  611.  
  612. NoData    Set if the entry point does not use initialized data (either 
  613.           instanced or global). 
  614.  
  615. ParmCount Number of parameter words. The ParmCount field is set to zero for all 
  616.           but callgates to 16-bit segments. 
  617.  
  618. Exported Name in <count, char> string format. Name to be used when the entry 
  619.           point is imported by name. 
  620.  
  621. Internal Name in <count, char> string format. If the name length is zero, the 
  622.           internal name is the same as the Exported Name. Otherwise, it is the 
  623.           name by which the entry point known within this module. This name 
  624.           will appear as a PUBDEF or LPUBDEF name. 
  625.  
  626. ExportOrdinal present if the OrdBit is set; it is a 16-bit numeric whose value 
  627.           is the ordinal used (must be non-zero). 
  628.  
  629.  
  630. Notes: 
  631.  
  632. EXPDEFs are produced by the compiler when the keyword _export is used in a 
  633. source file. LINK386 limits the ExportOrdinal value to 16384(16K) or lower. 
  634.  
  635.  
  636. ΓòÉΓòÉΓòÉ 2.4.6. 88H INCDEF  Incremental Compilation Record (comment class A0, subtype 03) ΓòÉΓòÉΓòÉ
  637.  
  638.  
  639. Description: 
  640.  
  641. This record is used for incremental compilation. Every FIXUPP and LINNUM record 
  642. folliwing an INCDEF record will adjust all external index values and line 
  643. number values by the appropriate delta. The deltas are cumulative if there is 
  644. more than one INCDEF per module. 
  645.  
  646.  
  647. Record format: 
  648.  
  649. The subrecord format is 
  650.  
  651.  
  652.      1          2               2          <variable>  (bytes)
  653. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  654. Γöé  03    Γöé  EXTDEF      Γöé  LINNUM      Γöé  padding              Γöé
  655. Γöé        Γöé  delta       Γöé  delta       Γöé                       Γöé
  656. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  657.  
  658. INCDEF record type definition 
  659.  
  660. The EXTDEF delta and LINNUM delta fields are signed. 
  661.  
  662. Padding (zeros) is added by Quick C to allow for expansion of the object module 
  663. during incremental compilation and linking. 
  664.  
  665.  
  666. Notes: Negative deltas are allowed. 
  667.  
  668.  
  669. ΓòÉΓòÉΓòÉ 2.4.7. 88H LNKDIR  C++ Directives Record (comment class A0, subtype 05) ΓòÉΓòÉΓòÉ
  670.  
  671.  
  672. Description: 
  673.  
  674. This record is used by the compiler to pass directives and flags to the linker. 
  675.  
  676.  
  677. Record format: 
  678.  
  679. The subrecord format is 
  680.  
  681.     1          1               1                     1      (bytes)
  682. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  683. Γöé  05    Γöé Bit Flags    Γöé Pseudocode Vers   Γöé  CV Vers              Γöé
  684. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  685.  
  686. LNKDIR record type definition 
  687.  
  688. The format of the Bit Flags byte is: 
  689.  
  690.      8       1     1    1    1    1    1        1         1 (bits)
  691. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  692. Γöé  05     Γöé  0  Γöé  0 Γöé  0 Γöé  0 Γöé 0  Γöé Run   Γöé Omit CV  Γöé  New     Γöé
  693. Γöé         Γöé     Γöé    Γöé    Γöé    Γöé    Γöé MPC   Γöé Publics  Γöé  EXE     Γöé
  694. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  695.  
  696. BIT FLAGS byte definition 
  697.  
  698. The low-order bit, if set, indicates that LINK386 should output the new EXE 
  699. format; this flag is ignored for all but linking of Pseudocode applications. 
  700. (Pseudocode requires a segmented executable) . 
  701.  
  702. The second low-order bit indicates that LINK386 should not output the $PUBLICS 
  703. subsection of the CodeView info. 
  704.  
  705. The third low-order bit indicates that MPC (Microsoft Make Pseudocode Utility) 
  706. should be run. 
  707.  
  708. Pseudocode Version One byte indicating the Pseudocode interpreter version 
  709. number. 
  710.  
  711. CodeView Version One byte indicating the CodeView version number. 
  712.  
  713.  
  714. Notes: 
  715.  
  716. The presence of this record in an object module will indicate the presence of 
  717. global symbols records. The linker will not emit a Publics section for those 
  718. modules with this comment record and a $SYMBOLS section. 
  719.  
  720.  
  721. ΓòÉΓòÉΓòÉ 2.4.8. 88H LIBMOD Library Module Name Record (comment class A3) ΓòÉΓòÉΓòÉ
  722.  
  723.  
  724. Description: 
  725.  
  726. The LIBMOD comment record is used only by the LIB utility, not by LINK. It 
  727. gives the name of an object module within a library, allowing LIB to preserve 
  728. the library file name in the THEADR record and still identify the module names 
  729. that make up the library. Since the module names is the basename of the .OBJ 
  730. file that was built into the library, it may be completely different from the 
  731. final library name. 
  732.  
  733.  
  734. Record format: 
  735.  
  736. The subrecord format is 
  737.  
  738.      1      <variable>                      (bytes)
  739. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  740. Γöé  A3    Γöé  Module Name                                      Γöé
  741. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  742.  
  743. LIBMOD record type definition 
  744.  
  745. The record contains only the ASCII string of the module name, in <coutn, char> 
  746. format. The module name has no path and no extension, just the base of the 
  747. module name. 
  748.  
  749.  
  750. Notes: 
  751.  
  752. LIB adds a LIBMOD record when a .OBJ file is added to a library and strips the 
  753. LIBMOD record when a .OBJ file is removed from a library, so typically this 
  754. record only exists in .LIB files. 
  755.  
  756. There will be one LIBMOD record in the library file for each object module that 
  757. was combined to build the library. 
  758.  
  759. LINK386 ignores LIBMOD coment records. 
  760.  
  761.  
  762. ΓòÉΓòÉΓòÉ 2.4.9. 88H EXESTR Executable String Record (comment class A4) ΓòÉΓòÉΓòÉ
  763.  
  764.  
  765. Description: 
  766.  
  767. The EXESTR comment record implements the ANSI and XENIX/UNIX features in C: 
  768.  
  769. o #pragma comment(exestr, <char-sequence>) 
  770.  
  771. o #ident string 
  772.  
  773.  
  774.   Record format: 
  775.  
  776.   The subrecord format is 
  777.  
  778.  
  779.          1      <variable>                                (bytes)
  780.     ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  781.     Γöé  A4    Γöé  arbitrary text                                   Γöé
  782.     ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  783.  
  784.   EXESTR record type definition 
  785.  
  786.   The linker will copy the text in the "arbitrary text" field byte for byte to 
  787.   the end of the executable file. The text will not be included in the program 
  788.   load image. 
  789.  
  790.  
  791.   Notes: 
  792.  
  793.   If CodeView information is present, the text will not be at the end of the 
  794.   file, but somewhere before so as not to interfere with the Code View 
  795.   signature. 
  796.  
  797.   There is no limit to the number of EXESTR comment records. 
  798.  
  799.  
  800. ΓòÉΓòÉΓòÉ 2.4.10. 88H INCERR Incremental Compilation Error (comment class A6) ΓòÉΓòÉΓòÉ
  801.  
  802.  
  803. Description: 
  804.  
  805. This comment record will cause the linker to terminate with the fatal error 
  806. saying something to the effect of "inavlid object -- error encountered during 
  807. incremental compilation". 
  808.  
  809. The purpose of this is for the case when an incremental compilation fails and 
  810. the user tries to manually link. the object module cannot be deleted, in order 
  811. to preserve the base for the next incremental compilation. 
  812.  
  813.  
  814. Record format: 
  815.  
  816. The subrecord format is 
  817.  
  818.         1      (bytes)
  819. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  820. Γöé  A6    Γöé  No fields                                        Γöé
  821. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  822.  
  823. INCERR record type definition 
  824.  
  825.  
  826. ΓòÉΓòÉΓòÉ 2.4.11. 88H NOPAD  No Segment Padding (comment class A6) ΓòÉΓòÉΓòÉ
  827.  
  828.  
  829. Description: 
  830.  
  831. This comment record identifies a set of segments which are to be excluded from 
  832. the padding imposed with the /PADDATA or /PADCODE options. 
  833.  
  834.  
  835. Record format: 
  836.  
  837. The subrecord format is 
  838.  
  839.     1         1 or 2 (bytes)
  840. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  841. Γöé  A7    Γöé  SEGDEF Index                                     Γöé
  842. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  843.  
  844. NOPAD record type definition 
  845.  
  846. The SEGDEF Index is the standard OMF index type od 1 or 2 bytes. It may be 
  847. repeated. 
  848. Notes: 
  849.  
  850. LINK386 ignores NOPAD coment records. 
  851.  
  852.  
  853. ΓòÉΓòÉΓòÉ 2.4.12. 88H WKEXT Weak Extern Record (comment class A8) ΓòÉΓòÉΓòÉ
  854.  
  855.  
  856. Description: 
  857.  
  858. This record marks a set of external names as "weak", and for every weak extern 
  859. associates another external name to use as the default resolution. 
  860.  
  861.  
  862. Record format: 
  863.  
  864. The subrecord format is 
  865.  
  866.      1       1 or 2              1 or 2                 (bytes)
  867. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  868. Γöé  A8    Γöé Weak EXTDEF Index Γöé Default resolution EXTDEF Index Γöé
  869. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  870.           <-------------------- Repeated --------------------->
  871.  
  872. WEAK EXTERN record type definition 
  873.  
  874. The Weak EXTDEF Index field is the 1 or 2 byte index to the EXTDEF of the 
  875. extern which is weak. 
  876.  
  877. The Default Resolution EXTDEF Index is the 1 or 2 byte index to the EXTDEF of 
  878. the extern that will be used to resolve the extern if no "stronger" link is 
  879. found to resolve it. 
  880.  
  881.  
  882. Notes: 
  883.  
  884. There are two ways to cancel the "weakness" of a weak extern; both result in 
  885. the extern becoming a "strong" extern (the same as an EXTDEF). They are 
  886.  
  887. o if a PUBDEF for the weak extern is linked in, 
  888.  
  889. o if an EXTDEF for the weak extern is found in another module (including 
  890.   libraries). 
  891.  
  892. If the weak extern becomes strong, then it must be resolved with a matching 
  893. PUBDEF, just like a regular EXTDEF. If a weak exten has not become strong by 
  894. the end of the linking process, then the default resolution is used. 
  895.  
  896. If two weak externs for the same symbol in different modules have differing 
  897. default resolutions, LINK386 will emit a warning. 
  898.  
  899. Weak externs do not query libraries for resolution; if an extern is still weak 
  900. when libraries are searched, it stays weak and gets the default resolution. 
  901. However, if a library module is linked in for other reasons (say, to resolve 
  902. strong externs) and there are EXTDEFs for symbols that were weak, the symbols 
  903. become strong. 
  904.  
  905. For example, suppose there is a weak extern for "foo" with a default resolution 
  906. name of "bar". If there is a PUBDEF for "foo" in some library module which 
  907. would not otherwise be linked in, then the library module is not linked in, and 
  908. any references to "foo" are resolved to "bar". However, if the library module 
  909. is linked in for other reasons, for example to resolve references to a strong 
  910. extern named "bletch", then "foo" will be resolved by the PUBDEF from the 
  911. library, not to the default resolution "bar". 
  912.  
  913. WKEXTs are best understood by explaining why they were added in the first 
  914. place. The minimum BASIC runtime library in the past consisted of a large 
  915. amount of code which was always linked in, even for the smallest program. Most 
  916. of this code was never called directly by the user, but it was called 
  917. indirectly from other routines in other libraries, so it had to be linked in to 
  918. resolve the external references. 
  919.  
  920. For instance, the floating point library was linked in even if the user's 
  921. program did not use floating point, because the PRINT library routine contained 
  922. calls to the floating point library for support to print floating point 
  923. numbers. 
  924.  
  925. The solution was to make the function calls between the libraries into weak 
  926. externals, with the default resolution set to a small stub routine. If the user 
  927. never used a language construct or feature that needed the additional library 
  928. support, then no strong extern would be generated by the compiler and the 
  929. default resolution (to the stub routine) would be used. However, if the user 
  930. accessed the library's routines or used constructs that required the library's 
  931. support, a strong extern would be generated by the compiler to cancel the 
  932. effect of the weak extern, and the library module would be linked in. This 
  933. required that the compiler know a lot about which libraries are needed for 
  934. which constructs, but the resulting executable was much smaller. 
  935.  
  936.  
  937. ΓòÉΓòÉΓòÉ 2.4.13. 88H LZEXT Lazy Extern Record (comment class A9) ΓòÉΓòÉΓòÉ
  938.  
  939.  
  940. Description: 
  941.  
  942. This record marks a set of external names as "lazy", and for every lazy extern 
  943. associates another external name to use as the default resolution. 
  944.  
  945.  
  946. Record format: 
  947.  
  948. The subrecord format is 
  949.  
  950.     1       1 or 2              1 or 2                 (bytes)
  951. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  952. Γöé  A8    Γöé Lazy EXTDEF Index Γöé Default resolution EXTDEF Index Γöé
  953. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  954.           <-------------------- Repeated --------------------->
  955.  
  956. LAZY EXTERN record type definition 
  957.  
  958. The Lazy EXTDEF Index field is the 1 or 2 byte index to the EXTDEF of the 
  959. extern which is weak. 
  960.  
  961. The Default Resolution EXTDEF Index is the 1 or 2 byte index to the EXTDEF of 
  962. the extern that will be used to resolve the extern if no "stronger" link is 
  963. found to resolve it. 
  964.  
  965.  
  966. Notes: 
  967.  
  968. There are two ways to cancel the "laziness" of a lazy extern; both result in 
  969. the extern becoming a "strong" extern (the same as an EXTDEF). They are 
  970.  
  971. o if a PUBDEF for the weak extern is linked in, 
  972.  
  973. o if an EXTDEF for the weak extern is found in another module (including 
  974.   libraries). 
  975.  
  976. If a lazy extern becomes strong, then it must be resolved with a matching 
  977. PUBDEF, just like a regular EXTDEF. If a lazy extern has not become strong by 
  978. the end of the linking process, then the default resolution is used. 
  979.  
  980. If two weak externs for the same symbol in different modules have differing 
  981. default resolutions, LINK will emit a warning. 
  982.  
  983. Unlike waek externs, lazy externs do not query libraries for resolution; if an 
  984. extern is still lazy when libraries are searched, it stays lazy and gets the 
  985. default resolution. 
  986.  
  987. LINK386 ignores LZEXT coment records. 
  988.  
  989.  
  990. ΓòÉΓòÉΓòÉ 2.4.14. 88H IDMDLL Identifier Manipulator DLL (comment class AF) ΓòÉΓòÉΓòÉ
  991.  
  992.  
  993. Description: This record provides the name and initialization parmameters of a 
  994. DLL that will demangle the compiler generated mangled names. The linker will 
  995. use this DLL when displaying error messages. 
  996. Record format: 
  997.  
  998.      The Subrecord Format is:
  999.  
  1000.           1      1         <-Name Length-> 1         <-Parms Length->
  1001.          ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1002.          Γöé 0xAF Γöé Name    Γöé DLL Name      Γöé Parms   Γöé Demangle Init  Γöé
  1003.          Γöé      Γöé Length  Γöé               Γöé Length  Γöé Parameters     Γöé
  1004.          ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1005.  
  1006. IDMDLL  Identifier Manipulator DLL subrecord format definition 
  1007.  
  1008. The Name Length byte gives the number of characters in the DLL Name; the DLL 
  1009. Name itself is ASCII. 
  1010.  
  1011. The DLL Name is the name of the Identifier Manipulator Dynamic Link Library 
  1012. provided by the language.  This DLL is used to demangle an internal identifier 
  1013. when that identifier will be displayed in an error message. 
  1014.  
  1015. The Parms Length byte gives the number of characters in the Demangle Init 
  1016. Parameters; the Demangle Init Parameters itself is ASCII. 
  1017.  
  1018. The Demangle Init Parameters provides information (to the DLL) on how internal 
  1019. identifiers are mangled. 
  1020.  
  1021. The linker will not scan forward for an IDMDLL record when an identifier will 
  1022. be displayed.  This record should occur near the beginning of the file. 
  1023.  
  1024. IDMDLL class COMENT records are processed during pass 1 of the linker. 
  1025. Notes: 
  1026.  
  1027. Because object oriented compilers allow for two functions to have the same name 
  1028. but different parameters, the compiler uniquely identifies each function by 
  1029. changing the name of the function. This is known as mangling. An example of 
  1030. this would be: 
  1031.  
  1032.  
  1033.              User Prototype                 Compiler Generated
  1034.                                             Mangled Name
  1035.              --------------------------     ------------------
  1036.              void doit( int, float )        _doit__Fif
  1037.              void doit( const char * )      _doit__FCPc
  1038.  
  1039. The user will usually not be aware that the compiler changed the name, so it is 
  1040. neccessary for the linker to demangle the compiler generated name when printing 
  1041. out linker error messages. 
  1042.  
  1043. The dynamic link library (DLL) provided by an object oriented language compiler 
  1044. must contain two 16-bit functions which employ the pascal calling convention: 
  1045.  
  1046. INITDEMANGLEID       Receive initialization parameters specified in the IDMDLL 
  1047.                      COMENT record. 
  1048.  
  1049. DEMANGLEID           Demangles first parameter (identifier, "_add__i_ii") to 
  1050.                      appropriate prototype (i.e. "int add(int, int)") and 
  1051.                      returns result in second parameter. 
  1052.  
  1053. The INITDEMANGLEID and DEMANGLEID entry points may be called more than once. 
  1054.  
  1055. All functions must return true (non-zero) if the call is successful and false 
  1056. (zero) if the call fails.  In this manner the linker can ignore whatever is 
  1057. returned in the second parameter of the DEMANGLEID fuction if the function 
  1058. returns false. When calling DEMANGLEID, the linker will pass in the address of 
  1059. a buffer for the second parameter, and the size of the buffer for the third 
  1060. parameter. 
  1061.  
  1062. All string parameters must be length-prefixed ASCII strings except for 
  1063. pszPrototype, parameter 2 for DEMANGLEID (because the length might not fit in a 
  1064. byte). Function prototypes for these routines look like: 
  1065.  
  1066.   unsigned short pascal far INITDEMANGLEID(char far * psInitParms);
  1067.  
  1068.   unsigned short pascal far DEMANGLEID(char far * psMangledName,
  1069.                                        char far * pszPrototype,
  1070.                                        unsigned long BufferLen);
  1071.  
  1072. Note:  Languages may also wish to provide 32-bit functions for use by 32-bit 
  1073. linkers, when they become available.  Function prototypes look like: 
  1074.  
  1075.   unsigned long _system InitDemangleID32(char * psInitParms);
  1076.  
  1077.   unsigned long _system DemangleID32(char * psMangledName,
  1078.                                      char * pszPrototype,
  1079.                                      unsigned long BufferLen);
  1080.  
  1081.  
  1082. ΓòÉΓòÉΓòÉ 2.4.15. 88H PharLap Format Record (comment class AA) ΓòÉΓòÉΓòÉ
  1083.  
  1084.  
  1085. Description: 
  1086.  
  1087. The OMF extension designed by PharLap is called "Easy OMF-386" and changes to 
  1088. the affected record types are described in this section. 
  1089.  
  1090. Most modifications involve only a substitution of 32-bit (4-byte) fields for 
  1091. what were formerly 16-bit (2-byte) fields. In the two cases where the changes 
  1092. involve more than just a field size (in the SEGDEF and FIXUPP records), the 
  1093. information is mentioned in this section but complete details are given in the 
  1094. sections describing the specific records. 
  1095.  
  1096.  
  1097. Record format: 
  1098.  
  1099. The subrecord format is 
  1100.  
  1101. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1102. Γöé  AA    Γöé  "80386"                        Γöé
  1103. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1104.  
  1105.  
  1106. Notes: 
  1107.  
  1108. The AA comment record should come immediately after the sole THEADR record. 
  1109. Presence of the comment record indicates that the following other record types 
  1110. have fields that are expanded from 16-bit to 32-bit values: 
  1111.  
  1112.  SEGDEF    offset field and offset field length 
  1113.  
  1114.  PUBDEF    offset field 
  1115.  
  1116.  LEDATA    offset field 
  1117.  
  1118.  LIDATA    offset field (note that repeat count field is still 16 bits) 
  1119.  
  1120.  FIXUPP    target displacement in explicit FIXUP subrecord 
  1121.  
  1122.  BLKDEF    return address offset field 
  1123.  
  1124.  LINNUM    offset field 
  1125.  
  1126.  MODEND    target displacement field 
  1127.  
  1128. FIXUPP records have the added Loc values of 5 and 6. See the FIXUPP section of 
  1129. this document for details. 
  1130.  
  1131. SEGDEF records have added alignment values (for 4-byte alignment and 4K byte 
  1132. alignment) and an added optional byte at the end which contains the Use16/Use32 
  1133. bit flag and access attributes (read/write/execute) for the segment. See the 
  1134. SEGDEF section of this document for details. 
  1135.  
  1136. LINK386 ignores PHARLAP coment records. 
  1137.  
  1138.  
  1139. ΓòÉΓòÉΓòÉ 2.4.16. 8AH or 8BH MODEND  Module End Record ΓòÉΓòÉΓòÉ
  1140.  
  1141.  
  1142. Description: The MODEND record denotes the end of the object module. It also 
  1143. indicates whether the object module contains a main routine in a program, and 
  1144. it can, optionally, contain a reference to a programs entry point. 
  1145. Record format: 
  1146.  
  1147.    1 byte  2 bytes
  1148. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  1149. Γöé   8A  Γöé Record         Γöé
  1150. Γöéor 8B  Γöé  Length        Γöé
  1151. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  1152.  
  1153.           1 byte  1 byte  1 or 2    1 or 2     2 or 4 bytes  1 byte
  1154.        --ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1155.          Γöé ModuleΓöé End   Γöé Frame   Γöé Target  Γöé Target       ΓöéChk sumΓöé
  1156.          Γöé  Type Γöé  Data Γöé  Datum  Γöé  Datum  Γöé  DisplacementΓöé or 0  Γöé
  1157.          Γöé       Γöé       Γöé   Index Γöé   Index Γöé              Γöé       Γöé
  1158.        --ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1159.                   <------ Start Address, conditional ------>
  1160.  
  1161. MODEND  module end record 
  1162.  
  1163. where: 
  1164.  
  1165.  
  1166. Module Type 
  1167.  
  1168. The module type byte is bit-significant; layout is: 
  1169.  
  1170.      ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1171.      Γöé   MATTR    Γöé Seg Γöé  0  Γöé  0  Γöé  0  Γöé  0  Γöé  X  Γöé
  1172.      Γöé Main  Strt Γöé Bit Γöé     Γöé     Γöé     Γöé     Γöé     Γöé
  1173.      ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1174.         2 bits      1     1     1     1     1     1
  1175.  
  1176. where: 
  1177.  
  1178. MATTR   is a 2-bit field 
  1179.  
  1180. Main  is set if the module is a main module 
  1181.  
  1182. Strt  is set if the module contains a start address; if this bit is set, the 
  1183.       field starting with the EndDat byte is present and specifies the start 
  1184.       address. 
  1185.  
  1186. SegBit    Reserved. Only 0 is supported by OS/2. 
  1187.  
  1188. X         This bit should be set (as described for OMF86).  However, as is the 
  1189.           case for the OMF86 linkers, the value will be ignored. 
  1190.  
  1191.  
  1192. Start Address 
  1193.  
  1194. The Start Address subfield is present only if the Strt bit in the Module Type 
  1195. byte is set.  Its format is identical to the FixDat, Frame Datum, Target Datum, 
  1196. and Target displacement in a FIXUP subrecord of a FIXUPP record. The 
  1197. displacement (if present) is a 4 byte field if the record type is 8BH and is a 
  1198. 2-byte field if the record type is 8AH. This value provides the initial 
  1199. contents of CS:(E)IP. 
  1200.  
  1201. The start address must be given in th MODEND record of the root module if 
  1202. overlays are used. 
  1203. Notes: 
  1204.  
  1205. A MODEND record can appear only as the last record in an object module. 
  1206.  
  1207. It is assumed that the link pass separator comment record (COMENT A2, subtype 
  1208. 01) will not be present in a module whose MODEND record contains a program 
  1209. starting address. 
  1210.  
  1211.  
  1212. ΓòÉΓòÉΓòÉ 2.4.17. 8CH EXTDEF External Names Definition Record ΓòÉΓòÉΓòÉ
  1213.  
  1214.  
  1215. Description: The EXTDEF record contains a list of symbolic external references 
  1216. -- that is, references to symbols defined in other object modules. The linker 
  1217. resolves external references by matching the symbols declared in EXTDEF records 
  1218. with symbols declared in PUBDEF records. 
  1219. Record format: 
  1220.  
  1221.  1 byte  2 bytes
  1222. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  1223. Γöé  8C   Γöé Record         Γöé
  1224. Γöé       Γöé  Length        Γöé
  1225. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  1226.  
  1227.                  1 byte <string>      1 or 2   1 byte
  1228.               --Γö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1229.                 ΓöéString ΓöéExternal     ΓöéType    ΓöéChk sumΓöé
  1230.                 Γöé LengthΓöé Name string Γöé Index  Γöé or 0  Γöé
  1231.               --Γö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1232.                  <-------- repeated --------->
  1233.  
  1234. EXTDEF  external names definition record 
  1235.  
  1236. This record provides a list of unresolved references, identified by name and 
  1237. with optional associated type information. The external names are ordered by 
  1238. occurrence jointly with the COMDEF and LEXTDEF records and referenced by an 
  1239. index in other records (FIXUPPs); the name may not be null. Indices start from 
  1240. one. 
  1241.  
  1242. String Length is a 1-byte field containing the length of the name field that 
  1243. follows it. The length of the name is restricted to 255 bytes. 
  1244.  
  1245. The Type Index is encoded as an index field and contains debug information. No 
  1246. type checking is performed by the linker. 
  1247. Notes: 
  1248.  
  1249. The linker imposes a limit of 1023 external names. 
  1250.  
  1251. Any EXTDEF records in an object module must appear before the FIXUPP records 
  1252. that reference them. 
  1253.  
  1254. Resolution of an external reference is by name match (case sensitive) and 
  1255. symbol type match.  The search first looks for a matching name, in the 
  1256. sequence: 
  1257.  
  1258.  1. Searches PUBDEF and COMDEF for resolution. 
  1259.  
  1260.  2. If linking a segmented executable, searches imported names (IMPDEF). 
  1261.  
  1262.  3. If this is not a DLL, then searches for an export (EXPDEF) with the same 
  1263.     name -- a self-imported alias. 
  1264.  
  1265.  4. Searches for the symbol name among undefined symbols. If the reference is 
  1266.     to a weak extern, then the default resolution is used. If the reference is 
  1267.     to a strong extern, then it's an undefined external and a link error is 
  1268.     generated. 
  1269.  
  1270. All external references must be resolved at link time (using the above search 
  1271. order). Even though the linker produces an executable file for and unsuccessful 
  1272. link session, an error bit is set in the header which prevents the loader from 
  1273. running the executable. 
  1274.  
  1275.  
  1276. ΓòÉΓòÉΓòÉ 2.4.18. 90H or 91H PUBDEF Public Names Definition Record ΓòÉΓòÉΓòÉ
  1277.  
  1278.  
  1279. Description: The PUBDEF record contains a list of public names. It makes items 
  1280. defined in this object module available to satisfy external references in other 
  1281. modules with which it is bound or linked. 
  1282.  
  1283. The symbols are also available for export if so indicated in an EXPDEF comment 
  1284. record. 
  1285. Record format: 
  1286.  
  1287.   1 byte  2 bytes
  1288. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  1289. Γöé  90   Γöé Record         Γöé
  1290. Γöé  or   Γöé  Length        Γöé
  1291. Γöé  91   Γöé                Γöé
  1292. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  1293.  
  1294.       1 or 2   1 or 2   2 bytes  1 byte <string>  2or4 bytes  1 or 2   1 byte
  1295.    --ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1296.      ΓöéBase    ΓöéBase    ΓöéBase    ΓöéStr.  ΓöéPublic   ΓöéPublic    ΓöéType    ΓöéChk sumΓöé
  1297.      Γöé Group  Γöé SegmentΓöé Frame  Γöé Len  ΓöéName str.Γöé Offset   Γöé Index  Γöéor 0   Γöé
  1298.      Γöé  Index Γöé  Index Γöé        Γöé      Γöé         Γöé          Γöé        Γöé       Γöé
  1299.    --ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1300.                         <cnd1>   <------------ repeated ------------>
  1301.  
  1302. PUBDEF  Public Names Definition Record 
  1303.  
  1304. Base Group, Base Segment and Base Frame 
  1305.  
  1306. The base group and segment are indices specifying previously defined SEGDEF and 
  1307. GRPDEF records. The group index may be zero, meaning that no group is 
  1308. associated with this PUBDEF record. 
  1309.  
  1310. The Base Frame field is present only if the Base Segment is zero, but the 
  1311. content of the Base Frame is always ignored by the linker. 
  1312.  
  1313. The Segment Index is normally nonzero and no Base Frame is present. 
  1314.  
  1315. The Base Frame is normally used for absolute addressing when the Group and 
  1316. Segment Index are both zero. Absolute addressing is not fully supported in the 
  1317. linker. 
  1318. Public name, Public Offset and Type Index 
  1319.  
  1320. The public name string is in <count, char> form and cannot be null. The maximum 
  1321. length of a public name is 255 bytes. 
  1322.  
  1323. The public offset is a  2 or 4 byte numeric field containing the offset of the 
  1324. location referred to by the public name. This offset is assumed to lie within 
  1325. the segment, group or frame specified in the public base field. 
  1326.  
  1327. The Type Index field is encoded in index format; it contains either debug type 
  1328. information or zero. This field is ignored by the OS/2 2.0 linker. 
  1329. NOTES: 
  1330.  
  1331. All defined functions and initialized global variables generate PUBDEF records. 
  1332.  
  1333. Any PUBDEF records in an object module must appear after the GRPDEF and SEGDEF 
  1334. records to which they refer. 
  1335.  
  1336. The IBM C Compiler will generate PUBDEF records for all defined functions and 
  1337. initialized global variables. Globals for scalars that are initialized to zero 
  1338. produce COMDEF records. 
  1339.  
  1340. Record type 90H uses 16-bit encoding of the Public Offset, but it is 
  1341. zero-extended to 32 bits if applied to Use32 segments. 
  1342.  
  1343.  
  1344. ΓòÉΓòÉΓòÉ 2.4.19. 94H or 95H LINNUM  Line Number Record ΓòÉΓòÉΓòÉ
  1345.  
  1346.  
  1347. Description: The LINNUM record relates line number within language source 
  1348. statements to addresses in the object code. 
  1349. Record format: 
  1350.  
  1351.  1 byte  2 bytes
  1352. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  1353. Γöé  94   Γöé Record         Γöé
  1354. Γöé  or   Γöé  Length        Γöé
  1355. Γöé  95   Γöé                Γöé
  1356. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  1357.  
  1358.            1 or 2   1 or 2     <variable>        1 byte
  1359.        --ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1360.          Γöé Base    Γöé Base    Γöé  Debugger Style  ΓöéChk SumΓöé
  1361.          Γöé  Group  Γöé  SegmentΓöé   Specific       Γöéor 0   Γöé
  1362.          Γöé   Index Γöé   Index Γöé    Information   Γöé       Γöé
  1363.        --ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1364.                               <--- repeated --->
  1365.  
  1366. LINNUM  line number record 
  1367.  
  1368. Associates a source line number with translated code or data. The LINNUM record 
  1369. is only generated when the debug option is selected and is therefore specific 
  1370. to the debug information. Refer to the specific debug documentation for more 
  1371. information. 
  1372.  
  1373.  
  1374. Base Group and Base Segment The Base group and Base segment are indices 
  1375. specifying previously defined GRPDEF and SEGDEF records.  The group index is 
  1376. ignored. The segment index must be nonzero unless the debugger style is version 
  1377. 3 or greater of the IBM PM debugger format. 
  1378.  
  1379.  
  1380. ΓòÉΓòÉΓòÉ 2.4.20. 96H LNAMES  List of Names Record ΓòÉΓòÉΓòÉ
  1381.  
  1382.  
  1383. Description: The LNAMES record is a list of names that can be referenced by 
  1384. subsequent SEGDEF and GRPDEF records in the object module. 
  1385.  
  1386. The names are ordered by occurrence and referenced by index from subsequent 
  1387. records. More than one LNAMES record may appear. The names themselves are used 
  1388. as segment, class and group names. 
  1389.  
  1390.    1 byte  2 bytes
  1391.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  1392.   Γöé  96   Γöé Record         Γöé
  1393.   Γöé       Γöé  Length        Γöé
  1394.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  1395.  
  1396.           <-------- String Length ------->  1 byte
  1397.        --ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1398.          ΓöéStringΓöé     Name                 ΓöéChk SumΓöé
  1399.          ΓöéLengthΓöé       String             Γöéor 0   Γöé
  1400.        --ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1401.           <---------- repeated ----------->
  1402.  
  1403. LNAMES list of names record 
  1404.  
  1405. Each name appears in count/char format, and a null name is valid.  The 
  1406. character set is ASCII. 
  1407.  
  1408.  
  1409. NOTES: 
  1410.  
  1411. The linker imposes a limit of 255 logical names per object module. 
  1412.  
  1413. Any LNAMES records in an object module must appear before the records that 
  1414. refer to them. Because it does not refer to any other type of object record, an 
  1415. LNAMES record usually appears near the start of an object module. 
  1416.  
  1417.  
  1418. ΓòÉΓòÉΓòÉ 2.4.21. 98H or 99H SEGDEF  Segment Definition Record ΓòÉΓòÉΓòÉ
  1419.  
  1420.  
  1421. Description: The SEGDEF record describes a logical segment in an object module. 
  1422. It defines the segment's name, length and alignment, as well as the way the 
  1423. segment can be combined with other logical segments at bind, link and load 
  1424. time. 
  1425.  
  1426. Object records that follow the SEGDEF record can refer to it to identify a 
  1427. particular segment. The SEGDEF records are ordered by occurrence and are 
  1428. referenced by segment indexes (origin 1) in subsequent records. 
  1429. Record format: 
  1430.  
  1431.  1 byte  2 bytes
  1432. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  1433. Γöé  98   Γöé  Record        Γöé
  1434. Γöé  or   Γöé  Length        Γöé
  1435. Γöé  99   Γöé                Γöé
  1436. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  1437.  
  1438.           <variable>   2 or 4 bytes  1 or 2   1 or 2   1 or 2  1 byte
  1439.        --ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1440.          Γöé Segment    Γöé Segment    Γöé SegmentΓöé Class  ΓöéOverlayΓöéChk SumΓöé
  1441.          Γöé Attribute  Γöé Length     Γöé Name   Γöé Name   ΓöéName   Γöéor 0   Γöé
  1442.          Γöé            Γöé            Γöé Index  Γöé Index  ΓöéIndex  Γöé       Γöé
  1443.        --ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1444.  
  1445. SEGDEF  segment definition record 
  1446.  
  1447. Segment Attributes 
  1448.  
  1449. The segment attribute is bit-significant; the layout is: 
  1450.  
  1451.   <-3 bits-> <-3 bits->  <-1 bit ->  <-1 bit ->   2 bytes    1 byte
  1452.  ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1453.  Γöé A        Γöé C         Γöé B         Γöé P         Γöé Frame     Γöé Offset    Γöé
  1454.  Γöé          Γöé           Γöé           Γöé           Γöé   Number  Γöé           Γöé
  1455.  ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1456.                                                    <cond>      <cond>
  1457.  
  1458. The fields have the following meaning: 
  1459.  
  1460. A   alignment, a 3-bit field, which specifies the alignment required when this 
  1461.     program segment is placed within a logical segment.  Values are: 
  1462.  
  1463.    0  absolute segment 
  1464.    1  relocatable, byte aligned 
  1465.    2  relocatable, word (2 byte, 16-bit) aligned 
  1466.    3  relocatable, paragraph (16 byte) aligned 
  1467.    4  relocatable, aligned on page (4K byte) boundary. 
  1468.    5  relocatable, aligned on double word (4 byte) boundary 
  1469.    6  not supported 
  1470.    7  not defined 
  1471.  
  1472.     The new values are A=4 and A=5.  Dword alignment is expected to be useful 
  1473.     as 32-bit memory paths become more prevalent. Page-align maps to the 80386 
  1474.     hardware page size of 4K bytes. 
  1475.  
  1476. C   combination, a 3-bit field, which determines the way the program segment is 
  1477.     mapped into a logical segment. Values are: 
  1478.  
  1479.    0  private, do not combine with any other program segment 
  1480.    1  reserved 
  1481.    2  public, combine by appending at an offset which meets the alignment 
  1482.       requirement 
  1483.    3  reserved 
  1484.    4  same as C=2 (public) 
  1485.    5  stack, combine as for C=2. 
  1486.    6  common, combine by overlay using maximum size 
  1487.    7  same as C=2 (public) 
  1488.  
  1489. B   big, used as the high order bit of the segment length field.  If this bit 
  1490.     is set the segment length value must be zero and the segment's size is 2╨║32 
  1491.     or 4Gbytes long. 
  1492.  
  1493. P   Holds the descriptor table B/D bit value (this is the descriptor table D 
  1494.     bit for code segments and the B bit for data segments). 
  1495.  
  1496.     If zero, then segment is no larger than 64K (if data) and 16-bit addressing 
  1497.     and operands are the default (if code). This is a Use16 segment. 
  1498.  
  1499.     If not zero, then the segment is no larger than 64k (if data) and 32-bit 
  1500.     addressing and operands are the default (if code). This is a Use32 segment. 
  1501.  
  1502.     Note that this is the only method for defining Use32 segments. 
  1503.  
  1504.  
  1505. Segment Length 
  1506.  
  1507. The Segment Length is a 2 or 4 byte numeric quantity and specifies the number 
  1508. of bytes in this program segment. 
  1509. NOTE For record type 98H, the length can be from 0 to 64K; if a segment is 
  1510. exactly 64KB in size, segemtn length should be 0 and the B field in the ACPB 
  1511. byte should be 1. For record type 99H, the length can be from 0 to 4G; If 
  1512. segment is exactly 4Gbytes in size, segment length should be set to zero and 
  1513. the B field in the ACBP byte should be set to 1. 
  1514. Segment Name Index, Class Name Index, Overlay Name Index 
  1515.  
  1516. The three name indices refer to names that appeared in previous LNAMES 
  1517. record(s). The linker ignores the overlay name index. The full name of a 
  1518. segment consists of the segment and class names. Segments in different object 
  1519. modules are normally combined according to the A and C values if their full 
  1520. names are identical. These indices must be nonzero, although the name itself 
  1521. may be null. 
  1522.  
  1523. The segment name index identifies the segment with a name. the name need not be 
  1524. unique -- other segments of the same name will be concatenated onto the first 
  1525. segment with that name. The name may have been assigned by the programmer, or 
  1526. it may have been generated by the compiler. 
  1527.  
  1528. The class name index identifies the segment with a class name (such as CODE, 
  1529. DATA or STACK). The linker places segments with the same class name into a 
  1530. contiguous area of memory in the run-time memory map. 
  1531.  
  1532. The overlay index is ignored by the linker. 
  1533. Notes: 
  1534.  
  1535. The linker imposes a limit of 255 SEGDEF records per object module. 
  1536.  
  1537. The following name/class combinations are reserved: 
  1538.  
  1539. $$TYPE Reserved for Debug types. 
  1540. $$SYMBOLS Reserved for Debug names. 
  1541. CODE32 Reserved for IBM C Compiler. 
  1542. DATA32 Reserved for IBM C Compiler. 
  1543. CONST32 Reserved for IBM C Compiler. 
  1544. BSS32 Reserved for IBM C Compiler. 
  1545. DGROUP32 Reserved for IBM C Compiler. 
  1546.  
  1547.  
  1548. ΓòÉΓòÉΓòÉ 2.4.22. 9AH GRPDEF  Group Definition Record ΓòÉΓòÉΓòÉ
  1549.  
  1550.  
  1551. Description: The GRPDEF record causes the program segments defined by SEGDEF 
  1552. records to be collected together (grouped). For OS/2 2.0, the segments are 
  1553. combined into a logical segment which is to be addressed through a single 
  1554. selector for flat memory. 
  1555. Record format: 
  1556.  
  1557.     1 byte      2 bytes       1 or 2       1      1 or 2       1 (bytes)
  1558.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1559.   Γöé  9A   Γöé Record         ΓöéGroup      Γöé  FF   Γöé  Segment    ΓöéChk Sum Γöé
  1560.   Γöé       Γöé  Length        ΓöéName Index Γöé       Γöé  Def. Index Γöéor 0    Γöé
  1561.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1562.                                         <---- repeated ---->
  1563.  
  1564. GRPDEF  group definition record 
  1565.  
  1566. This record causes the program segments identified by SEGDEF records to be 
  1567. collected together (grouped) within a logical segment which is to be addressed 
  1568. through a single selector. 
  1569.  
  1570.  
  1571. Group Name 
  1572.  
  1573. The group name is specified as an index into a previously defined LNAMES name 
  1574. and must be nonzero. 
  1575.  
  1576. Groups from different object modules are coalesced if their names are 
  1577. identical. 
  1578.  
  1579.  
  1580. Group Components 
  1581.  
  1582. The group's components are segments, specified as indices into previously 
  1583. defined SEGDEF records. 
  1584.  
  1585. The first byte of each group component is a type field for the remainder of the 
  1586. component. The linker requires a type value of FFH and always assumes that the 
  1587. component contains a segment index value. 
  1588.  
  1589. The component fields are usually repeated so that all segments constituting a 
  1590. group can be included in one GRPDEF record. 
  1591. Notes: 
  1592.  
  1593. This record is frequently followed by a THREAD fixup. 
  1594.  
  1595. The linker imposes a limit of 31 GRPDEF records in a single object module and 
  1596. limits the total number of group definitions across all object modules to 31. 
  1597.  
  1598. An example of a group for the IBM C Compiler is DGROUP32 which groups DATA32, 
  1599. CONST32 and BSS32. 
  1600.  
  1601. The linker does special handling of the pseudo-group FLAT. All address 
  1602. references to this group are made as offsets from the virtual zero address, 
  1603. which is the start of the memory image of the executable. 
  1604.  
  1605.  
  1606. ΓòÉΓòÉΓòÉ 2.4.23. 9CH or 9DH FIXUPP  Fixup Record ΓòÉΓòÉΓòÉ
  1607.  
  1608.  
  1609. Description: The FIXUPP record contains information that allows the linker to 
  1610. resolve (fix up) and eventually relocate references between object modules. 
  1611. FIXUPP records describe the LOCATION of each address value to be fixed up, the 
  1612. TARGET address to which the fixup refers and the FRAME relative to which the 
  1613. address computation is performed. 
  1614. Record format: 
  1615.  
  1616.  1 byte     2 bytes        <-- from the record length -----> 1 byte
  1617. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1618. Γöé   9C  Γöé Record         Γöé   THREAD subrecord or            ΓöéChk Sum Γöé
  1619. Γöéor 9D  Γöé Length         Γöé   FIXUP subrecord                Γöéor 0    Γöé
  1620. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1621.                            <--------- repeated ------------>
  1622.  
  1623. FIXUPP  Fixup Record 
  1624.  
  1625. Record type 9DH is new for LINK386; it has a Target Displacement field of 32 
  1626. bits rather than 16 bits, and the LOC field of the LOCAT word has been extended 
  1627. to $ bits (using the previously unused higher-order 'S' bit) to allow new LOC 
  1628. values of 9, 11 and 13. 
  1629.  
  1630. Each subrecord in a FIXUPP object record either defines a thread for subsequent 
  1631. use, or refers to a data location in the nearest previous LEDATA or LIDATA 
  1632. record. The high order bit of the subrecord determines the subrecord type:  if 
  1633. the high order bit is 0, the subrecord is a THREAD subrecord;  if the high 
  1634. order bit is 1, the subrecord is a FIXUP subrecord. Subrecords of different 
  1635. types may be mixed within one object record. 
  1636.  
  1637. Information that determines how to resolve a reference can be specified 
  1638. explicitly in a FIXUP subrecord, or can be specified within a FIXUP subrecord 
  1639. by a reference to a previous THREAD subrecord. A THREAD subrecord describes 
  1640. only the method to be used by the linker to refer to a particular target or 
  1641. frame. Because the same THREAD can be referenced in several subsequent FIXUP 
  1642. subrecords, a FIXUPP object record that uses THREADs may be smaller than one in 
  1643. which THREADs are not used. 
  1644.  
  1645. THREAD subrecords can be referenced in the same object record in which they 
  1646. appear and also in subsequent FIXUPP object records. 
  1647. THREAD 
  1648.  
  1649. There are 4 frame threads and 4 target threads; not all need be defined and 
  1650. they can be redefined by later THREAD subrecords in the same or later FIXUPP 
  1651. object records. The frame threads are used to specify the Frame Datum field in 
  1652. a later FIXUP subrecord:  the target threads are used to specify the Target 
  1653. Datum field in a later FIXUP subrecord. 
  1654.  
  1655. A THREAD subrecord defines a thread, and does not require that a previous 
  1656. LEDATA or LIDATA record occur. 
  1657.  
  1658. The layout of the THREAD subrecord is as follows: 
  1659.  
  1660.      <-------- one byte ----------->  1 or 2 bytes
  1661.     ΓöîΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1662.     Γöé 0 Γöé D Γöé 0 Γöé METHOD    ΓöéTHRED  Γöé   Index             Γöé
  1663.     ΓööΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1664.      1   1   1   3 bits      2 bits  <--- conditional --->
  1665. where: 
  1666.  
  1667. 0         The high order bit is zero to indicate that this is a THREAD 
  1668.           subrecord. 
  1669.  
  1670. D         is 0 for a target thread, 1 for a frame thread 
  1671.  
  1672. METHOD    is a 3-bit field. 
  1673.  
  1674.           For target threads, only the lower two bits of the field are used; 
  1675.           the high-order bit of the method is derived from the P bit in the 
  1676.           FixDat field of the FIXUP subrecords that refer to this thread. The 
  1677.           full list of methods is given here for completeness. This field 
  1678.           determines the kind of index required to specify the Target Datum. 
  1679.  
  1680.    T0  specified by a SEGDEF index 
  1681.    T1  specified by a GRPDEF index 
  1682.    T2  specified by a EXTDEF index 
  1683.    T3  specified by an explicit frame number (not supported by the linker) 
  1684.    T4  specified by a SEGDEF index only; the displacement in the FIXUP 
  1685.        subrecord is assumed to be 0. 
  1686.    T5  specified by a GRPDEF index only; the displacement in the FIXUP 
  1687.        subrecord is assumed to be 0. 
  1688.    T6  specified by a EXTDEF index only; the displacement in the FIXUP 
  1689.        subrecord is assumed to be 0. The index type specified by the target 
  1690.           thread method is encoded in the index field. 
  1691.  
  1692.           For frame threads, the method field determines the Frame Datum field 
  1693.           of subsequent FIXUP subrecords that refer to this thread. Values for 
  1694.           the method field are: 
  1695.  
  1696.    F0  the FRAME is specified by a SEGDEF index 
  1697.    F1  the FRAME is specified by a GRPDEF index 
  1698.    F2  the FRAME is specified by a EXTDEF index. The linker determines the 
  1699.        FRAME from the external name's corresponding PUBDEF record in another 
  1700.        object module, which specifies either a logical segment or a group. 
  1701.    F3  invalid (The FRAME is identified by an explicit frame number; this is 
  1702.        not supported by the linker) 
  1703.    F4  the FRAME is determined by the segment index of the previous LEDATA or 
  1704.        LIDATA record (ie the segment in which the location is defined). 
  1705.    F5  the FRAME is determined by the TARGET's segment, group or external index 
  1706.    F6  invalid The index field is present for frame methods F0, F1, and F2 
  1707.           only. 
  1708.  
  1709. THRED     is a 2-bit field and determines the thread number (0 through 3, for 
  1710.           the 4 threads of each kind). 
  1711.  
  1712. Index     is a conditional field that contains an index value that refers to a 
  1713.           previous SEGDEF, GRPDEF or EXTDEF record. The field is only present 
  1714.           if the thread method is 0, 1 or 2. If method 3 were supported by the 
  1715.           linker, the Index field would contain an explicit frame number. 
  1716.  
  1717. FIXUP 
  1718.  
  1719. A FIXUP subrecord gives the how/what/why/where/who information required to 
  1720. convert a reference when program segments are combined or placed within logical 
  1721. segments.  It applies to the nearest previous LEDATA or LIDATA record, which 
  1722. must be defined before the FIXUP. This FIXUP subrecord is as follows: 
  1723.  
  1724.        2 bytes     1 byte  1 or 2    1 or 2     2 or 4 bytes
  1725.      ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1726.      Γöé LOCAT     Γöé Fix    Γöé Frame   Γöé Target  Γöé Target        Γöé
  1727.      Γöé           Γöé  Dat   Γöé  Datum  Γöé  Datum  Γöé  Displacement Γöé
  1728.      ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1729.                            <cond>     <cond>    <conditional>
  1730. where the LOCAT field has an unusual format. Contrary to the usual byte order 
  1731. in Intel data structures, the most significant bits of the LOCAT field are 
  1732. found in the low-order, rather than the high-order byte. 
  1733.  
  1734. The LOCAT field is: 
  1735.  
  1736.     <------ lo byte ------> <----- high byte ----->
  1737.    ΓöîΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÉ
  1738.    Γöé1 ΓöéM Γöé    LOC    Γöé      Data Record Offset     Γöé
  1739.    ΓööΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÿ
  1740.     1  1       4                 10     (bits)
  1741. where: 
  1742.  
  1743. 1   the high bit of the low-order byte is set to indicate a FIXUP subrecord. 
  1744.  
  1745. M   is the mode, M=1 for segment-relative and M=0 for self-relative fixups 
  1746.  
  1747. LOC is a 4-bit field which determines what type of location is to be fixed up: 
  1748.  
  1749.    0   Low-order byte (8-bit displacement or low byte of 16-bit offset) 
  1750.    1   16-bit Offset 
  1751.    2   16-bit Base - logical segment base (selector) 
  1752.    3   32-bit Long pointer (16-bit base : 16-bit offset) 
  1753.    4   Hi-order byte (high byte of 16-bit offset) No linker support for this 
  1754.        type. 
  1755.    5   16-bit loader-resolved offset, treated as LOC=1 by the linker 
  1756.  
  1757.        CONFLICT PharLap OMF uses LOC=5 to indicate a 32-bit offset, where 
  1758.        Microsoft and IBM use LOC=9. 
  1759.    6   not defined, reserved 
  1760.  
  1761.        CONFLICT PharLap OMF uses LOC=6 to indicate a 48-bit pointer (16-bit 
  1762.        base : 32-bit offset) where Microsoft and IBM use LOC=11. 
  1763.    7   not defined, reserved 
  1764.    9   32-bit offset 
  1765.    11  48-bit pointer (16-bit base : 32-bit offset) 
  1766.    13  32-bit loader-resolved offset, treated as LOC=9 by the linker 
  1767.  
  1768. Data Record Offset The Data record offset indicates the position of the 
  1769.     location to be fixed up in the LEDATA or LIDATA record immediatly preceding 
  1770.     the FIXUPP record. This offset indicates either a byte in the data field of 
  1771.     an LEDATA record or a data byte in the content field of an iterated data 
  1772.     block in an LIDATA record. 
  1773. The FixDat bit layout is: 
  1774.  
  1775.  
  1776.     ΓöîΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÉ
  1777.     Γöé F Γöé   FRAME   Γöé T Γöé P ΓöéTARGT  Γöé
  1778.     ΓööΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÿ
  1779.       1       3       1   1     2   (bits)
  1780.  
  1781. and is interpreted as follows: 
  1782.  
  1783. F   If F=1, the frame is given by a frame thread whose number is in the FRAME 
  1784.     field (modulo 4).  There is no frame datum field in the subrecord. 
  1785.  
  1786.     If F=0, the frame method (in the range F0 to F5) is explicitly defined in 
  1787.     this FIXUP subrecord. The method is stored in the FRAME field. 
  1788.  
  1789. FRAME 
  1790.  
  1791.     3-bit numeric, interpreted according to the F bit. The Frame Datum field is 
  1792.     present and is an index field for frame methods F0, F1, and F2 only. 
  1793.  
  1794. T   If T=1 the target is defined by a target thread whose thread number is 
  1795.     given in the 2-bit TARGT field. The TARGT field contains a number between 0 
  1796.     and 3 that refers to a previous thread field containing the target method. 
  1797.     The P bit, combined with the two low-order bits of the method field in the 
  1798.     THREAD subrecord, determines the target method. 
  1799.  
  1800.     If T=0 the target is specified explicitly in this FIXUP subrecord. In this 
  1801.     case, the P bit and the TARGT field can be considered a 3-bit field 
  1802.     analogous to the FRAME field. 
  1803.  
  1804. P   Determines whether the target displacement field is present. 
  1805.  
  1806.     If P=1 there is no displacement field. 
  1807.  
  1808.     If P=0, the displacement field is present. 
  1809.  
  1810. TARGT is a 2-bit numeric, which gives the lower two bits of the target method 
  1811.     (if T=0) or gives the target thread number (if T=1). 
  1812.  
  1813. Frame Datum is an index field that refers to a previous SEGDEF, GRPDEF or 
  1814.     EXTDEF record, depending on the FRAME method. 
  1815.  
  1816. Target Datum contains a segment index, a group index or an external index 
  1817.     depending on the TARGET method. 
  1818.  
  1819. Target Displacement a 16-bit or 32-bit field is present only if the P bit in 
  1820.     the FixDat field is set to to 0, in which case the Target Displacement 
  1821.     field contains the offset used in methods 0, 1 and 2 of specifying a 
  1822.     TARGET. 
  1823.  
  1824. Notes: 
  1825.  
  1826. FIXUPP records are used to fix references in the immediately preceding LEDATA, 
  1827. LIDATA or COMDAT record. 
  1828.  
  1829. The FRAME is the translator's way of telling the linker the contents of the 
  1830. segment register used for the reference; the TARGET is the item being 
  1831. referenced whose address was not completely resolved by the translator.  In 
  1832. protect mode, the only legal segment register value are selectors; every 
  1833. segment and group of segments is mapped through some selector and addressed by 
  1834. offset within the underlying memory defined by that selector. 
  1835.  
  1836.  
  1837. ΓòÉΓòÉΓòÉ 2.4.24. A0H or A1H LEDATA  Logical Enumerated Data Record ΓòÉΓòÉΓòÉ
  1838.  
  1839.  
  1840. Description: This record provides contiguous binary data -- executable code or 
  1841. program data -- which is part of a program segment. The data is eventually 
  1842. copied into the program's executable binary image by the linker. 
  1843.  
  1844. The data bytes may be subject to relocation or fix-up as determined by the 
  1845. presence of a subsequent FIXUPP record but otherwise requires no expansion when 
  1846. mapped to memory at run time. 
  1847. Record Format: 
  1848.  
  1849.  1 byte  2 bytes
  1850. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  1851. Γöé  A0   Γöé Record         Γöé
  1852. Γöé  or   Γöé Length         Γöé
  1853. Γöé  A1   Γöé                Γöé
  1854. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  1855.  
  1856.                  1 or 2     2 or 4 bytes   <from Record Length> 1 byte
  1857.               --Γö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1858.                 Γöé Seg.    Γöé Enum Data     Γöé     Data           ΓöéChk sumΓöé
  1859.                 Γöé  Index  Γöé  Offset       Γöé       Bytes        Γöé or 0  Γöé
  1860.                 Γöé         Γöé               Γöé                    Γöé       Γöé
  1861.               --Γö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1862.  
  1863. LEDATA  logical enumerated data record
  1864. RecordtypeA1HisnewforLINK386 
  1865. ;ithasanEnumeratedDataOffsetfieldof32bitsratherthan16bits .
  1866. Segment Index 
  1867.  
  1868. The SegIndex must be nonzero and is the index of a previously defined SEGDEF 
  1869. record. This is the segment into which the data in this LEDATA record is to be 
  1870. placed. 
  1871.  
  1872.  
  1873. Enumerated Data Offset 
  1874.  
  1875. The enumerated data offset is a 2 or 4 byte field (depending on the record 
  1876. type) which determines the offset at which the first data byte is to be placed 
  1877. relative to the start of the SEGDEF segment. Successive data bytes occupy 
  1878. successively higher locations. 
  1879.  
  1880.  
  1881. Data Bytes 
  1882.  
  1883. The maximum number of data bytes is 1024, so that a FIXUPP location field, 
  1884. which is 10 bits, can reference any of these data bytes.  The number of data 
  1885. bytes is computed as the RecLength minus 5 minus the size of the SegIndex field 
  1886. (1 or 2 bytes). 
  1887.  
  1888.  
  1889. NOTES: 
  1890.  
  1891. Record type A1H has offset stored as a 32-bit numeric. Record type A0 encodes 
  1892. the offset value as a 16-bit numeric (zero extended if applied to a Use32 
  1893. segment). 
  1894.  
  1895. If the LEDATA requires fixup, a FIXUPP record must immediately follow the 
  1896. LEDATA record. 
  1897.  
  1898.  
  1899. ΓòÉΓòÉΓòÉ 2.4.25. A2H or A3H LIDATA  Logical Iterated Data Record ΓòÉΓòÉΓòÉ
  1900.  
  1901.  
  1902. Description: Like the LEDATA record, the LIDATA record contains binary data -- 
  1903. executable code or program data. The data in an LIDATA record, however, is 
  1904. specified as a repeating pattern (iterated), rather than by explicit 
  1905. enumeration. 
  1906.  
  1907. The data in an LIDATA record may be modified by the linker if the LIDATA record 
  1908. is immediately followed by a FIXUPP record. 
  1909.  
  1910.  
  1911. Record format: 
  1912.  
  1913.  1 byte     2 bytes
  1914. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  1915. Γöé  A2   Γöé Record         Γöé
  1916. Γöé  or   Γöé Length         Γöé
  1917. Γöé  A3   Γöé                Γöé
  1918. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  1919.  
  1920.                  1 or 2    4 bytes       <from Record Length> 1 byte
  1921.               --Γö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1922.                 Γöé Seg.    Γöé Data        Γöé     Data           ΓöéChk sumΓöé
  1923.                 Γöé  Index  Γöé  Offset     Γöé       Block        Γöé or 0  Γöé
  1924.                 Γöé         Γöé             Γöé                    Γöé       Γöé
  1925.               --Γö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1926.                                          <----- repeat ----->
  1927.  
  1928. LIDATA  Logical Iterated Data Record 
  1929.  
  1930. Record type A3H is new for LINK386; it has Iterated Data Offset and Repeat 
  1931. Count fields of 32 bits rather than 16 bits. 
  1932. Segment Index and Data Offset 
  1933.  
  1934. The segment index and data offset (2 or 4 bytes) are the same as for an LEDATA 
  1935. record. The index must be nonzero. 
  1936.  
  1937.  
  1938. Data Block 
  1939.  
  1940. The data blocks have the following form: 
  1941.  
  1942.      2 or 4            2         <-- from block count -->       (bytes)
  1943.  ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1944.  Γöé Repeat       Γöé Block       Γöé    Content                             Γöé
  1945.  Γöé  Count       Γöé  Count      Γöé                                        Γöé
  1946.  ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1947.  
  1948. Repeat Count 
  1949.  
  1950. The Repeat Count is a 16-bit or 32-bit value which determines the number of 
  1951. repeats of the content field. The Repeat Count is 32 bits only if the record 
  1952. type is A3. 
  1953.  
  1954. CONFLICT:The PharLap OMF uses a 16-bit repeat count even in 32-bit records. 
  1955. Block Count 
  1956.  
  1957. The Block Count is a 16-bit word whose value determines the interpretation of 
  1958. the content portion, as follows: 
  1959.  
  1960. 0   indicates that the content field that follows is a one byte "count" value 
  1961.     followed by "count" data bytes.  The data bytes will be mapped to memory, 
  1962.     repeated Repeat Count times. 
  1963.  
  1964. !=0 indicates the content field that follows is comprised of one or more Data 
  1965.     Blocks.  The Block Count value specifies the number of Data Blocks 
  1966.     (recursive definition). 
  1967.  
  1968. Notes: 
  1969.  
  1970. A subsequent FIXUPP record may occur; the fixup is applied before the iterated 
  1971. data block is expanded. It is a translator error for a fixup to reference any 
  1972. of the count fields. 
  1973.  
  1974.  
  1975. ΓòÉΓòÉΓòÉ 2.4.26. B0H COMDEF Communal Names Definition Record ΓòÉΓòÉΓòÉ
  1976.  
  1977.  
  1978. Description: The COMDEF record declares a list of one or more communal 
  1979. variables (uninitialized static data, or data that may match initialized static 
  1980. data in another compilation group). 
  1981.  
  1982. The size of such a variable the the maximum size defined in any module naming 
  1983. the variable as communal or public. The placement of communal variables is 
  1984. determined by the data type using established conventions (see data type and 
  1985. communal length below). 
  1986. Record format: 
  1987.  
  1988.   1 byte     2 bytes
  1989. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  1990. Γöé  B0   Γöé Record         Γöé
  1991. Γöé       Γöé  Length        Γöé
  1992. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  1993.  
  1994.       1 byte <string>  1 or 2   1 byte <- from data type -> 1 byte
  1995.    --Γö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1996.      ΓöéStr.  ΓöéCommunal ΓöéType    ΓöéDate  Γöé  Communal          ΓöéChk sumΓöé
  1997.      Γöé Len  Γöé Name    Γöé Index  Γöé Type Γöé   Length           Γöé or 0  Γöé
  1998.    --Γö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1999.       <-------------------- repeated --------------------->
  2000.  
  2001. COMDEF  Communal Names Definition Record 
  2002.  
  2003. Communal name 
  2004.  
  2005. The name is in <count, char> string format (and name may be null).  Near and 
  2006. Far communals from different object files are matched at bind or link time if 
  2007. their names agree; the variable's size is the maximum of the sizes specified 
  2008. (subject to some constraints, as documented below). 
  2009. Type Index 
  2010.  
  2011. Encodes symbol information; it is parsed as an index field (one or 2 bytes), 
  2012. and not inspected by the linker. 
  2013. Data Type and Communal Length 
  2014.  
  2015. The data type field indicates the contents of the Communal Length field. All 
  2016. Data type values for Near data indicate that the Communal Length field has only 
  2017. one numeric value: the amount of memory to be allocated for the communal 
  2018. variable. All Data Type values for Far data indicate that the Communal Length 
  2019. field has two numeric  values: the first is the number of elements and the 
  2020. second is the element size. 
  2021.  
  2022. The DataType is one of the following hex values: 
  2023.  
  2024. 61H FAR data; length specified as number of elements followed by element size 
  2025.     in bytes. 
  2026. 62H NEAR data; length specified as number of bytes. 
  2027.  
  2028. The communal length is a single numeric or a pair of numeric fields (as 
  2029. specified by the Data Type), encoded as follows: 
  2030.  
  2031. 1 byte value 0 through 128 (80 hex) 
  2032. 3 byte byte 81 hex, followed by a 16-bit word whose value is used (range 0 to 
  2033.        64K-1) 
  2034. 4 byte byte 84 hex, followed by a 3 byte value (range 0 to 16M-1) 
  2035. 5 byte byte 88 hex, followed by a 4 byte value (range -2G-1 to 2G-1, signed) 
  2036.  
  2037. Groups of name, type index, segment type and communal length fields can be 
  2038. repeated so that more than one communal variable can be declared in the same 
  2039. COMDEF record. 
  2040. Notes: 
  2041.  
  2042. If a public or exported symbol with the same name is found in another module 
  2043. with which this is bound or linked, the linker gives a multiple defined symbol 
  2044. error message, 
  2045.  
  2046. Communal variables cannot be resolved to dynamic links (ie, imported symbols). 
  2047.  
  2048. The records are ordered by occurrence, together with the items named in EXTDEF 
  2049. records (for reference in FIXUPS). 
  2050.  
  2051. The IBM C Compiler generates COMDEF's for all uninitialized global data and for 
  2052. global scalars initialized to zero. 
  2053.  
  2054.  
  2055. ΓòÉΓòÉΓòÉ 2.4.27. B2H or B3H BAKPAT   Backpatch Record ΓòÉΓòÉΓòÉ
  2056.  
  2057.  
  2058. Description: This record is for backpatches to locations which cannot be 
  2059. conveniently handled by a FIXUPP at reference time. For example, forward 
  2060. references in a one-pass compiler. It is essentially a specialized fixup. 
  2061.  
  2062.  
  2063. Record format: 
  2064.  
  2065.    1        2        1 or 2      1        2 or 4       2 or 4     1 (bytes)
  2066. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2067. Γöé B2 or Γöé Record     Γöé  Seg    Γöé  Loc   Γöé   Offset    Γöé  Value     Γöé Chk  Γöé
  2068. Γöé B3    Γöé  Length    Γöé  Index  Γöé  Type  Γöé             Γöé            Γöé Sum  Γöé
  2069. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2070.                                          <-------- repeated ------->
  2071.  
  2072. BAKPAT  Backpatch record 
  2073.  
  2074. SegIndex  Segment index to which all "backpatch" fixupps are to be applied. 
  2075. Note that, in contrast to FIXUPs, these records need not follow the data record 
  2076. to be fixed up. Hence, the segment to which the backpatch apllies must be 
  2077. specified explicitly. 
  2078.  
  2079. LocTyp  Type of location to be patched; the only valid values are: 
  2080.  
  2081.  0         8-bit lobyte 
  2082.  
  2083.  1         16-bit offset 
  2084.  
  2085.  9         32-bit offset, record type B3 only 
  2086. Offset and value  These fields are 32-bits for record type B3, 16-bit for B2. 
  2087.  
  2088. The Offset specifies the loaction to be patched (as an offset into the segdef 
  2089. whose index is SegIndex). 
  2090.  
  2091. The associated Value is added to the location being patched (unsigned addition, 
  2092. ignoring overflow). The Value field is fixed length (16-bit or 32-bit, 
  2093. depending on the record type) to make object module processing easier. 
  2094.  
  2095.  
  2096. Notes: 
  2097.  
  2098. BAKPAT records can occur anywhere in the object module following the SEGDEF 
  2099. record to which they refer. They do not have to immediately follow the 
  2100. appropriate LEDATA record as FIXUPP record do. 
  2101.  
  2102. These records are buffered by the linker in Pass 2 until the end of the module, 
  2103. after applying all other FIXUPPs. The  linker then processes the records as 
  2104. fixups. 
  2105.  
  2106.  
  2107. ΓòÉΓòÉΓòÉ 2.4.28. B4H or B5H LEXTDEF   Local External Names Definition Record ΓòÉΓòÉΓòÉ
  2108.  
  2109.  
  2110. Description: This record is identical in form to the EXTDEF record described 
  2111. earlier. However, the symbols named in this record are not visible outside the 
  2112. module in which they are defined. 
  2113.  
  2114.  
  2115. Record format: 
  2116.  
  2117.     1         2          1       < StrLen >    1 or 2    1 (bytes)
  2118. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2119. Γöé B4 or Γöé Record     Γöé  Str   Γöé  External    Γöé Type    Γöé Chk   Γöé
  2120. Γöé B5    Γöé  Length    Γöé  Len   Γöé  name string Γöé Index   Γöé Sum   Γöé
  2121. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2122.                       <----------- repeated ---------->
  2123.  
  2124. LEXTDEF  Local External Names Definition Record 
  2125.  
  2126.  
  2127. Notes: 
  2128.  
  2129. There is no semantic difference between the B4 and B5 flavors. 
  2130.  
  2131. These records are associated with LPUBDEF and LCOMDEF records, ordered with the 
  2132. EXTDEF records by occurence, so that they may be referenced by external index 
  2133. for fixups. 
  2134.  
  2135. The name string, when stored in LINK's internal data structures, is encoded 
  2136. with spaces and digits at the beginning of the name. 
  2137.  
  2138.  
  2139. ΓòÉΓòÉΓòÉ 2.4.29. B6H or B7H LEXTDEF   Local Public Names Definition Record ΓòÉΓòÉΓòÉ
  2140.  
  2141.  
  2142. Description: This record is identical in form to the PUBDEF record described 
  2143. earlier. However, the symbols named in this record are not visible outside the 
  2144. module in which they are defined. 
  2145.  
  2146.  
  2147. Record format: 
  2148.  
  2149.    1      2      1or2   1or2     2      1   <strlen>   2or4     1or2    1
  2150. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2151. Γöé B6  Γöé Record Γöé Base Γöé Base Γöé Base  Γöé Str Γöé Local  Γöé Local   Γöé Type  Γöé Chk Γöé
  2152. Γöé or  Γöé Length Γöé Grp  Γöé Seg  Γöé Frame Γöé Len Γöé name   Γöé offset  Γöé Index Γöé Sum Γöé
  2153. Γöé B7  Γöé        Γöé      Γöé      Γöé       Γöé     Γöé string Γöé         Γöé       Γöé     Γöé
  2154. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2155.                                <cnd> <----------- repeated ----------->
  2156.  
  2157. LPUBDEF  Local Public Names Definition Record 
  2158.  
  2159.  
  2160. ΓòÉΓòÉΓòÉ 2.4.30. B8H LCOMDEF   Local Communal Names Definition Record ΓòÉΓòÉΓòÉ
  2161.  
  2162.  
  2163. Description: This record is identical in form to the COMDEF record described 
  2164. earlier. However, the symbols named in this record are not visible outside the 
  2165. module in which they are defined. 
  2166.  
  2167.  
  2168. Record format: 
  2169.  
  2170.    1      2       1    <StrLen>   1or2     1     <from Data Type>    1
  2171. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2172. Γöé B8  Γöé Record Γöé Str Γöé Communal Γöé Type  Γöé Data Γöé  Communal        Γöé Chk  Γöé
  2173. Γöé     Γöé Length Γöé Len Γöé Name     Γöé Index Γöé Type Γöé  Length          Γöé Sum  Γöé
  2174. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2175.                 <---------------------- repeated ----------------->
  2176.  
  2177. LCOMDEF  Local Communal Names Definition Record 
  2178.  
  2179.  
  2180. ΓòÉΓòÉΓòÉ 2.4.31. C2H or C3H COMDAT Initialized Communal Data Record ΓòÉΓòÉΓòÉ
  2181.  
  2182.  
  2183. Description: The purpose of the COMDAT record is to combine logical blocks of 
  2184. code and data which may be duplicated across a number of compiled modules. 
  2185. Record format: 
  2186.  
  2187.     1         2
  2188. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼---
  2189. Γöé C2 or Γöé Record         Γöé
  2190. Γöé C3    Γöé  Length        Γöé
  2191. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤---
  2192.  
  2193.       1      1      1       2or4       1or2    <cond> <string>   1    1 (bytes)
  2194.  --Γö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2195.    ΓöéFlags Γöé Attr.ΓöéAlign Γöé Enum Data  Γöé Type  ΓöéPublic Γöé Public Γöé DAT   ΓöéChk.  Γöé
  2196.    Γöé      Γöé      Γöé      Γöé Offset     Γöé  IndexΓöé Base  Γöé  Name  Γöé       Γöé Sum  Γöé
  2197.  --Γö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2198.                                                                <repeat>
  2199.  
  2200. COMDAT  initialized communal data record 
  2201.  
  2202. Flags 
  2203.  
  2204. This field contains three defined bits: 
  2205.  
  2206. 01H - Continuation bit. If clear, then this COMDAT record establishes a new 
  2207. instance of the COMDAT variable, otherwise the data is a continuation of the 
  2208. previous COMDAT of the symbol. 
  2209.  
  2210. 02H - Iterated data bit. If clear, the Dat field contains enumerated data, 
  2211. otherwise the Dat field contains iterated data, as in an LIDATA record. 
  2212.  
  2213. 04H - Local COMDAT. The public name is local. 
  2214. Attr 
  2215.  
  2216. This field contains two 4-bit fields:  the selection criteria to be used, the 
  2217. allocation type and the ordinal specifying the type of allocation to be 
  2218. performed. Values are: 
  2219.  
  2220. Selection criteria (high-order 4 bits): 
  2221.  
  2222. 00H - No match -  only one instance of this comdat allowed. 
  2223.  
  2224. 10H - Pick any -  pick any instance of this COMDAT record. 
  2225.  
  2226. 20H - Same size - pick any, but instances must have the same length or linker 
  2227. will generate an error. 
  2228.  
  2229. 30H - Exact Match - pick any, but checksums of instances must match of linker 
  2230. will generate an error. Fixups are ignored. 
  2231.  
  2232. 40H - F0H - reserved. 
  2233. Allocation Type (low-order 4 bits): 
  2234.  
  2235. 00H - Explicit -  allocate in the segment specified in the ensuing public base 
  2236. field. 
  2237.  
  2238. 01H - Far Code -  allocate as CODE16. The linker will create segments to 
  2239. contain all COMDAT's of this type. 
  2240.  
  2241. 02H - Far DATA -  allocate as DATA16. The linker will create segments to 
  2242. contain all COMDAT's of this type. 
  2243.  
  2244. 03H - CODE32 -  allocate as CODE32. The linker will create segments to contain 
  2245. all COMDAT's of this type. 
  2246.  
  2247. 04H - DATA32 -  allocate as DATA32. The linker will create segments to contain 
  2248. all COMDAT's of this type. 
  2249.  
  2250. 05H - 0FH - Reserved. 
  2251. Align 
  2252.  
  2253. These codes are based on the ones used by the SEGDEF record: 
  2254.  
  2255. 0 - use value from SEGDEF. 
  2256.  
  2257. 1 - byte aligned. 
  2258.  
  2259. 2 - word (2 byte) aligned. 
  2260.  
  2261. 3 - paragraph (16 byte) aligned. 
  2262.  
  2263. 4 - 4K page aligned. 
  2264.  
  2265. 5 - dword (4 byte) aligned. 
  2266.  
  2267. 6 - not defined. 
  2268.  
  2269. 7 - not defined. 
  2270. Enum Data Offset 
  2271.  
  2272. This field specifies an offset relative to the beginning location of the symbol 
  2273. specified in the public name field and defines the relative location of the 
  2274. first byte of the DAT field. Successive data bytes in the DAT field occupy 
  2275. higher locations of memory. This works very much like the offset field in an 
  2276. LEDATA record, but instead of an offset relative to a segment, this is relative 
  2277. to the beginning of the COMDAT symbol. 
  2278. Type Index 
  2279.  
  2280. The type index field is encoded in index format; it contains either debug type 
  2281. information or an old-style TYPDEF index. If this index is zero, there is no 
  2282. associated type data. Old-style TYPDEF indices are ignored by the linker. 
  2283. Present linkers do no type checking. 
  2284. Public Base 
  2285.  
  2286. This field is conditional and is identical to the public base stored in the 
  2287. public base field in the PUBDEF record. This field is only present if the 
  2288. allocation type field specifies explicit allocation. 
  2289. Public Name 
  2290.  
  2291. This field is a regular length prefixed name. 
  2292. Dat 
  2293.  
  2294. The Dat field provides up to 1024 consecutive bytes of data. If there are 
  2295. fixups, they must be emitted in a FIXUPP record that follows the COMDAT record. 
  2296. The data can be either enumerated or iterated, depending on the flags field. 
  2297. Notes: 
  2298.  
  2299. While creating addressing frames, the linker will add the COMDAT data to the 
  2300. appropriate logical segments, adjusting their sizes. At that time the offset at 
  2301. which the data will go inside the logical segment will be calculated. Next, the 
  2302. linker will create physical segments from adjusted logical segments reporting 
  2303. any 64K boundary overflows. 
  2304.  
  2305. If the allocation type is not explicit, COMDAT code and data is accumulated by 
  2306. the linker and broken up into segments, so that the total may exceed 64K. 
  2307.  
  2308. In pass two, only the selected occurrence of COMDAT data will be stored in the 
  2309. VM, fixed up and later written into the .EXE file. 
  2310.  
  2311.  
  2312. ΓòÉΓòÉΓòÉ 2.4.32. C4H or C5H LINSYM   Symbol Line Numbers Record ΓòÉΓòÉΓòÉ
  2313.  
  2314.  
  2315. Description: This record will be used to output numbers for functions specified 
  2316. via COMDATs. 
  2317. Record format: 
  2318.  
  2319.    1      2        1     <variable>      2            2or4         1
  2320. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2321. Γöé C4H Γöé Record Γöé       Γöé  Symbol    Γöé  Line     Γöé  Line         Γöé Chk  Γöé
  2322. Γöé or  Γöé Length Γöé Flags Γöé  Name      Γöé  Number   Γöé  Number       Γöé Sum  Γöé
  2323. Γöé C5H Γöé        Γöé       Γöé  Base      Γöé           Γöé  Offset       Γöé      Γöé
  2324. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2325.                                      <-------- repeated ------->
  2326.  
  2327.  
  2328. COMDAT  initialized communal data record 
  2329.  
  2330. Flags 
  2331.  
  2332. This field contains three defined bits: 
  2333.  
  2334.  01H       Continuation bit. If clear, then this COMDAT record establishes a 
  2335.           new instance of the COMDAT variable, otherwise the data is a 
  2336.           continuation of the previous COMDAT of the symbol. 
  2337.  
  2338. 04H       Local COMDAT 
  2339.  
  2340. The Symbol Name Base is a length-preceded name of the base of the LINSYM 
  2341. record. 
  2342.  
  2343. The Line Number is an unsigned number in the range 0 to 65535. 
  2344.  
  2345. The Line Number Offset field is the offset relative to tha base specified by 
  2346. the symbol name base. The size of this field depends on the record type. 
  2347.  
  2348.  
  2349. Notes: 
  2350.  
  2351. Record type C5H identical to C4H except that the Line Number Offset field is 4 
  2352. bytes instead of 2. 
  2353.  
  2354. Thie record is used to output line numbers for functions specified via COMDATs. 
  2355. Often, the residing segment as well as the relative offsets of such function is 
  2356. unknown at compile time, in that the linker is the final arbitrator of such 
  2357. information. For such cases the compiler will generate this record to specify 
  2358. the line number/offset pairs relative to a symbolic name. 
  2359.  
  2360. Thie record will also be used to discard duplicate linnum information. If the 
  2361. linker encounters two LINSYM records with matching symbolic names, the linker 
  2362. will keep the first set of linnums and discard all subsequent LINSYM records of 
  2363. that name. 
  2364.  
  2365.  
  2366. ΓòÉΓòÉΓòÉ 2.4.33. C6H ALIAS   Alias Definition Record ΓòÉΓòÉΓòÉ
  2367.  
  2368.  
  2369. Description: This record has been introduced to support link-time aliasing, or 
  2370. a method by which compilers or assembles may direct the linker to substitute 
  2371. all references to one symbol for another. 
  2372. Record format: 
  2373.  
  2374.    1       2        <variable>     <variable>          1 (bytes)
  2375. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2376. Γöé C6H Γöé Rec Len  Γöé Alias Name   Γöé Substitute Name    Γöé Chk Sum Γöé
  2377. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2378.                   <------------- repeated ---------->
  2379.  
  2380. ALIAS  Alias Definition Record 
  2381.  
  2382. The Alias Name field is a regular length-preceded name of the alias symbol. 
  2383.  
  2384. The Substitute Name field is a regular length-preceded name of the substitute 
  2385. symbol. 
  2386.  
  2387.  
  2388. Notes: 
  2389.  
  2390. The record will consist of two symbolic names: the alias symbol and the 
  2391. substitute symbol. The alias symbol behaves very much like a PUBDEF in that it 
  2392. must be unique. If a PUBDEF of an alias symbol is encountered or another ALIAS 
  2393. record with a different substitute symbol is encountered, a redefinition error 
  2394. should be emitted by the linker. 
  2395.  
  2396. When attempting to satisfy an external reference, if an ALIAS record whose 
  2397. alias symbol matches is found, the linker will halt the search for alias symbol 
  2398. definitions and will attempt to satisfy the reference with the substitute 
  2399. symbol. 
  2400.  
  2401. All ALIAS records must appear before the link pass 2 record. 
  2402.  
  2403.  
  2404. ΓòÉΓòÉΓòÉ 2.4.34. C8H or C9H NBKPAT   Named BackPatch Record ΓòÉΓòÉΓòÉ
  2405.  
  2406.  
  2407. Description: The Named Backpatch record is like a BAKPAT record, except that it 
  2408. refers to a COMDAT, by name, rather than an LIDATA or LEDATA record. 
  2409.  
  2410.  
  2411. Record format: 
  2412.  
  2413.    1       2         1     <var>     2 or 4          2 or 4        1 (bytes)
  2414. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2415. Γöé C8H Γöé Rec      Γöé Loc  Γöé Public Γöé                Γöé            Γöé   Chk      Γöé
  2416. Γöé or  Γöé Length   Γöé Type Γöé Name   Γöé   Offset       Γöé  Value     Γöé   Sum      Γöé
  2417. Γöé C9H Γöé          Γöé      Γöé        Γöé                Γöé            Γöé            Γöé
  2418. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2419.                                   <--------- repeated -------->
  2420.  
  2421. NBKPAT  Named Backpatch Record 
  2422.  
  2423.  
  2424. LocType 
  2425.  
  2426. Type of location to be patched; the only valid values are: 
  2427.  
  2428. 0         8-bit byte 
  2429.  
  2430. 1         16-bit word 
  2431.  
  2432. 2         32-bit dword, record type C9 only 
  2433.  
  2434. 0x80      local COMDAT 
  2435.  
  2436.  
  2437. Public Name 
  2438.  
  2439. Length-preceded name of the COMDAT to back patch. 
  2440.  
  2441.  
  2442. Offset and Value 
  2443.  
  2444. These fields are 16-bits for record type C8, 32-bits for C9. 
  2445.  
  2446. The Offset specifies the location to be patched, as an offset into the COMDAT. 
  2447.  
  2448. The associated Value is added to the location being patched (unsigned addition, 
  2449. ignoring overflow). The Value field is fixed length (16-bit or 32-bit, 
  2450. depending on the record type) to make object module processing easier. 
  2451.  
  2452.  
  2453. ΓòÉΓòÉΓòÉ 3. LX - Linear eXecutable Module Format Description ΓòÉΓòÉΓòÉ
  2454.  
  2455.  
  2456. ΓòÉΓòÉΓòÉ 3.1. Revision codes: ΓòÉΓòÉΓòÉ
  2457.  
  2458. revision 1 - Library termination. 
  2459.  
  2460. revision 2 - Sector Align and Exepack support. 
  2461.  
  2462. revision 3 - Address Based linking. 
  2463.  
  2464. revision 4 - OS/2 2.0 PM Debugger (IBM) support. 
  2465.  
  2466.  
  2467. ΓòÉΓòÉΓòÉ 3.2. 32-bit Linear EXE Header ΓòÉΓòÉΓòÉ
  2468.  
  2469.       00h ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ  <ΓöÇΓöÇΓöÉ
  2470.           Γöé DOS 2 Compatible Γöé     Γöé
  2471.           Γöé    EXE Header    Γöé     Γöé
  2472.       1Ch Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2473.           Γöé      unused      Γöé     Γöé
  2474.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2475.       24h Γöé  OEM Identifier  Γöé     Γöé
  2476.       26h Γöé  OEM Info        Γöé     Γöé
  2477.           Γöé                  Γöé     Γö£ΓöÇΓöÇ DOS 2.0 Section
  2478.       3Ch Γöé  Offset to       Γöé     Γöé   (Discarded)
  2479.           Γöé  Linear EXE      Γöé     Γöé
  2480.           Γöé  Header          Γöé     Γöé
  2481.       40h Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2482.           Γöé   DOS 2.0 Stub   Γöé     Γöé
  2483.           Γöé   Program        Γöé     Γöé
  2484.           Γöé   Reloc. Table   Γöé     Γöé
  2485.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ  <ΓöÇΓöÇΓöÿ
  2486.  
  2487. Dos 2.0 Section (Discarded) 
  2488.  
  2489.       xxh ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ  <ΓöÇΓöÇΓöÉ
  2490.           Γöé    Executable    Γöé     Γöé
  2491.           Γöé       Info       Γöé     Γöé
  2492.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2493.           Γöé      Module      Γöé     Γöé
  2494.           Γöé       Info       Γöé     Γöé
  2495.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γö£ΓöÇΓöÇ Linear Executable
  2496.           Γöé  Loader Section  Γöé     Γöé   Module Header
  2497.           Γöé       Info       Γöé     Γöé   (Resident)
  2498.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2499.           Γöé   Table Offset   Γöé     Γöé
  2500.           Γöé       Info       Γöé     Γöé
  2501.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ  <ΓöÇΓöÇΓöÿ
  2502.  
  2503. Linear Executable Module Header (Resident) 
  2504.  
  2505.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ  <ΓöÇΓöÇΓöÉ
  2506.           Γöé   Object Table   Γöé     Γöé
  2507.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2508.           Γöé Object Page TableΓöé     Γöé
  2509.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2510.           Γöé  Resource Table  Γöé     Γöé
  2511.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2512.           Γöé  Resident Name   Γöé     Γöé
  2513.           Γöé      Table       Γöé     Γöé
  2514.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γö£ΓöÇΓöÇ Loader Section
  2515.           Γöé   Entry Table    Γöé     Γöé   (Resident)
  2516.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2517.           Γöé   Module Format  Γöé     Γöé
  2518.           Γöé Directives Table Γöé     Γöé
  2519.           Γöé    (Optional)    Γöé     Γöé
  2520.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2521.           Γöé     Resident     Γöé     Γöé
  2522.           Γöé Directives Data  Γöé     Γöé
  2523.           Γöé    (Optional)    Γöé     Γöé
  2524.           Γöé                  Γöé     Γöé
  2525.           Γöé  (Verify Record) Γöé     Γöé
  2526.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2527.           Γöé     Per-Page     Γöé     Γöé
  2528.           Γöé     Checksum     Γöé     Γöé
  2529.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ  <ΓöÇΓöÇΓöÿ
  2530.  
  2531. Loader Section (Resident) 
  2532.  
  2533.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ  <ΓöÇΓöÇΓöÉ
  2534.           Γöé Fixup Page Table Γöé     Γöé
  2535.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2536.           Γöé   Fixup Record   Γöé     Γöé
  2537.           Γöé       Table      Γöé     Γöé
  2538.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γö£ΓöÇΓöÇ Fixup Section
  2539.           Γöé   Import Module  Γöé     Γöé   (Optionally Resident)
  2540.           Γöé    Name Table    Γöé     Γöé
  2541.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2542.           Γöé Import Procedure Γöé     Γöé
  2543.           Γöé    Name Table    Γöé     Γöé
  2544.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ  <ΓöÇΓöÇΓöÿ
  2545.  
  2546. Loader Section (Resident) 
  2547.  
  2548.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ  <ΓöÇΓöÇΓöÉ
  2549.           Γöé   Preload Pages  Γöé     Γöé
  2550.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2551.           Γöé    Demand Load   Γöé     Γöé
  2552.           Γöé       Pages      Γöé     Γöé
  2553.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2554.           Γöé  Iterated Pages  Γöé     Γöé
  2555.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2556.           Γöé   Non-Resident   Γöé     Γö£ΓöÇΓöÇ (Non-Resident)
  2557.           Γöé    Name Table    Γöé     Γöé
  2558.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ     Γöé
  2559.           Γöé   Non-Resident   Γöé     Γöé
  2560.           Γöé Directives Data  Γöé     Γöé
  2561.           Γöé    (Optional)    Γöé     Γöé
  2562.           Γöé                  Γöé     Γöé
  2563.           Γöé  (To be Defined) Γöé     Γöé
  2564.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ  <ΓöÇΓöÇΓöÿ
  2565.  
  2566. Non-Resident Section 
  2567.  
  2568.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ  <ΓöÇΓöÇΓöÉ
  2569.           Γöé    Debug Info    Γöé     Γö£ΓöÇΓöÇ (Not used by Loader)
  2570.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ  <ΓöÇΓöÇΓöÿ
  2571.  
  2572. Not used by the Loader 
  2573.  
  2574.  
  2575. ΓòÉΓòÉΓòÉ 3.3. LX Header ΓòÉΓòÉΓòÉ
  2576.  
  2577.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2578.       00h Γöé "L"   "X" ΓöéB-ORDΓöéW-ORDΓöé     FORMAT LEVEL      Γöé
  2579.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2580.       08h Γöé CPU TYPE  Γöé  OS TYPE  Γöé    MODULE VERSION     Γöé
  2581.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2582.       10h Γöé     MODULE FLAGS      Γöé   MODULE # OF PAGES   Γöé
  2583.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2584.       18h Γöé     EIP OBJECT #      Γöé          EIP          Γöé
  2585.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2586.       20h Γöé     ESP OBJECT #      Γöé          ESP          Γöé
  2587.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2588.       28h Γöé       PAGE SIZE       Γöé   PAGE OFFSET SHIFT   Γöé
  2589.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2590.       30h Γöé  FIXUP SECTION SIZE   Γöé FIXUP SECTION CHECKSUMΓöé
  2591.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2592.       38h Γöé  LOADER SECTION SIZE  ΓöéLOADER SECTION CHECKSUMΓöé
  2593.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2594.       40h Γöé    OBJECT TABLE OFF   Γöé  # OBJECTS IN MODULE  Γöé
  2595.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2596.       48h Γöé OBJECT PAGE TABLE OFF Γöé OBJECT ITER PAGES OFF Γöé
  2597.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2598.       50h Γöé RESOURCE TABLE OFFSET Γöé#RESOURCE TABLE ENTRIESΓöé
  2599.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2600.       58h Γöé RESIDENT NAME TBL OFF Γöé   ENTRY TABLE OFFSET  Γöé
  2601.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2602.       60h Γöé MODULE DIRECTIVES OFF Γöé # MODULE DIRECTIVES   Γöé
  2603.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2604.       68h Γöé FIXUP PAGE TABLE OFF  ΓöéFIXUP RECORD TABLE OFF Γöé
  2605.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2606.       70h Γöé IMPORT MODULE TBL OFF Γöé # IMPORT MOD ENTRIES  Γöé
  2607.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2608.       78h Γöé  IMPORT PROC TBL OFF  Γöé PER-PAGE CHECKSUM OFF Γöé
  2609.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2610.       80h Γöé   DATA PAGES OFFSET   Γöé    #PRELOAD PAGES     Γöé
  2611.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2612.       88h Γöé NON-RES NAME TBL OFF  Γöé NON-RES NAME TBL LEN  Γöé
  2613.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2614.       90h Γöé NON-RES NAME TBL CKSM Γöé   AUTO DS OBJECT #    Γöé
  2615.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2616.       98h Γöé    DEBUG INFO OFF     Γöé    DEBUG INFO LEN     Γöé
  2617.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2618.       A0h Γöé   #INSTANCE PRELOAD   Γöé   #INSTANCE DEMAND    Γöé
  2619.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2620.       A8h Γöé       HEAPSIZE        Γöé       STACKSIZE       Γöé
  2621.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2622.  
  2623. 32-bit Linear EXE Header 
  2624. Note  The OBJECT ITER PAGES OFF must either be 0 or set to the same value as 
  2625. DATA PAGES OFFSET in OS/2 2.0. Ie., iterated pages are required to be in the 
  2626. same section of the file as regular pages.  Note  Table offsets in the Linear 
  2627. EXE Header may be set to zero to indicate that the table does not exist in the 
  2628. EXE file and it's size is zero. 
  2629.  
  2630. "L" "X" = DW  Signature word. The signature word is used by the loader to 
  2631. identify the EXE file as a valid 32-bit Linear Executable Module Format. "L" is 
  2632. low order byte. "X" is high order byte. 
  2633.  
  2634. B-ORD = DB  Byte Ordering. This byte specifies the byte ordering for the linear 
  2635. EXE format.  The values are 
  2636.  
  2637.       00H - Little Endian Byte Ordering. 
  2638.       01H - Big Endian Byte Ordering. 
  2639.  
  2640. W-ORD = DB  Word Ordering. This byte specifies the Word ordering for the linear 
  2641. EXE format.  The values are 
  2642.  
  2643.       00H - Little Endian Word Ordering. 
  2644.       01H - Big Endian Word Ordering. 
  2645.  
  2646. Format Level = DD  Linear EXE Format Level. The Linear EXE Format Level is set 
  2647. to 0 for the initial version of the 32-bit linear EXE format.  Each 
  2648. incompatible change to the linear EXE format must increment this value.  This 
  2649. allows the system to recognized future EXE file versions so that an appropriate 
  2650. error message may be displayed if an attempt is made to load them. 
  2651.  
  2652. CPU Type = DW  Module CPU Type. This field specifies the type of CPU required 
  2653. by this module to run.  The values are 
  2654.  
  2655.       01H - 80286 or upwardly compatible CPU is required to execute this 
  2656.       module. 
  2657.       02H - 80386 or upwardly compatible CPU is required to execute this 
  2658.       module. 
  2659.       03H - 80486 or upwardly compatible CPU is required to execute this 
  2660.       module. 
  2661.  
  2662. OS Type = DW  Module OS Type. This field specifies the type of Operating system 
  2663. required to run this module. The currently defined values are 
  2664.  
  2665.       00H - Unknown (any "new-format" OS) 
  2666.       01H - OS/2 (default) 
  2667.       02H - WindowsReference 
  2668.       03H - DOS 4.x 
  2669.       04H - Windows 386Reference 
  2670.  
  2671. MODULE VERSION = DD  Version of the linear EXE module. This is useful for 
  2672. differentiating between revisions of dynamic linked modules. This value is 
  2673. specified at link time by the user. 
  2674.  
  2675. MODULE FLAGS = DD  Flag bits for the module. The module flag bits have the 
  2676. following definitions. 
  2677.  
  2678.       00000001h = Reserved for system use. 
  2679.       00000002h = Reserved for system use. 
  2680.       00000004h = Per-Process Library Initialization. The setting of this bit 
  2681.       requires the EIP Object # and EIP fields to have valid values.  If the 
  2682.       EIP Object # and EIP fields are valid and this bit is NOT set, then 
  2683.       Global Library Initialization is assumed.  Setting this bit for an EXE 
  2684.       file is invalid. 
  2685.  
  2686.       00000008h = Reserved for system use. 
  2687.       00000010h = Internal fixups for the module have been applied. The setting 
  2688.       of this bit in a Linear Executable Module indicates that each object of 
  2689.       the module has a preferred load address specified in the Object Table 
  2690.       Reloc Base Addr.  If the module's objects can not be loaded at these 
  2691.       preferred addresses, then the relocation records that have been retained 
  2692.       in the file data will be applied. 
  2693.  
  2694.       00000020h = External fixups for the module have been applied. 
  2695.       00000040h = Reserved for system use. 
  2696.       00000080h = Reserved for system use. 
  2697.       00000100h = Incompatible with PM windowing. 
  2698.       00000200h = Compatible with PM windowing. 
  2699.       00000300h = Uses PM windowing API. 
  2700.       00000400h = Reserved for system use. 
  2701.       00000800h = Reserved for system use. 
  2702.       00001000h = Reserved for system use. 
  2703.       00002000h = Module is not loadable. When the 'Module is not loadable' 
  2704.       flag is set, it indicates that either errors were detected at link time 
  2705.       or that the module is being incrementally linked and therefore can't be 
  2706.       loaded. 
  2707.  
  2708.       00004000h = Reserved for system use. 
  2709.       00038000h = Module type mask. 
  2710.       00000000h = Program module. A module can not contain dynamic links to 
  2711.       other modules that have the 'program module' type. 
  2712.  
  2713.       00008000h = Library module. 
  2714.       00018000h = Protected Memory Library module. 
  2715.       00020000h = Physical Device Driver module. 
  2716.       00028000h = Virtual Device Driver module. 
  2717.       40000000h = Per-process Library Termination. The setting of this bit 
  2718.       requires the EIP Object # and EIP fields to have valid values.  If the 
  2719.       EIP Object # and EIP fields are valid and this bit is NOT set, then 
  2720.       Global Library Termination is assumed.  Setting this bit for an EXE file 
  2721.       is invalid. 
  2722.  
  2723. MODULE # PAGES = DD  Physical number of pages in module. This field specifies 
  2724. the number of pages physically contained in this module. In other words, pages 
  2725. containing either enumerated or iterated data, not invalid or zero-fill pages. 
  2726. These pages are contained in the 'preload pages', 'demand load pages' and 
  2727. 'iterated data pages' sections of the linear EXE module.  This is used to 
  2728. determine the size of the other physical page based tables in the linear EXE 
  2729. module. 
  2730.  
  2731. EIP OBJECT # = DD The Object number to which the Entry Address is relative. 
  2732. This specifies the object to which the Entry Address is relative.  This must be 
  2733. a nonzero value for a program module to be correctly loaded. A zero value for a 
  2734. library module indicates that no library entry routine exists.  If this value 
  2735. is zero, then both the Per-process Library Initialization bit and the 
  2736. Per-process Library Termination bit must be clear in the module flags, or else 
  2737. the loader will fail to load the module.  Further, if the Per-process Library 
  2738. Termination bit is set, then the object to which this field refers must be a 
  2739. 32-bit object (i.e., the Big/Default bit must be set in the object flags; see 
  2740. below). 
  2741.  
  2742. EIP = DD  Entry Address of module. The Entry Address is the starting address 
  2743. for program modules and the library initialization and Library termination 
  2744. address for library modules. 
  2745.  
  2746. ESP OBJECT # = DD The Object number to which the ESP is relative. This 
  2747. specifies the object to which the starting ESP is relative.  This must be a 
  2748. nonzero value for a program module to be correctly loaded. This field is 
  2749. ignored for a library module. 
  2750.  
  2751. ESP = DD  Starting stack address of module. The ESP defines the starting stack 
  2752. pointer address for program modules.  A zero value in this field indicates that 
  2753. the stack pointer is to be initialized to the highest address/offset in the 
  2754. object. This field is ignored for a library module. 
  2755.  
  2756. PAGE SIZE = DD  The size of one page for this system. This field specifies the 
  2757. page size used by the linear EXE format and the system.  For the initial 
  2758. version of this linear EXE format the page size is 4Kbytes. (The 4K page size 
  2759. is specified by a value of 4096 in this field.) 
  2760.  
  2761. PAGE OFFSET SHIFT = DD The shift left bits for page offsets. This field gives 
  2762. the number of bit positions to shift left when interpreting the Object Page 
  2763. Table entries' page offset field.  This determines the alignment of the page 
  2764. information in the file.  For example, a value of 4 in this field would align 
  2765. all pages in the Data Pages and Iterated Pages sections on 16 byte (paragraph) 
  2766. boundaries.  A Page Offset Shift of 9 would align all pages on a 512 byte (disk 
  2767. sector) basis.  The default value for this field is 12 (decimal), which give a 
  2768. 4096 byte alignment.  All other offsets are byte aligned. 
  2769.  
  2770. FIXUP SECTION SIZE = DD  Total size of the fixup information in bytes. This 
  2771. includes the following 4 tables: 
  2772.  
  2773.       - Fixup Page Table 
  2774.       - Fixup Record Table 
  2775.       - Import Module name Table 
  2776.       - Import Procedure Name Table 
  2777.  
  2778. FIXUP SECTION CHECKSUM = DD  Checksum for fixup information. This is a 
  2779. cryptographic checksum covering all of the fixup information.  The checksum for 
  2780. the fixup information is kept separate because the fixup data is not always 
  2781. loaded into main memory with the 'loader section'.  If the checksum feature is 
  2782. not implemented, then the linker will set these fields to zero. 
  2783.  
  2784. LOADER SECTION SIZE = DD  Size of memory resident tables. This is the total 
  2785. size in bytes of the tables required to be memory resident for the module, 
  2786. while the module is in use.  This total size includes all tables from the 
  2787. Object Table down to and including the Per-Page Checksum Table. 
  2788.  
  2789. LOADER SECTION CHECKSUM = DD  Checksum for loader section. This is a 
  2790. cryptographic checksum covering all of the loader section information.  If the 
  2791. checksum feature is not implemented, then the linker will set these fields to 
  2792. zero. 
  2793.  
  2794. OBJECT TABLE OFF = DD  Object Table offset. This offset is relative to the 
  2795. beginning of the linear EXE header. 
  2796.  
  2797. # OBJECTS IN MODULE = DD  Object Table Count. This defines the number of 
  2798. entries in Object Table. 
  2799.  
  2800. OBJECT PAGE TABLE OFFSET = DD  Object Page Table offset This offset is relative 
  2801. to the beginning of the linear EXE header. 
  2802.  
  2803. OBJECT ITER PAGES OFF = DD  Object Iterated Pages offset. This offset is 
  2804. relative to the beginning of the EXE file. 
  2805.  
  2806. RESOURCE TABLE OFF = DD  Resource Table offset. This offset is relative to the 
  2807. beginning of the linear EXE header. 
  2808.  
  2809. # RESOURCE TABLE ENTRIES = DD  Number of entries in Resource Table. 
  2810.  
  2811. RESIDENT NAME TBL OFF = DD  Resident Name Table offset. This offset is relative 
  2812. to the beginning of the linear EXE header. 
  2813.  
  2814. ENTRY TBL OFF = DD  Entry Table offset. This offset is relative to the 
  2815. beginning of the linear EXE header. 
  2816.  
  2817. MODULE DIRECTIVES OFF = DD Module Format Directives Table offset. This offset 
  2818. is relative to the beginning of the linear EXE header. 
  2819.  
  2820. # MODULE DIRECTIVES = DD  Number of Module Format Directives in the Table. This 
  2821. field specifies the number of entries in the Module Format Directives Table. 
  2822.  
  2823. FIXUP PAGE TABLE OFF = DD  Fixup Page Table offset. This offset is relative to 
  2824. the beginning of the linear EXE header. 
  2825.  
  2826. FIXUP RECORD TABLE OFF = DD  Fixup Record Table Offset This offset is relative 
  2827. to the beginning of the linear EXE header. 
  2828.  
  2829. IMPORT MODULE TBL OFF = DD  Import Module Name Table offset. This offset is 
  2830. relative to the beginning of the linear EXE header. 
  2831.  
  2832. # IMPORT MOD ENTRIES = DD  The number of entries in the Import Module Name 
  2833. Table. 
  2834.  
  2835. IMPORT PROC TBL OFF = DD  Import Procedure Name Table offset. This offset is 
  2836. relative to the beginning of the linear EXE header. 
  2837.  
  2838. PER-PAGE CHECKSUM OFF = DD  Per-Page Checksum Table offset. This offset is 
  2839. relative to the beginning of the linear EXE header. 
  2840.  
  2841. DATA PAGES OFFSET = DD  Data Pages Offset. This offset is relative to the 
  2842. beginning of the EXE file. 
  2843.  
  2844. # PRELOAD PAGES = DD  Number of Preload pages for this module. Note that OS/2 
  2845. 2.0 does not respect the preload of pages as specified in the executable file 
  2846. for performance reasons. 
  2847.  
  2848. NON-RES NAME TBL OFF = DD  Non-Resident Name Table offset. This offset is 
  2849. relative to the beginning of the EXE file. 
  2850.  
  2851. NON-RES NAME TBL LEN = DD  Number of bytes in the Non-resident name table. 
  2852.  
  2853. NON-RES NAME TBL CKSM = DD  Non-Resident Name Table Checksum. This is a 
  2854. cryptographic checksum of the Non-Resident Name Table. 
  2855.  
  2856. AUTO DS OBJECT # = DD The Auto Data Segment Object number. This is the object 
  2857. number for the Auto Data Segment used by 16-bit modules. This field is 
  2858. supported for 16-bit compatibility only and is not used by 32-bit modules. 
  2859.  
  2860. DEBUG INFO OFF = DD  Debug Information offset. This offset is relative to the 
  2861. beginning of the file.  Note  Earlier versions of this doc stated that this 
  2862. offset was from the linear EXE header - this is incorrect. 
  2863.  
  2864. DEBUG INFO LEN = DD  Debug Information length. The length of the debug 
  2865. information in bytes. 
  2866.  
  2867.  # INSTANCE PRELOAD = DD Instance pages in preload section. The number of 
  2868. instance data pages found in the preload section. 
  2869.  
  2870.  # INSTANCE DEMAND = DD Instance pages in demand section. The number of 
  2871. instance data pages found in the demand section. 
  2872.  
  2873.  HEAPSIZE = DD Heap size added to the Auto DS Object. The heap size is the 
  2874. number of bytes added to the Auto Data Segment by the loader.  This field is 
  2875. supported for 16-bit compatibility only and is not used by 32-bit modules. 
  2876.  
  2877.  STACKSIZE = DD Stack size. The stack size is the number of bytes specified by: 
  2878.  
  2879.        1. size of a segment with combine type stack 
  2880.  
  2881.        2. STACKSIZE in the .DEF file 
  2882.  
  2883.        3. /STACK link option 
  2884.  
  2885.           The stacksize may be zero. 
  2886.  
  2887.           Note  Stack sizes with byte 2 equal to 02 or 04 (e.g. 00020000h, 
  2888.           11041111h, 0f02ffffh) should be avoided for programs that will run on 
  2889.           OS/2 2.0. 
  2890.  
  2891.  
  2892. ΓòÉΓòÉΓòÉ 3.4. Program (EXE) startup registers and Library entry registers ΓòÉΓòÉΓòÉ
  2893.  
  2894. Program startup registers are defined as follows. 
  2895.  
  2896.    EIP = Starting program entry address. 
  2897.  
  2898.    ESP = Top of stack address. 
  2899.  
  2900.    CS = Code selector for base of linear address space. 
  2901.  
  2902.    DS = ES = SS = Data selector for base of linear address space. 
  2903.  
  2904.    FS = Data selector of base of Thread Information Block (TIB). 
  2905.  
  2906.    GS = 0. 
  2907.  
  2908.    EAX = EBX = 0. 
  2909.  
  2910.    ECX = EDX = 0. 
  2911.  
  2912.    ESI = EDI = 0. 
  2913.  
  2914.    EBP = 0. 
  2915.  
  2916.    [ESP+0] = Return address to routine which calls DosExit(1,EAX). 
  2917.  
  2918.    [ESP+4] = Module handle for program module. 
  2919.  
  2920.    [ESP+8] = Reserved. 
  2921.  
  2922.    [ESP+12] = Environment data object address. 
  2923.  
  2924.    [ESP+16] = Command line linear address in environment data object. 
  2925.  Library initialization registers are defined as follows. 
  2926.  
  2927.    EIP = Library entry address. 
  2928.  
  2929.    ESP = User program stack. 
  2930.  
  2931.    CS = Code selector for base of linear address space. 
  2932.  
  2933.    DS = ES = SS = Data selector for base of linear address space. 
  2934.  
  2935.    FS = Data selector of base of Thread Information Block (TIB). 
  2936.  
  2937.    GS = 0. 
  2938.  
  2939.    EAX = EBX = 0. 
  2940.  
  2941.    ECX = EDX = 0. 
  2942.  
  2943.    ESI = EDI = 0. 
  2944.  
  2945.    EBP = 0. 
  2946.  
  2947.    [ESP+0] = Return address to system, (EAX) = return code. 
  2948.  
  2949.    [ESP+4] = Module handle for library module. 
  2950.  
  2951.    [ESP+8] = 0 (Initialization) Note that a 32-bit library may specify that its 
  2952. entry address is in a 16-bit code object.  In this case, the entry registers 
  2953. are the same as for entry to a library using the Segmented EXE format.  These 
  2954. are documented elsewhere. This means that a 16-bit library may be relinked to 
  2955. take advantage of the benefits of the Linear EXE format (notably, efficient 
  2956. paging). 
  2957.  Library termination registers are defined as follows. 
  2958.  
  2959.    EIP = Library entry address. 
  2960.  
  2961.    ESP = User program stack. 
  2962.  
  2963.    CS = Code selector for base of linear address space. 
  2964.  
  2965.    DS = ES = SS = Data selector for base of linear address space. 
  2966.  
  2967.    FS = Data selector of base of Thread Information Block (TIB). 
  2968.  
  2969.    GS = 0. 
  2970.  
  2971.    EAX = EBX = 0. 
  2972.  
  2973.    ECX = EDX = 0. 
  2974.  
  2975.    ESI = EDI = 0. 
  2976.  
  2977.    EBP = 0. 
  2978.  
  2979.    [ESP+0] = Return address to system. 
  2980.  
  2981.    [ESP+4] = Module handle for library module. 
  2982.  
  2983.    [ESP+8] = 1 (Termination) Note that Library termination is not allowed for 
  2984. libraries with 16-bit entries. 
  2985.  
  2986.  
  2987. ΓòÉΓòÉΓòÉ 3.5. Object Table ΓòÉΓòÉΓòÉ
  2988.  
  2989. The number of entries in the Object Table is given by the # Objects in Module 
  2990. field in the linear EXE header.  Entries in the Object Table are numbered 
  2991. starting from one.  Each Object Table entry has the following format 
  2992.  
  2993.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2994.       00h Γöé     VIRTUAL SIZE      Γöé    RELOC BASE ADDR    Γöé
  2995.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2996.       08h Γöé     OBJECT FLAGS      Γöé    PAGE TABLE INDEX   Γöé
  2997.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2998.       10h Γöé  # PAGE TABLE ENTRIES Γöé       RESERVED        Γöé
  2999.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3000.  
  3001. Object Table 
  3002.  
  3003. VIRTUAL SIZE = DD  Virtual memory size. This is the size of the object that 
  3004. will be allocated when the object is loaded.  The object data length must be 
  3005. less than or equal to the total size of the pages in the EXE file for the 
  3006. object. This memory size must also be large enough to contain all of the 
  3007. iterated data and uninitialized data in the EXE file. 
  3008.  
  3009. RELOC BASE ADDR = DD Relocation Base Address. The relocation base address the 
  3010. object is currently relocated to. If the internal relocation fixups for the 
  3011. module have been removed, this is the address the object will be allocated at 
  3012. by the loader. 
  3013.  
  3014. OBJECT FLAGS = DW  Flag bits for the object. The object flag bits have the 
  3015. following definitions. 
  3016.  
  3017.       0001h = Readable Object. 
  3018.       0002h = Writable Object. 
  3019.       0004h = Executable Object. The readable, writable and executable flags 
  3020.       provide support for all possible protections.  In systems where all of 
  3021.       these protections are not supported,  the loader will be responsible for 
  3022.       making the appropriate protection match for the system. 
  3023.  
  3024.       0008h = Resource Object. 
  3025.       0010h = Discardable Object. 
  3026.       0020h = Object is Shared. 
  3027.       0040h = Object has Preload Pages. 
  3028.       0080h = Object has Invalid Pages. 
  3029.       0100h = Object has Zero Filled Pages. 
  3030.       0200h = Object is Resident (valid for VDDs, PDDs only). 
  3031.       0300h = Object is Resident  Contiguous (VDDs, PDDs only). 
  3032.       0400h = Object is Resident  'long-lockable' (VDDs, PDDs only). 
  3033.       0800h = Reserved for system use. 
  3034.       1000h = 16 
  3035.       2000h = Big/Default Bit Setting (80x86 Specific). The 'big/default' bit , 
  3036.       for data segments, controls the setting of the Big bit in the segment 
  3037.       descriptor.  (The Big bit, or B-bit, determines whether ESP or SP is used 
  3038.       as the stack pointer.)  For code segments, this bit controls the setting 
  3039.       of the Default bit in the segment descriptor. (The Default bit, or D-bit, 
  3040.       determines whether the default word size is 32-bits or 16-bits.  It also 
  3041.       affects the interpretation of the instruction stream.) 
  3042.  
  3043.       4000h = Object is conforming for code (80x86 Specific). 
  3044.       8000h = Object I/O privilege level (80x86 Specific). Only used for 16 
  3045.  
  3046. PAGE TABLE INDEX = DD  Object Page Table Index. This specifies the number of 
  3047. the first object page table entry for this object.  The object page table 
  3048. specifies where in the EXE file a page can be found for a given object and 
  3049. specifies per-page attributes.  The object table entries are ordered by logical 
  3050. page in the object table. In other words the object table entries are sorted 
  3051. based on the object page table index value. 
  3052.  
  3053. # PAGE TABLE ENTRIES = DD  # of object page table entries for this object. Any 
  3054. logical pages at the end of an object that do not have an entry in the object 
  3055. page table associated with them are handled as zero filled or invalid pages by 
  3056. the loader.  When the last logical pages of an object are not specified with an 
  3057. object page table entry, they are treated as either zero filled pages or 
  3058. invalid pages based on the last entry in the object page table for that object. 
  3059. If the last entry was neither a zero filled or invalid page, then the 
  3060. additional pages are treated as zero filled pages. 
  3061.  
  3062. RESERVED = DD  Reserved for future use. Must be set to zero. 
  3063.  
  3064.  
  3065. ΓòÉΓòÉΓòÉ 3.6. Object Page Table ΓòÉΓòÉΓòÉ
  3066.  
  3067. The Object page table provides information about a logical page in an object. A 
  3068. logical page may be an enumerated page, a pseudo page or an iterated page. The 
  3069. structure of the object page table in conjunction with the structure of the 
  3070. object table allows for efficient access of a page when a page fault occurs, 
  3071. while still allowing the physical page data to be located in the preload page, 
  3072. demand load page or iterated data page sections in the linear EXE module. The 
  3073. logical page entries in the Object Page Table are numbered starting from one. 
  3074. The Object Page Table is parallel to the Fixup Page Table as they are both 
  3075. indexed by the logical page number.  Each Object Page Table entry has the 
  3076. following format 
  3077.  
  3078.  
  3079.          63                     32 31       16 15         0
  3080.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3081.       00h Γöé    PAGE DATA OFFSET   Γöé DATA SIZE Γöé   FLAGS   Γöé
  3082.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3083.  
  3084.  
  3085.  
  3086. Object Page Table Entry 
  3087.  
  3088. PAGE DATA OFFSET = DD  Offset to the page data in the EXE file. This field, 
  3089. when bit shifted left by the PAGE OFFSET SHIFT from the module header, 
  3090. specifies the offset from the beginning of the Preload Page section of the 
  3091. physical page data in the EXE file that corresponds to this logical page entry. 
  3092. The page data may reside in the Preload Pages, Demand Load Pages or the 
  3093. Iterated Data Pages sections.  If the FLAGS field specifies that this is a 
  3094. Zero-Filled page then the PAGE DATA OFFSET field will contain a 0.  If the 
  3095. logical page is specified as an iterated data page, as indicated by the FLAGS 
  3096. field, then this field specifies the offset into the Iterated Data Pages 
  3097. section.  The logical page number (Object Page Table index), is used to index 
  3098. the Fixup Page Table to find any fixups associated with the logical page. 
  3099.  
  3100. DATA SIZE = DW  Number of bytes of data for this page. This field specifies the 
  3101. actual number of bytes that represent the page in the file.  If the PAGE SIZE 
  3102. field from the module header is greater than the value of this field and the 
  3103. FLAGS field indicates a Legal Physical Page, the remaining bytes are to be 
  3104. filled with zeros.  If the FLAGS field indicates an Iterated Data Page, the 
  3105. iterated data records will completely fill out the remainder. 
  3106.  
  3107. FLAGS = DW  Attributes specifying characteristics of this logical page. The bit 
  3108. definitions for this word field follow, 
  3109.  
  3110.       00h = Legal Physical Page in the module (Offset from Preload Page 
  3111.       Section). 
  3112.       01h = Iterated Data Page (Offset from Iterated Data Pages Section). 
  3113.       02h = Invalid Page (zero). 
  3114.       03h = Zero Filled Page (zero). 
  3115.       04h = Range of Pages. 
  3116.  
  3117.  
  3118. ΓòÉΓòÉΓòÉ 3.7. Resource Table ΓòÉΓòÉΓòÉ
  3119.  
  3120. The resource table is an array of resource table entries.  Each resource table 
  3121. entry contains a type ID and name ID.  These entries are used to locate 
  3122. resource objects contained in the Object table.  The number of entries in the 
  3123. resource table is defined by the Resource Table Count located in the linear EXE 
  3124. header.  More than one resource may be contained within a single object. 
  3125. Resource table entries are in a sorted order, (ascending, by Resource Name ID 
  3126. within the Resource Type ID).  This allows the DosGetResource API function to 
  3127. use a binary search when looking up a resource in a 32-bit module instead of 
  3128. the linear search being used in the current 16-bit module.  Each resource entry 
  3129. has the following format 
  3130.  
  3131.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3132.       00h Γöé  TYPE ID  Γöé  NAME ID  Γöé
  3133.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3134.       04h Γöé     RESOURCE SIZE     Γöé
  3135.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3136.       08h Γöé   OBJECT  Γöé        OFFSET         Γöé
  3137.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3138.  
  3139. Resource Table 
  3140.  
  3141. TYPE ID = DW  Resource type ID. The type of resources are 
  3142.  
  3143.       01h = RT_POINTER    = mouse pointer shape 
  3144.       02h = RT_BITMAP    = bitmap 
  3145.       03h = RT_MENU     = menu template 
  3146.       04h = RT_DIALOG    = dialog template 
  3147.       05h = RT_STRING    = string tables 
  3148.       06h = RT_FONTDIR    = font directory 
  3149.       07h = RT_FONT     = font 
  3150.       08h = RT_ACCELTABLE  = accelerator tables 
  3151.       09h = RT_RCDATA    = binary data 
  3152.       0Ah = RT_MESSAGE    = error msg tables 
  3153.       0Bh = RT_DLGINCLUDE  = dialog include file name 
  3154.       0Ch = RT_VKEYTBL    = key to vkey tables 
  3155.       0Dh = RT_KEYTBL    = key to UGL tables 
  3156.       0Eh = RT_CHARTBL    = glyph to character tables 
  3157.       0Fh = RT_DISPLAYINFO  = screen display information 
  3158.       10h = RT_FKASHORT   = function key area short form 
  3159.       11h = RT_FKALONG    = function key area long form 
  3160.       12h = RT_HELPTABLE   = Help table for Cary Help manager 
  3161.       13h = RT_HELPSUBTABLE = Help subtable for Cary Help manager 
  3162.       14h = RT_FDDIR     = DBCS uniq/font driver directory 
  3163.       15h = RT_FD      = DBCS uniq/font driver 
  3164.  
  3165. NAME ID = DW  An ID used as a name for the resource when referred to. 
  3166.  
  3167. RESOURCE SIZE = DD  The number of bytes the resource consists of. 
  3168.  
  3169. OBJECT = DW  The number of the object which contains the resource. 
  3170.  
  3171. OFFSET = DD  The offset within the specified object where the resource begins. 
  3172.  
  3173.  
  3174. ΓòÉΓòÉΓòÉ 3.8. Resident or Non-resident Name Table Entry ΓòÉΓòÉΓòÉ
  3175.  
  3176. The resident and non-resident name tables define the ASCII names and ordinal 
  3177. numbers for exported entries in the module. In addition the first entry in the 
  3178. resident name table contains the module name. These tables are used to 
  3179. translate a procedure name string into an ordinal number by searching for a 
  3180. matching name string. The ordinal number is used to locate the entry point 
  3181. information in the entry table.  The resident name table is kept resident in 
  3182. system memory while the module is loaded.  It is intended to contain the 
  3183. exported entry point names that are frequently dynamicaly linked to by name. 
  3184. Non-resident names are not kept in memory and are read from the EXE file when a 
  3185. dynamic link reference is made.  Exported entry point names that are 
  3186. infrequently dynamicaly linked to by name or are commonly referenced by ordinal 
  3187. number should be placed in the non-resident name table.  The trade off made for 
  3188. references by name is performance vs memory usage.  Import references by name 
  3189. require these tables to be searched to obtain the entry point ordinal number. 
  3190. Import references by ordinal number provide the fastest lookup since the search 
  3191. of these tables is not required. 
  3192.  
  3193. Installable File Systems, Physical Device Drivers, and Virtual Device Drivers 
  3194. are closed after the file is loaded.  Any refeference to the non-resident name 
  3195. table after this time will fail.  The strings are CASE SENSITIVE and are NOT 
  3196. NULL TERMINATED.  Each name table entry has the following format 
  3197.  
  3198.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ     ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3199.       00h Γöé LEN Γöé    ASCII STRING  . . .      Γöé ORDINAL # Γöé
  3200.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ     ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3201.  
  3202. Resident or Non-resident Name Table Entry 
  3203.  
  3204. LEN = DB  String Length. This defines the length of the string in bytes. A zero 
  3205. length indicates there are no more entries in table. The length of each ascii 
  3206. name string is limited to 127 characters.  The high bit in the LEN field (bit 
  3207. 7) is defined as an Overload bit. This bit signifies that additional 
  3208. information is contained in the linear EXE module and will be used in the 
  3209. future for parameter type checking. 
  3210.  
  3211. ASCII STRING = DB  ASCII String. This is a variable length string with it's 
  3212. length defined in bytes by the LEN field.  The string is case case sensitive 
  3213. and is not null terminated. 
  3214.  
  3215. ORDINAL # = DW  Ordinal number. The ordinal number in an ordered index into the 
  3216. entry table for this entry point. 
  3217.  
  3218.  
  3219. ΓòÉΓòÉΓòÉ 3.9. Entry Table ΓòÉΓòÉΓòÉ
  3220.  
  3221. The entry table contains object and offset information that is used to resolve 
  3222. fixup references to the entry points within this module. Not all entry points 
  3223. in the entry table will be exported, some entry points will only be used within 
  3224. the module.  An ordinal number is used to index into the entry table.  The 
  3225. entry table entries are numbered starting from one.  The list of entries are 
  3226. compressed into 'bundles', where possible. The entries within each bundle are 
  3227. all the same size. A bundle starts with a count field which indicates the 
  3228. number of entries in the bundle.  The count is followed by a type field which 
  3229. identifies the bundle format.  This provides both a means for saving space as 
  3230. well as a mechanism for extending the bundle types.  The type field allows the 
  3231. definition of 256 bundle types.  The following bundle types will initially be 
  3232. defined: 
  3233.  
  3234. Unused Entry. 
  3235. 16-bit Entry. 
  3236. 286 Call Gate Entry. 
  3237. 32-bit Entry. 
  3238. Forwarder Entry. 
  3239. The bundled entry table has the following format 
  3240.  
  3241.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3242.       00h Γöé CNT ΓöéTYPE Γöé BUNDLE INFO . . Γöé
  3243.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3244.  
  3245. Entry Table 
  3246.  
  3247. CNT = DB  Number of entries. This is the number of entries in this bundle.  A 
  3248. zero value for the number of entries identifies the end of the entry table. 
  3249. There is no further bundle information when the number of entries is zero.  In 
  3250. other words the entry table is terminated by a single zero byte. 
  3251.  
  3252. TYPE = DB  Bundle type. This defines the  bundle type  which determines the 
  3253. contents of the BUNDLE INFO.  The follow types are defined 
  3254.  
  3255.          00h = Unused Entry. 
  3256.          01h = 16-bit Entry. 
  3257.          02h = 286 Call Gate Entry. 
  3258.          03h = 32-bit Entry. 
  3259.          04h = Forwarder Entry. 
  3260.          80h = Parameter Typing Information Present. This bit signifies that 
  3261.          additional information is contained in the linear EXE module and will 
  3262.          be used in the future for parameter type checking. 
  3263.  
  3264. The following is the format for each bundle type 
  3265.  
  3266.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3267.       00h Γöé CNT ΓöéTYPE Γöé
  3268.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3269.  
  3270.    CNT = DB  Number of entries. This is the number of unused entries to skip. 
  3271.  
  3272.    TYPE = DB  0 (Unused Entry) 
  3273.  
  3274.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3275.       00h Γöé CNT ΓöéTYPE Γöé   OBJECT  Γöé
  3276.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3277.       04h ΓöéFLAGSΓöé  OFFSET   Γöé
  3278.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3279.       07h Γöé ... Γöé   . Γöé .   Γöé
  3280.  
  3281.    CNT = DB  Number of entries. This is the number of 16-bit entries in this 
  3282.    bundle.  The flags and offset value are repeated this number of times. 
  3283.  
  3284.    TYPE = DB  1 (16-bit Entry) 
  3285.  
  3286.       OBJECT = DW  Object number. This is the object number for the entries in 
  3287.       this bundle. 
  3288.  
  3289.       FLAGS = DB  Entry flags. These are the flags for this entry point.  They 
  3290.       have the following definition. 
  3291.  
  3292.             01h = Exported entry flag. 
  3293.             F8h = Parameter word count mask. 
  3294.  
  3295.       OFFSET = DW  Offset in object. This is the offset in the object for the 
  3296.       entry point defined at this ordinal number. 
  3297.  
  3298.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3299.       00h Γöé CNT ΓöéTYPE Γöé   OBJECT  Γöé
  3300.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3301.       04h ΓöéFLAGSΓöé  OFFSET   Γöé CALLGATE  Γöé
  3302.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3303.       09h Γöé ... Γöé   . . .   Γöé   . . .   Γöé
  3304.  
  3305.    CNT = DB  Number of entries. This is the number of 286 call gate entries in 
  3306.    this bundle.  The flags, callgate, and offset value are repeated this number 
  3307.    of times. 
  3308.  
  3309.    TYPE = DB  2 (286 Call Gate Entry) The 286 Call Gate Entry Point type is 
  3310.    needed by the loader only if ring 2 segments are to be supported. 286 Call 
  3311.    Gate entries contain 2 extra bytes which are used by the loader to store an 
  3312.    LDT callgate selector value. 
  3313.  
  3314.    OBJECT = DW  Object number. This is the object number for the entries in 
  3315.    this bundle. 
  3316.  
  3317.    FLAGS = DB  Entry flags. These are the flags for this entry point.  They 
  3318.    have the following definition. 
  3319.  
  3320.          01h = Exported entry flag. 
  3321.          F8h = Parameter word count mask. 
  3322.  
  3323.    OFFSET = DW  Offset in object. This is the offset in the object for the 
  3324.    entry point defined at this ordinal number. 
  3325.  
  3326.    CALLGATE = DW  Callgate selector. The callgate selector is a reserved field 
  3327.    used by the loader to store a call gate selector value for references to 
  3328.    ring 2 entry points.  When a ring 3 reference to a ring 2 entry point is 
  3329.    made, the callgate selector with a zero offset is place in the relocation 
  3330.    fixup address.  The segment number and offset in segment is placed in the 
  3331.    LDT callgate. 
  3332.  
  3333.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3334.       00h Γöé CNT ΓöéTYPE Γöé   OBJECT  Γöé
  3335.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3336.       04h ΓöéFLAGSΓöé        OFFSET         Γöé
  3337.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3338.       09h Γöé ... Γöé         . . .         Γöé
  3339.  
  3340.    CNT = DB  Number of entries. This is the number of 32-bit entries in this 
  3341.    bundle.  The flags and offset value are repeated this number of times. 
  3342.  
  3343.    TYPE = DB  3 (32-bit Entry) The 32-bit Entry type will only be defined by 
  3344.    the linker when the offset in the object can not be specified by a 16-bit 
  3345.    offset. 
  3346.  
  3347.    OBJECT = DW  Object number. This is the object number for the entries in 
  3348.    this bundle. 
  3349.  
  3350.    FLAGS = DB  Entry flags. These are the flags for this entry point.  They 
  3351.    have the following definition. 
  3352.  
  3353.          01h = Exported entry flag. 
  3354.          F8h = Parameter dword count mask. 
  3355.  
  3356.    OFFSET = DD  Offset in object. This is the offset in the object for the 
  3357.    entry point defined at this ordinal number. 
  3358.  
  3359.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3360.       00h Γöé CNT ΓöéTYPE Γöé RESERVED  Γöé
  3361.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3362.       04h ΓöéFLAGSΓöé MOD ORD#  Γöé OFFSET / ORDNUM       Γöé
  3363.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3364.       09h Γöé ... Γöé    ...    Γöé          ...          Γöé
  3365.  
  3366. CNT = DB  Number of entries. This is the number of forwarder entries in this 
  3367. bundle.  The FLAGS, MOD ORD#, and OFFSET/ORDNUM values are repeated this number 
  3368. of times. 
  3369.  
  3370. TYPE = DB  4 (Forwarder Entry) 
  3371.  
  3372. RESERVED = DW 0 This field is reserved for future use. 
  3373.  
  3374. FLAGS = DB  Forwarder flags. These are the flags for this entry point.  They 
  3375. have the following definition. 
  3376.  
  3377.       01h = Import by ordinal. 
  3378.       F7h = Reserved for future use; should be zero. 
  3379.  
  3380. MOD ORD# = DW Module Ordinal Number This is the index into the Import Module 
  3381. Name Table for this forwarder. 
  3382.  
  3383. OFFSET / ORDNUM = DD Procedure Name Offset or Import Ordinal Number If the 
  3384. FLAGS field indicates import by ordinal, then this field is the ordinal number 
  3385. into the Entry Table of the target module, otherwise this field is the offset 
  3386. into the Procedure Names Table of the target module. 
  3387.  
  3388. A Forwarder entry (type = 4) is an entry point whose value is an imported 
  3389. reference.  When a load time fixup occurs whose target is a forwarder, the 
  3390. loader obtains the address imported by the forwarder and uses that imported 
  3391. address to resolve the fixup. 
  3392.  
  3393. A forwarder may refer to an entry point in another module which is itself a 
  3394. forwarder, so there can be a chain of forwarders.  The loader will traverse the 
  3395. chain until it finds a non-forwarded entry point which terminates the chain , 
  3396. and use this to resolve the original fixup. Circular chains are detected by the 
  3397. loader and result in a load time error.  A maximum of 1024 forwarders is 
  3398. allowed in a chain; more than this results in a load time error. 
  3399.  
  3400. Forwarders are useful for merging and recombining API calls into different sets 
  3401. of libraries, while maintaining compatibility with applications. For example, 
  3402. if one wanted to combine MONCALLS, MOUCALLS, and VIOCALLS into a single 
  3403. libraries, one could provide entry points for the three libraries that are 
  3404. forwarders pointing to the common implementation. 
  3405.  
  3406.  
  3407. ΓòÉΓòÉΓòÉ 3.10. Module Format Directives Table ΓòÉΓòÉΓòÉ
  3408.  
  3409. The Module Format Directives Table is an optional table that allows additional 
  3410. options to be specified. It also allows for the extension of the linear EXE 
  3411. format by allowing additional tables of information to be added to the linear 
  3412. EXE module without affecting the format of the linear EXE header. Likewise, 
  3413. module format directives provide a place in the linear EXE module for 
  3414. 'temporary tables' of information, such as incremental linking information and 
  3415. statistic information gathered on the module.  When there are no module format 
  3416. directives for a linear EXE module, the fields in the linear EXE header 
  3417. referencing the module format directives table are zero.  Each Module Format 
  3418. Directive Table entry has the following format 
  3419.  
  3420.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3421.       00h Γöé DIRECT #  Γöé DATA LEN  Γöé     DATA OFFSET     Γöé
  3422.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3423.  
  3424. Module Format Directive Table 
  3425.  
  3426. DIRECT # = DW  Directive number. The directive number specifies the type of 
  3427. directive defined. This can be used to determine the format of the information 
  3428. in the directive data. The following directive numbers have been defined 
  3429.  
  3430.       8000h = Resident Flag Mask. Directive numbers with this bit set indicate 
  3431.       that the directive data is in the resident area and will be kept resident 
  3432.       in memory when the module is loaded. 
  3433.  
  3434.       8001h = Verify Record Directive. (Verify record is a resident table.) 
  3435.       0002h = Language Information Directive. (This is a non-resident table.) 
  3436.       0003h = Co-Processor Required Support Table. 
  3437.       0004h = Thread State Initialization Directive. Additional directives can 
  3438.    be added as needed in the future, as long as they do not overlap previously 
  3439.    defined directive numbers. 
  3440.  
  3441. DATA LEN = DW  Directive data length. This specifies the length in byte of the 
  3442. directive data for this directive number. 
  3443.  
  3444. DIRECTIVE OFFSET = DD  Directive data offset. This is the offset to the 
  3445. directive data for this directive number. It is relative to beginning of linear 
  3446. EXE header for a resident table, and relative to the beginning of the EXE file 
  3447. for non-resident tables. 
  3448.  
  3449.  
  3450. ΓòÉΓòÉΓòÉ 3.11. Verify Record Directive Table ΓòÉΓòÉΓòÉ
  3451.  
  3452. The Verify Record Directive Table is an optional table. It maintains a record 
  3453. of the pages in the EXE file that have been fixed up and written back to the 
  3454. original linear EXE module, along with the module dependencies used to perform 
  3455. these fixups.  This table provides an efficient means for verifying the virtual 
  3456. addresses required for the fixed up pages when the module is loaded.  Each 
  3457. Verify Record entry has the following format 
  3458.  
  3459.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3460.       00h Γöé# OF ENTRY Γöé
  3461.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3462.       02h Γöé MOD ORD # Γöé  VERSION  Γöé MOD # OBJ Γöé
  3463.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3464.       08h Γöé OBJECT #  Γöé BASE ADDR Γöé  VIRTUAL  Γöé
  3465.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3466.       0Eh Γöé   . . .   Γöé   . . .   Γöé   . . .   Γöé
  3467.  
  3468.  
  3469. Verify Record Table 
  3470.  
  3471. # OF ENTRY = DW  Number of module dependencies. This field specifies how many 
  3472. entries there are in the verify record directive table. This is equal to the 
  3473. number of modules referenced by this module. 
  3474.  
  3475. MOD ORD # = DW  Ordinal index into the Import Module Name Table. This value is 
  3476. an ordered index in to the Import Module Name Table for the referenced module. 
  3477.  
  3478. VERSION = DW  Module Version. This is the version of the referenced module that 
  3479. the fixups were originally performed.  This is used to insure the same version 
  3480. of the referenced module is loaded that was fixed up in this module and 
  3481. therefore the fixups are still correct.  This requires the version number in a 
  3482. module to be incremented anytime the entry point offsets change. 
  3483.  
  3484. MOD # OBJ = DW  Module # of Object Entries. This field is used to identify the 
  3485. number of object verify entries that follow for the referenced module. 
  3486.  
  3487. OBJECT # = DW  Object # in Module. This field specifies the object number in 
  3488. the referenced module that is being verified. 
  3489.  
  3490. BASE ADDR = DW  Object load base address. This is the address that the object 
  3491. was loaded at when the fixups were performed. 
  3492.  
  3493. VIRTUAL = DW  Object virtual address size. This field specifies the total 
  3494. amount of virtual memory required for this object. 
  3495.  
  3496.  
  3497. ΓòÉΓòÉΓòÉ 3.12. Per-Page Checksum ΓòÉΓòÉΓòÉ
  3498.  
  3499. The Per-Page Checksum table provides space for a cryptographic checksum for 
  3500. each physical page in the EXE file.  The checksum table is arranged such that 
  3501. the first entry in the table corresponds to the first logical page of code/data 
  3502. in the EXE file (usually a preload page) and the last entry corresponds to the 
  3503. last logical page in the EXE file (usually a iterated data page). 
  3504.  
  3505.                     ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3506.    Logical Page #1  Γöé        CHECKSUM       Γöé
  3507.                     Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3508.    Logical Page #2  Γöé        CHECKSUM       Γöé
  3509.                     ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3510.                               . . .
  3511.  
  3512.                     ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3513.    Logical Page #n  Γöé        CHECKSUM       Γöé
  3514.                     ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3515.  
  3516. Per-Page Checksum 
  3517.  
  3518. CHECKSUM = DD  Cryptographic checksum. 
  3519.  
  3520.  
  3521. ΓòÉΓòÉΓòÉ 3.13. Fixup Page Table ΓòÉΓòÉΓòÉ
  3522.  
  3523. The Fixup Page Table provides a simple mapping of a logical page number to an 
  3524. offset into the Fixup Record Table for that page.  This table is parallel to 
  3525. the Object Page Table, except that there is one additional entry in this table 
  3526. to indicate the end of the Fixup Record Table.  The format of each entry is 
  3527.  
  3528.                   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3529.  Logical Page #1  Γöé  OFFSET FOR PAGE #1   Γöé
  3530.                   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3531.  Logical Page #2  Γöé  OFFSET FOR PAGE #2   Γöé
  3532.                   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3533.                             . . .
  3534.                   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3535.  Logical Page #n  Γöé  OFFSET FOR PAGE #n   Γöé
  3536.                   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3537.                   ΓöéOFF TO END OF FIXUP RECΓöé   This is equal to:
  3538.                   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ   Offset for page #n + Size
  3539.                                               of fixups for page #n
  3540.  
  3541. Fixup Page Table 
  3542.  
  3543. OFFSET FOR PAGE # = DD  Offset for fixup record for this page. This field 
  3544. specifies the offset, from the beginning of the fixup record table, to the 
  3545. first fixup record for this page. 
  3546.  
  3547. OFF TO END OF FIXUP REC = DD  Offset to the end of the fixup records. This 
  3548. field specifies the offset following the last fixup record in the fixup record 
  3549. table.  This is the last entry in the fixup page table.  The fixup records are 
  3550. kept in order by logical page in the fixup record table.  This allows the end 
  3551. of each page's fixup records is defined by the offset for the next logical 
  3552. page's fixup records.  This last entry provides support of this mechanism for 
  3553. the last page in the fixup page table. 
  3554.  
  3555.  
  3556. ΓòÉΓòÉΓòÉ 3.14. Fixup Record Table ΓòÉΓòÉΓòÉ
  3557.  
  3558. The Fixup Record Table contains entries for all fixups in the linear EXE 
  3559. module.  The fixup records for a logical page are grouped together and kept in 
  3560. sorted order by logical page number.  The fixups for each page are further 
  3561. sorted such that all external fixups and internal selector/pointer fixups come 
  3562. before internal non-selector/non-pointer fixups.  This allows the loader to 
  3563. ignore internal fixups if the loader is able to load all objects at the 
  3564. addresses specified in the object table.  Each relocation record has the 
  3565. following format 
  3566.  
  3567.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3568.       00h Γöé SRC ΓöéFLAGSΓöéSRCOFF/CNT*Γöé
  3569.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3570.   03h/04h Γöé           TARGET DATA *           Γöé
  3571.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3572.           Γöé SRCOFF1 @ Γöé   . . .   Γöé SRCOFFn @ Γöé
  3573.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3574.  
  3575.         * These fields are variable size.
  3576.         @ These fields are optional.
  3577.  
  3578. Fixup Record Table 
  3579.  
  3580. SRC = DB  Source type. The source type specifies the size and type of the fixup 
  3581. to be performed on the fixup source.  The source type is defined as follows 
  3582.  
  3583.       0Fh = Source mask. 
  3584.       00h = Byte fixup (8-bits). 
  3585.       01h = (undefined). 
  3586.       02h = 16-bit Selector fixup (16-bits). 
  3587.       03h = 16 
  3588.       04h = (undefined). 
  3589.       05h = 16-bit Offset fixup (16-bits). 
  3590.       06h = 16 
  3591.       07h = 32-bit Offset fixup (32-bits). 
  3592.       08h = 32-bit Self-relative offset fixup (32-bits). 
  3593.       10h = Fixup to Alias Flag. When the 'Fixup to Alias' Flag is set, the 
  3594.       source fixup refers to the 16  This is only valid for source types of 2, 
  3595.       3, and 6. For fixups such as this, the linker and loader will be required 
  3596.       to perform additional checks such as ensuring that the target offset for 
  3597.       this fixup is less than 64K. 
  3598.  
  3599.       20h = Source List Flag. When the 'Source List' Flag is set, the SRCOFF 
  3600.       field is compressed to a byte and contains the number of source offsets, 
  3601.       and a list of source offsets follows the end of fixup record (after the 
  3602.       optional additive value). 
  3603.  
  3604. FLAGS = DB  Target Flags. The target flags specify how the target information 
  3605. is interpreted. The target flags are defined as follows 
  3606.  
  3607.       03h = Fixup target type mask. 
  3608.       00h = Internal reference. 
  3609.       01h = Imported reference by ordinal. 
  3610.       02h = Imported reference by name. 
  3611.       03h = Internal reference via entry table. 
  3612.       04h = Additive Fixup Flag. When set, an additive value trails the fixup 
  3613.       record (before the optional source offset list). 
  3614.  
  3615.       08h = Reserved.  Must be zero. 
  3616.       10h = 32-bit Target Offset Flag. When set, the target offset is 32-bits, 
  3617.       otherwise it is 16-bits. 
  3618.  
  3619.       20h = 32-bit Additive Fixup Flag. When set, the additive value is 
  3620.       32-bits, otherwise it is 16-bits. 
  3621.  
  3622.       40h = 16-bit Object Number/Module Ordinal Flag. When set, the object 
  3623.       number or module ordinal number is 16-bits, otherwise it is 8-bits. 
  3624.  
  3625.       80h = 8-bit Ordinal Flag. When set, the ordinal number is 8-bits, 
  3626.       otherwise it is 16-bits. 
  3627.  
  3628. SRCOFF = DW/CNT = DB  Source offset or source offset list count. This field 
  3629. contains either an offset or a count depending on the Source List Flag. If the 
  3630. Source List Flag is set, a list of source offsets follows the additive field 
  3631. and this field contains the count of the entries in the source offset list. 
  3632. Otherwise, this is the single source offset for the fixup. Source offsets are 
  3633. relative to the beginning of the page where the fixup is to be made.  Note that 
  3634. for fixups that cross page boundaries, a separate fixup record is specified for 
  3635. each page.  An offset is still used for the 2nd page but it now becomes a 
  3636. negative offset since the fixup originated on the preceding page.  (For 
  3637. example, if only the last one byte of a 32-bit address is on the page to be 
  3638. fixed up, then the offset would have a value of -3.) 
  3639.  
  3640. TARGET DATA = Target data for fixup. The format of the TARGET DATA is dependent 
  3641. upon target flags. 
  3642.  
  3643. SRCOFF1 - SRCOFFn = DW[]  Source offset list. This list is present if the 
  3644. Source List Flag is set in the Target Flags field.  The number of entries in 
  3645. the source offset list is defined in the SRCOFF/CNT field.  The source offsets 
  3646. are relative to the beginning of the page where the fixups are to be made. 
  3647.  
  3648.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3649.       00h Γöé SRC ΓöéFLAGSΓöéSRCOFF/CNT*Γöé
  3650.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3651.   03h/04h Γöé  OBJECT * Γöé        TRGOFF * @     Γöé
  3652.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3653.           Γöé SRCOFF1 @ Γöé   . . .   Γöé SRCOFFn @ Γöé
  3654.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3655.  
  3656.         * These fields are variable size.
  3657.         @ These fields are optional.
  3658.  
  3659. Internal Fixup Record 
  3660.  
  3661.    OBJECT = D[B|W]  Target object number. This field is an index into the 
  3662.    current module's Object Table to specify the target Object. It is a Byte 
  3663.    value when the '16-bit Object Number/Module Ordinal Flag' bit in the target 
  3664.    flags field is clear and a Word value when the bit is set. 
  3665.  
  3666.    TRGOFF = D[W|D]  Target offset. This field is an offset into the specified 
  3667.    target Object. It is not present when the Source Type specifies a 16-bit 
  3668.    Selector fixup. It is a Word value when the '32-bit Target Offset Flag' bit 
  3669.    in the target flags field is clear and a Dword value when the bit is set. 
  3670.  
  3671.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3672.       00h Γöé SRC ΓöéFLAGSΓöéSRCOFF/CNT*Γöé
  3673.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3674.   03h/04h Γöé MOD ORD# *Γöé PROCEDURE NAME OFFSET*Γöé     ADDITIVE * @      Γöé
  3675.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3676.           Γöé SRCOFF1 @ Γöé   . . .   Γöé SRCOFFn @ Γöé
  3677.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3678.  
  3679.         * These fields are variable size.
  3680.         @ These fields are optional.
  3681.  
  3682. Import by Name Fixup Record 
  3683.  
  3684.    MOD ORD # = D[B|W]  Ordinal index into the Import Module Name Table. This 
  3685.    value is an ordered index in to the Import Module Name Table for the module 
  3686.    containing the procedure entry point. It is a Byte value when the '16-bit 
  3687.    Object Number/Module Ordinal' Flag bit in the target flags field is clear 
  3688.    and a Word value when the bit is set. The loader creates a table of pointers 
  3689.    with each pointer in the table corresponds to the modules named in the 
  3690.    Import Module Name Table. This value is used by the loader to index into 
  3691.    this table created by the loader to locate the referenced module. 
  3692.  
  3693.    PROCEDURE NAME OFFSET = D[W|D]  Offset into the Import Procedure Name Table. 
  3694.    This field is an offset into the Import Procedure Name Table.  It is a Word 
  3695.    value when the '32-bit Target Offset Flag' bit in the target flags field is 
  3696.    clear and a Dword value when the bit is set. 
  3697.  
  3698.    ADDITIVE = D[W|D]  Additive fixup value. This field exists in the fixup 
  3699.    record only when the 'Additive Fixup Flag' bit in the target flags field is 
  3700.    set.  When the 'Additive Fixup Flag' is clear the fixup record does not 
  3701.    contain this field and is immediately followed by the next fixup record (or 
  3702.    by the source offset list for this fixup record).  This value is added to 
  3703.    the address derived from the target entry point. This field is a Word value 
  3704.    when the '32-bit Additive Flag' bit in the target flags field is clear and a 
  3705.    Dword value when the bit is set. 
  3706.  
  3707.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3708.       00h Γöé SRC ΓöéFLAGSΓöéSRCOFF/CNT*Γöé
  3709.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3710.   03h/04h Γöé MOD ORD# *ΓöéIMPORT ORD*Γöé     ADDITIVE * @      Γöé
  3711.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3712.           Γöé SRCOFF1 @ Γöé   . . .   Γöé SRCOFFn @ Γöé
  3713.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3714.  
  3715.         * These fields are variable size.
  3716.         @ These fields are optional.
  3717.  
  3718. Import by Ordinal Fixup Record 
  3719.  
  3720.    MOD ORD # = D[B|W]  Ordinal index into the Import Module Name Table. This 
  3721.    value is an ordered index in to the Import Module Name Table for the module 
  3722.    containing the procedure entry point. It is a Byte value when the '16-bit 
  3723.    Object Number/Module Ordinal' Flag bit in the target flags field is clear 
  3724.    and a Word value when the bit is set. The loader creates a table of pointers 
  3725.    with each pointer in the table corresponds to the modules named in the 
  3726.    Import Module Name Table. This value is used by the loader to index into 
  3727.    this table created by the loader to locate the referenced module. 
  3728.  
  3729.    IMPORT ORD = D[B|W|D]  Imported ordinal number. This is the imported 
  3730.    procedure's ordinal number. It is a Byte value when the '8-bit Ordinal' bit 
  3731.    in the target flags field is set. Otherwise it is a Word value when the 
  3732.    '32-bit Target Offset Flag' bit in the target flags field is clear and a 
  3733.    Dword value when the bit is set. 
  3734.  
  3735.    ADDITIVE = D[W|D]  Additive fixup value. This field exists in the fixup 
  3736.    record only when the 'Additive Fixup Flag' bit in the target flags field is 
  3737.    set.  When the 'Additive Fixup Flag' is clear the fixup record does not 
  3738.    contain this field and is immediately followed by the next fixup record (or 
  3739.    by the source offset list for this fixup record).  This value is added to 
  3740.    the address derived from the target entry point. This field is a Word value 
  3741.    when the '32-bit Additive Flag' bit in the target flags field is clear and a 
  3742.    Dword value when the bit is set. 
  3743.  
  3744.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3745.       00h Γöé SRC ΓöéFLAGSΓöéSRCOFF/CNT*Γöé
  3746.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3747.   03h/04h Γöé  ORD # *  Γöé     ADDITIVE * @      Γöé
  3748.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3749.           Γöé SRCOFF1 @ Γöé   . . .   Γöé SRCOFFn @ Γöé
  3750.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3751.  
  3752.         * These fields are variable size.
  3753.         @ These fields are optional.
  3754.  
  3755. Internal Entry Table Fixup Record 
  3756.  
  3757.    ENTRY # = D[B|W]  Ordinal index into the Entry Table. This field is an index 
  3758.    into the current module's Entry Table to specify the target Object and 
  3759.    offset. It is a Byte value when the '16-bit Object Number/Module Ordinal' 
  3760.    Flag bit in the target flags field is clear and a Word value when the bit is 
  3761.    set. 
  3762.  
  3763.    ADDITIVE = D[W|D]  Additive fixup value. This field exists in the fixup 
  3764.    record only when the 'Additive Fixup Flag' bit in the target flags field is 
  3765.    set.  When the 'Additive Fixup Flag' is clear the fixup record does not 
  3766.    contain this field and is immediately followed by the next fixup record (or 
  3767.    by the source offset list for this fixup record).  This value is added to 
  3768.    the address derived from the target entry point. This field is a Word value 
  3769.    when the '32-bit Additive Flag' bit in the target flags field is clear and a 
  3770.    Dword value when the bit is set. 
  3771.  
  3772.  
  3773. ΓòÉΓòÉΓòÉ 3.15. Import Module Name Table ΓòÉΓòÉΓòÉ
  3774.  
  3775. The import module name table defines the module name strings imported through 
  3776. dynamic link references.  These strings are referenced through the imported 
  3777. relocation fixups.  To determine the length of the import module name table 
  3778. subtract the import module name table offset from the import procedure name 
  3779. table offset. These values are located in the linear EXE header. The end of the 
  3780. import module name table is not terminated by a special character, it is 
  3781. followed directly by the import procedure name table.  The strings are CASE 
  3782. SENSITIVE and NOT NULL TERMINATED.  Each name table entry has the following 
  3783. format 
  3784.  
  3785.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ     ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3786.       00h Γöé LEN Γöé    ASCII STRING  . . .      Γöé
  3787.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ     ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3788.  
  3789. Import Module Name Table 
  3790.  
  3791. LEN = DB  String Length. This defines the length of the string in bytes. The 
  3792. length of each ascii name string is limited to 127 characters. 
  3793.  
  3794. ASCII STRING = DB  ASCII String. This is a variable length string with it's 
  3795. length defined in bytes by the LEN field.  The string is case sensitive and is 
  3796. not null terminated. 
  3797.  
  3798.  
  3799. ΓòÉΓòÉΓòÉ 3.16. Import Procedure Name Table ΓòÉΓòÉΓòÉ
  3800.  
  3801. The import procedure name table defines the procedure name strings imported by 
  3802. this module through dynamic link references.  These strings are referenced 
  3803. through the imported relocation fixups.  To determine the length of the import 
  3804. procedure name table add the fixup section size to the fixup page table offset, 
  3805. this computes the offset to the end of the fixup section, then subtract the 
  3806. import procedure name table offset.  These values are located in the linear EXE 
  3807. header. The import procedure name table is followed by the data pages section. 
  3808. Since the data pages section is aligned on a 'page size' boundary, padded space 
  3809. may exist between the last import name string and the first page in the data 
  3810. pages section.  If this padded space exists it will be zero filled.  The 
  3811. strings are CASE SENSITIVE and NOT NULL TERMINATED.  Each name table entry has 
  3812. the following format 
  3813.  
  3814.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ     ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3815.       00h Γöé LEN Γöé    ASCII STRING  . . .      Γöé
  3816.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ     ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3817.  
  3818. Import Procedure Name Table 
  3819.  
  3820. LEN = DB  String Length. This defines the length of the string in bytes. The 
  3821. length of each ascii name string is limited to 127 characters.  The high bit in 
  3822. the LEN field (bit 7) is defined as an Overload bit. This bit signifies that 
  3823. additional information is contained in the linear EXE module and will be used 
  3824. in the future for parameter type checking. 
  3825.  
  3826. ASCII STRING = DB  ASCII String. This is a variable length string with it's 
  3827. length defined in bytes by the LEN field.  The string is case sensitive and is 
  3828. not null terminated. 
  3829.  
  3830.  
  3831. ΓòÉΓòÉΓòÉ 3.17. Preload Pages ΓòÉΓòÉΓòÉ
  3832.  
  3833. The Preload Pages section is an optional section in the linear EXE module that 
  3834. coalesces a 'preload page set' into a contiguous section.  The preload page set 
  3835. can be defined as the set of first used pages in the module.  The preload page 
  3836. set can be specified by the application developer or can be derived by a tool 
  3837. that analyzes the programs memory usage while it is running.  By grouping the 
  3838. preload page set together, the preload pages can be read from the linear EXE 
  3839. module with one disk read.  The structure of the preload pages is no different 
  3840. than if they were demand loaded. Their sizes are determined by the Object Page 
  3841. Table entries that correspond.  If the specified size is less than the PAGE 
  3842. SIZE field given in the linear EXE module header the remainder of the page is 
  3843. filled with zeros when loaded.  All pages begin on a PAGE OFFSET SHIFT boundary 
  3844. from the base of the preload page section, as specified in the linear EXE 
  3845. header.  The pages are ordered by logical page number within this section. 
  3846. Note that OS/2 2.x does not respect the preload of pages as specified in the 
  3847. executable file for performance reasons. 
  3848.  
  3849.  
  3850. ΓòÉΓòÉΓòÉ 3.18. Demand Load Pages ΓòÉΓòÉΓòÉ
  3851.  
  3852. The Demand Loaded Pages section contains all the non-iterated pages for a 
  3853. linear EXE module that are not preloaded.  When required, the whole page is 
  3854. loaded into memory from the module.  The characteristics of each of these pages 
  3855. is specified in the Object Page Table.  Every page begins on a PAGE OFFSET 
  3856. SHIFT boundary aligned offset from the demand loaded pages base specified in 
  3857. the linear EXE header.  Their sizes are determined by the Object Page Table 
  3858. entries that correspond.  If the specified size is less than the PAGE SIZE 
  3859. field given in the linear EXE module header the remainder of the page is filled 
  3860. with zeros when loaded.  The pages are ordered by logical page number within 
  3861. this section. 
  3862.  
  3863.  
  3864. ΓòÉΓòÉΓòÉ 3.19. Iterated Data Pages ΓòÉΓòÉΓòÉ
  3865.  
  3866. The Iterated Data Pages section contains all the pages for a linear EXE module 
  3867. that are iterated.  When required, the set of iteration records are loaded into 
  3868. memory from the module and expanded to reconstitute the page.  Every set of 
  3869. iteration records begins on a PAGE OFFSET SHIFT offset from the OBJECT ITER 
  3870. PAGES OFF specified in the linear EXE header.  Their sizes are determined by 
  3871. the Object Page Table entries that correspond.  The pages are ordered by 
  3872. logical page number within this section.  This record structure is used to 
  3873. describe the iterated data for an object on a per-page basis. 
  3874.  
  3875.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3876.       00h Γöé#ITERATIONSΓöéDATA LENGTHΓöé
  3877.           Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3878.       04h ΓöéDATA BYTES Γöé   . . .   Γöé ... Γöé
  3879.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3880.  
  3881. Object Iterated Data Record (Iteration Record)
  3882.  
  3883. #ITERATIONS = DW  Number of iterations. This specifies the number of times that 
  3884. the data is replicated. 
  3885.  
  3886. DATA LENGTH = DW  The size of the data pattern in bytes. This specifies the 
  3887. number of bytes of data of which the pattern consists. The maximum size is one 
  3888. half of the PAGE SIZE (given in the module header). If a pattern exceeds this 
  3889. value then the data page will not be condensed into iterated data. 
  3890.  
  3891. DATA = DB * DATA LENGTH  The Data pattern to be replicated. The next iteration 
  3892. record will immediately follow the last byte of the pattern. The offset of the 
  3893. next iteration record is easily calculated from the offset of this record by 
  3894. adding the DATA LENGTH field and the sizes of the #ITERATIONS and DATA LENGTH 
  3895. fields. 
  3896.  
  3897.  
  3898. ΓòÉΓòÉΓòÉ 3.20. Debug Information ΓòÉΓòÉΓòÉ
  3899.  
  3900. The debug information  is defined by the debugger and  is not controlled by the 
  3901. linear EXE format or linker.  The only data defined by the linear EXE format 
  3902. relative to the debug  information is it's offset in the EXE file and length in 
  3903. bytes as defined in the linear EXE header.  To support multiple debuggers the 
  3904. first word of  the debug information is a type field which determines the 
  3905. format of the debug information. 
  3906.  
  3907.           00h   01h   02h   03h   04h
  3908.           ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ
  3909.           Γöé 'N' Γöé 'B' Γöé '0' Γöé  n  Γöé   DEBUGGER DATA  . . . .
  3910.           ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ
  3911.  
  3912. Debug Information 
  3913.  
  3914. TYPE = DB DUP 4 Format type. This defines the type of debugger data that exists 
  3915. in the remainder of the debug information.  The signature consists of a string 
  3916. of four (4) ASCII characters  "NB0" followed by the ASCII representation for 
  3917. 'n'.  The values for 'n' are defined as follows.  These format types are 
  3918. defined. 
  3919.  
  3920.       00h = 32-bit CodeView debugger format. 
  3921.       01h = AIX debugger format. 
  3922.       02h = 16-bit CodeView debugger format. 
  3923.       04h = 32-bit OS/2 PM debugger (IBM) format. 
  3924.  
  3925. DEBUGGER DATA = Debugger specific data. The format of the debugger data  is 
  3926. defined by the debugger that is being used.  The values defined for the  type 
  3927. field are not enforced by the  system.  It is the  responsibility of  the 
  3928. linker  or  debugging tools to  follow  the convention for the type field that 
  3929. is defined here. 
  3930.  
  3931.  
  3932. ΓòÉΓòÉΓòÉ <hidden>  ΓòÉΓòÉΓòÉ
  3933.  
  3934. OS/2 is a Registered Trademark of International Business Machines Corp. 
  3935.  
  3936.  
  3937. ΓòÉΓòÉΓòÉ <hidden>  ΓòÉΓòÉΓòÉ
  3938.  
  3939. Windows is a Registered Trademark of Microsoft Corp.