Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
8.3 KiB

4 years ago
  1. /***********************************************************************
  2. * Microsoft (R) 32-Bit Incremental Linker
  3. *
  4. * Copyright (C) Microsoft Corp 1992-1996. All rights reserved.
  5. *
  6. * File: symbol.h
  7. *
  8. * File Comments:
  9. *
  10. * This include file defines external symbol table data structures.
  11. *
  12. ***********************************************************************/
  13. #ifndef __SYMBOL_H__
  14. #define __SYMBOL_H__
  15. #include "memory.h"
  16. // flags for external table
  17. // don't modify EXTERN_DEFINED directly ... use SetDefinedExt() instead
  18. // (so we can correctly maintain the linked list of all undefined externs).
  19. #define EXTERN_DEFINED 0x00000001
  20. #define EXTERN_COMMON 0x00000002
  21. #define EXTERN_EMITTED 0x00000004
  22. #define EXTERN_COFF_EMITTED 0x08000000 // COFF external emitted
  23. #define EXTERN_EXP_CONST 0x00000008 // export with CONSTANT keyword (obs.)
  24. #define EXTERN_EXP_BYNAME 0x00000008 // EXTERN_EXP_CONST not used for Mac, so:
  25. #define EXTERN_EXP_DATA 0x00002000 // export with DATA keyword (use this)
  26. #define EXTERN_FUZZYMATCH 0x00000010
  27. #define EXTERN_COMDAT 0x00000020
  28. #define EXTERN_WEAK 0x00000040
  29. #define EXTERN_LAZY 0x00000080
  30. #define EXTERN_IGNORE 0x00000100
  31. #define EXTERN_FORWARDER 0x00000200
  32. #define EXTERN_EXPORT 0x00000400
  33. #define EXTERN_IMPLIB_ONLY 0x00000800 // specialized attribute for deflib --
  34. // indicates that the symbol should only
  35. // go in the import library, not the
  36. // export table etc.
  37. #define EXTERN_MULT_REFS 0x00001000 // more than one ref to undefined ext
  38. // 0x00002000 taken (see above)
  39. #define EXTERN_ALIAS 0x00004000 // alias to other extern
  40. #define EXTERN_EXP_NONAME 0x00008000 // Don't write name to export name table
  41. #define EXTERN_DIRTY 0x00010000 // used by ilink to indicate addr changed
  42. #define EXTERN_NEWFUNC 0x00020000 // used by ilink to indicate a new func
  43. #define EXTERN_NEWDATA 0x00040000 // used by ilink to indicate a new data
  44. #define EXTERN_FUNC_FIXUP 0x00080000 // used by ilink to indicate a non-lego fixup
  45. #define EXTERN_PRIVATE 0x00100000 // PRIVATE exports
  46. #define EXTERN_RELINK 0x00200000 // used by ilink to indicate relink if sym becomes undef
  47. #define EXTERN_NO_REFS 0x00400000 // used by ilink to notify refs need not be recorded
  48. // Flags for External Table (Mac specific)
  49. #define EXTERN_DUPCON 0x00800000
  50. #define EXTERN_CSECTABLEB 0x01000000
  51. #define EXTERN_CSECTABLEW 0x02000000
  52. #define EXTERN_CSECTABLEL 0x04000000
  53. // 0x08000000 taken (see above)
  54. #define EXTERN_REFD 0x20000000
  55. #define EXTERN_ADDTHUNK 0x40000000
  56. #define EXTERN_REF16 0x80000000
  57. #define CSECTABLE_CBEL_MASK 0x0F000000
  58. // symbol name types
  59. #define LONGNAME 0
  60. #define SHORTNAME 1
  61. // symbol access macros
  62. #define n_name N.ShortName
  63. #define n_zeroes N.Name.Short
  64. #define n_nptr N.LongName[1]
  65. #define n_offset N.Name.Long
  66. #define IsLongName(sym) ((sym).n_zeroes == 0)
  67. #define SzNameSymPb(sym, pb) ((sym).n_zeroes ? \
  68. strncpy(ShortName, (char *) (sym).n_name, IMAGE_SIZEOF_SHORT_NAME) : \
  69. (char *)((pb)+(sym).n_offset))
  70. #define SzNameSym(sym, blk) SzNameSymPb(sym, (blk).pb)
  71. #define SzNameSymPst(sym, pst) SzNameSym(sym, (pst)->blkStringTable)
  72. #define SzNamePext(pext, pst) SzNameSymPst((pext)->ImageSymbol, pst)
  73. #define CPMODS 4 // count of references (MODS) in each chunk of references
  74. typedef struct MODS {
  75. struct MODS *pmodsNext;
  76. } MODS, *PMODS;
  77. #define RgpmodPMODS(pmodsNext) ((MOD **)((pmodsNext)+1))
  78. typedef struct EXTERNAL // External symbol
  79. {
  80. IMAGE_SYMBOL ImageSymbol;
  81. WORD ArchiveMemberIndex;
  82. // some clients require that pcon not be invalidated immediately
  83. // if an extern becomes undefined ...
  84. // hence not unioned with the "Undefined" linked list.
  85. PCON pcon; // EXTERN_DEFINED
  86. DWORD FinalValue; // cannot union with undefined list vars since value
  87. // is lost on an ilink when symbol added to undefined list
  88. union {
  89. struct { // EXTERN_DEFINED
  90. struct EXTERNAL *pextNextDefined;
  91. };
  92. struct { // !EXTERN_DEFINED
  93. struct EXTERNAL **ppextPrevUndefined;
  94. struct EXTERNAL *pextNextUndefined;
  95. };
  96. };
  97. union {
  98. // On an ilink these fields will be persistent. Even if EXTERN_DEFINED
  99. // these fields will still have the references
  100. PMOD pmodOnly; // !EXTERN_DEFINED, !EXTERN_MULT_REFS
  101. PMODS pmodsFirst; // !EXTERN_DEFINED, EXTERN_MULT_REFS
  102. };
  103. DWORD Offset; // offset into jump table
  104. char *szOtherName;
  105. DWORD Flags;
  106. // NOTE: The following fields must not be moved. X86, MIPS ilink rely
  107. // on these fields being where they are.
  108. union
  109. {
  110. struct
  111. {
  112. // The following 3 fields are MAC specific
  113. PSEC psecRef; // Used to build thunk table
  114. DWORD offThunk; // Used for quick lookup of A5 offset of thunk
  115. struct _MACDLL_FSID *pmacdll_fsid; // Used to build DLL stubs
  116. };
  117. struct
  118. {
  119. // The following 2 fields are used for NT PowerPC and PowerMac
  120. SHORT ibToc;
  121. WORD ppcFlags;
  122. union
  123. {
  124. // The following fields is used for PowerMac
  125. DWORD glueValue;
  126. // The following field is used for NT PowerPC
  127. DWORD dwRestoreToc;
  128. };
  129. };
  130. };
  131. } EXTERNAL, *PEXTERNAL, **PPEXTERNAL;
  132. __inline BOOL FExportProcPext(PEXTERNAL pext) {
  133. return !(pext->Flags & (EXTERN_EXP_CONST | EXTERN_EXP_DATA));
  134. }
  135. enum EMODE // export mode as spec'd in .def file or -export option
  136. {
  137. emodeProcedure,
  138. emodeConstant,
  139. emodeData
  140. };
  141. struct LEXT // list of externals
  142. {
  143. PEXTERNAL pext;
  144. struct LEXT *plextNext;
  145. };
  146. typedef LEXT *PLEXT;
  147. typedef struct LONG_STRING_LIST // Long name string list
  148. {
  149. DWORD Offset;
  150. struct LONG_STRING_LIST *Left;
  151. struct LONG_STRING_LIST *Right;
  152. } LONG_STRING_LIST, *PLONG_STRING_LIST;
  153. typedef struct ST // symbol table
  154. {
  155. PHT pht; // underlying dynamic hash table
  156. BLK blkStringTable; // long name string table
  157. PLONG_STRING_LIST plslFirstLongName;// pointer to binary tree of long names.
  158. // UNDONE: Can these be union'd
  159. PPEXTERNAL rgpexternalByName; // ptr to symbol table sorted by name
  160. PPEXTERNAL rgpexternalByAddr; // ptr to symbol table sorted by addr
  161. PPEXTERNAL rgpexternalByMacAddr; // ptr to symbol table sorted by mac addr
  162. PPEXTERNAL rgpexternalByModName; // ptr to symbol table sorted by archive member, name
  163. PEXTERNAL pextFirstUndefined; // linked list of undefined symbols
  164. PPEXTERNAL ppextLastUndefined; // end of list
  165. } ST, *PST, **PPST;
  166. struct ENM_UNDEF_EXT
  167. {
  168. // private
  169. ENM_BASE enm_base;
  170. PEXTERNAL pextNext;
  171. // public
  172. PEXTERNAL pext;
  173. };
  174. struct ENM_MOD_EXT
  175. {
  176. // private
  177. ENM_BASE enm_base;
  178. PEXTERNAL pext;
  179. PMODS pmods;
  180. DWORD ipmod;
  181. // public
  182. PMOD pmod;
  183. };
  184. // symbol table api
  185. VOID InitExternalSymbolTable(PPST, DWORD, DWORD);
  186. VOID IncrInitExternalSymbolTable(PPST);
  187. VOID FreeExternalSymbolTable(PPST);
  188. VOID InitEnumerateExternals(PST);
  189. VOID TerminateEnumerateExternals(PST);
  190. DWORD Cexternal(PST);
  191. VOID FuzzyLookup(PST, PST, PLIB, BOOL);
  192. PEXTERNAL LookupExternName(PST, SHORT, const char *, PBOOL);
  193. PEXTERNAL LookupExternSz(PST, const char *, PBOOL);
  194. PEXTERNAL SearchExternSz(PST, const char *);
  195. VOID SetDefinedExt(PEXTERNAL, BOOL, PST);
  196. PEXTERNAL PexternalEnumerateNext(PST);
  197. PPEXTERNAL RgpexternalByAddr(PST);
  198. PPEXTERNAL RgpexternalByMacAddr(PST);
  199. PPEXTERNAL RgpexternalByModName(PST);
  200. PPEXTERNAL RgpexternalByName(PST);
  201. VOID AddReferenceExt(PEXTERNAL, PMOD);
  202. BOOL FPextRef(PEXTERNAL);
  203. VOID AllowInserts(PST);
  204. VOID DumpPst(PST);
  205. VOID InitEnmUndefExt(ENM_UNDEF_EXT *, PST);
  206. BOOL FNextEnmUndefExt(ENM_UNDEF_EXT *);
  207. VOID EndEnmUndefExt(ENM_UNDEF_EXT *);
  208. VOID InitEnmModExt(ENM_MOD_EXT *, PEXTERNAL);
  209. BOOL FNextEnmModExt(ENM_MOD_EXT *);
  210. VOID EndEnmModExt(ENM_MOD_EXT *);
  211. #endif // __SYMBOL_H__