mirror of https://github.com/lianthony/NT4.0
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.
620 lines
15 KiB
620 lines
15 KiB
/***********************************************************************
|
|
* Microsoft (R) 32-Bit Incremental Linker
|
|
*
|
|
* Copyright (C) Microsoft Corp 1992-1996. All rights reserved.
|
|
*
|
|
* File: globals.h
|
|
*
|
|
* File Comments:
|
|
*
|
|
* This file declares all global data structures used by the linker
|
|
*
|
|
***********************************************************************/
|
|
|
|
typedef struct ARGUMENT_LIST {
|
|
char *OriginalName;
|
|
char *ModifiedName;
|
|
PARP parp; // parsed representation of argument (if switch)
|
|
DWORD TimeStamp;
|
|
WORD Flags;
|
|
struct ARGUMENT_LIST *Next;
|
|
} ARGUMENT_LIST, *PARGUMENT_LIST;
|
|
|
|
typedef struct NAME_LIST {
|
|
PARGUMENT_LIST First;
|
|
PARGUMENT_LIST Last;
|
|
DWORD Count;
|
|
} NAME_LIST, *PNAME_LIST;
|
|
|
|
typedef struct NUM_ARGUMENT_LIST {
|
|
char *szOriginalName;
|
|
char *szModifiedName;
|
|
DWORD dwNumber;
|
|
WORD Flags;
|
|
struct NUM_ARGUMENT_LIST *Next;
|
|
} NUM_ARGUMENT_LIST, *PNUM_ARGUMENT_LIST;
|
|
|
|
typedef struct NUMBER_LIST {
|
|
PNUM_ARGUMENT_LIST First;
|
|
PNUM_ARGUMENT_LIST Last;
|
|
WORD Count;
|
|
} NUMBER_LIST, *PNUMBER_LIST;
|
|
|
|
struct CVSEEKS {
|
|
DWORD Base;
|
|
DWORD SubsectionDir;
|
|
};
|
|
|
|
struct CVSUBSECTION {
|
|
DWORD PointerToSubsection;
|
|
DWORD SizeOfSubsection;
|
|
DWORD Precompiled;
|
|
};
|
|
|
|
typedef struct CVINFO {
|
|
PMOD pmod; // the module represented
|
|
char *ObjectFilename;
|
|
CVSUBSECTION Publics;
|
|
CVSUBSECTION Locals;
|
|
CVSUBSECTION Types;
|
|
CVSUBSECTION Linenumbers;
|
|
CVSUBSECTION Module;
|
|
} CVINFO, *PCVINFO;
|
|
|
|
// CVSEG: used temporarily in EmitCvInfo to build the sstModule table for
|
|
// each module. Each CVSEG will become an array element in the sstModule
|
|
// subsection.
|
|
|
|
struct CVSEG {
|
|
PGRP pgrp; // the group which the CON's are in
|
|
PCON pconFirst, pconLast; // first and last CON described
|
|
struct CVSEG *pcvsegNext;
|
|
};
|
|
|
|
enum DUMP_RAW_DISPLAY_TYPE {
|
|
Bytes,
|
|
Shorts,
|
|
Longs
|
|
};
|
|
|
|
enum DEBUG_INFO {
|
|
None,
|
|
Minimal,
|
|
Partial,
|
|
Full
|
|
};
|
|
|
|
enum DEBUG_TYPE {
|
|
NoDebug = 0,
|
|
CoffDebug = 1,
|
|
CvDebug = 2,
|
|
FpoDebug = 4,
|
|
FixupDebug = 8,
|
|
MiscDebug = 16
|
|
};
|
|
|
|
enum TOOL_TYPE {
|
|
NotUsed,
|
|
Linker,
|
|
Librarian,
|
|
Dumper,
|
|
Editor,
|
|
#if DBG
|
|
DbInspector,
|
|
#endif // DBG
|
|
Binder
|
|
};
|
|
|
|
enum FORCE_TYPE {
|
|
ftNone = 0,
|
|
ftUnresolved = 1,
|
|
ftMultiple = 2
|
|
};
|
|
|
|
struct LINKSWITCH {
|
|
BOOL Out;
|
|
BOOL Base;
|
|
BOOL Heap;
|
|
BOOL Stack;
|
|
#ifdef NT_BUILD
|
|
BOOL fCallTree;
|
|
#endif
|
|
BOOL fChecksum;
|
|
BOOL fDriver;
|
|
BOOL fFixed;
|
|
BOOL fMacBundle;
|
|
BOOL fMap;
|
|
BOOL fMapLines;
|
|
BOOL fMiscInRData;
|
|
BOOL fNewGlue; // UNDONE: Temporary. Always on for VC++ 5.0
|
|
BOOL fNewRelocs; // UNDONE: Temporary for testing PE VxDs
|
|
BOOL fNoDefaultLibs;
|
|
BOOL fNoEntry;
|
|
BOOL fNoPack;
|
|
BOOL fNoPagedCode;
|
|
BOOL fNotifyFullBuild;
|
|
BOOL fOptIdata;
|
|
BOOL fOrder;
|
|
BOOL fPadMipsCode;
|
|
BOOL fPE;
|
|
BOOL fProfile;
|
|
BOOL fROM;
|
|
BOOL fTCE;
|
|
DWORD GpSize;
|
|
DEBUG_INFO DebugInfo;
|
|
DEBUG_TYPE DebugType;
|
|
FORCE_TYPE Force;
|
|
char *szMacCreator;
|
|
char *szMacType;
|
|
};
|
|
|
|
struct LIBSWITCH {
|
|
char *DllName; // for .def only
|
|
char *DllExtension; // for .def only
|
|
BOOL List;
|
|
BOOL DefFile;
|
|
};
|
|
|
|
struct DUMPSWITCH {
|
|
WORD LinkerMember;
|
|
WORD RawDisplaySize;
|
|
WORD SymbolType;
|
|
DUMP_RAW_DISPLAY_TYPE RawDisplayType;
|
|
BOOL Headers;
|
|
BOOL Relocations;
|
|
BOOL Linenumbers;
|
|
BOOL Symbols;
|
|
BOOL BaseRelocations;
|
|
BOOL Imports;
|
|
BOOL Exports;
|
|
BOOL RawData;
|
|
BOOL Summary;
|
|
BOOL ArchiveMembers;
|
|
BOOL FpoData;
|
|
BOOL PData;
|
|
BOOL OmapTo;
|
|
BOOL OmapFrom;
|
|
BOOL Fixup;
|
|
BOOL SymbolMap;
|
|
BOOL Warnings;
|
|
BOOL Disasm;
|
|
BOOL Directives;
|
|
};
|
|
|
|
struct SWITCH {
|
|
LINKSWITCH Link;
|
|
LIBSWITCH Lib;
|
|
DUMPSWITCH Dump;
|
|
};
|
|
|
|
struct SWITCH_INFO {
|
|
DWORD UserOpts; // bit vector for user set options
|
|
DWORD cbComment; // byte count of comment
|
|
char *szEntry; // entry point
|
|
char *szMacInit; // PowerMac init routine
|
|
char *szMacTerm; // PowerMac term routine
|
|
PLEXT plextIncludes; // list of include symbols
|
|
NAME_LIST SectionNames; // list of -section cmdline attributes
|
|
};
|
|
|
|
typedef BYTE OPTION_ACTION;
|
|
|
|
struct SECTION_INFO {
|
|
char *Name;
|
|
DWORD Characteristics;
|
|
};
|
|
|
|
struct RESERVED_SECTION {
|
|
SECTION_INFO ReadOnlyData;
|
|
SECTION_INFO Common;
|
|
SECTION_INFO GpData; // MIPS/Alpha
|
|
SECTION_INFO Xdata; // MIPS/Alpha
|
|
SECTION_INFO Debug;
|
|
SECTION_INFO Export;
|
|
SECTION_INFO ImportDescriptor;
|
|
SECTION_INFO Resource;
|
|
SECTION_INFO Exception;
|
|
SECTION_INFO BaseReloc;
|
|
SECTION_INFO Directive;
|
|
SECTION_INFO CvSymbols;
|
|
SECTION_INFO CvTypes;
|
|
SECTION_INFO CvPTypes;
|
|
SECTION_INFO FpoData;
|
|
SECTION_INFO Text; // PowerMac
|
|
SECTION_INFO Data; // PowerMac
|
|
SECTION_INFO PowerMacLoader; // PowerMac
|
|
};
|
|
|
|
|
|
enum THKSYM
|
|
{
|
|
thksymExport, // Export symbol (Function/Data)
|
|
thksymIAT, // __imp_Function/__imp_Data
|
|
thksymName, // Name in .idata$6 section
|
|
thksymToc, // .toc
|
|
thksymMax,
|
|
};
|
|
|
|
struct THUNK_RELOC
|
|
{
|
|
BYTE VirtualAddress;
|
|
BYTE thksym;
|
|
WORD Type;
|
|
};
|
|
|
|
struct THUNK_INFO
|
|
{
|
|
const BYTE *EntryCode;
|
|
const THUNK_RELOC *EntryCodeRelocs;
|
|
DWORD EntryCodeSize;
|
|
WORD EntryCodeRelocsCount;
|
|
WORD ExportReloc;
|
|
WORD ImportReloc;
|
|
WORD ThunkReloc;
|
|
WORD DebugSectionRelReloc;
|
|
WORD DebugSectionNumReloc;
|
|
};
|
|
|
|
struct BASE_RELOC {
|
|
WORD Type;
|
|
SHORT isecTarget;
|
|
DWORD rva;
|
|
DWORD Value;
|
|
};
|
|
|
|
// VxD-specific data structures:
|
|
|
|
struct VXDRELOC {
|
|
struct VXDRELOC *pvxdrelocNext;
|
|
BYTE bType;
|
|
BYTE isecTarget; // Destination address in section:offset format:
|
|
DWORD ibTarget;
|
|
WORD cibAlloc; // Number of DWORDs for ib allocated
|
|
BYTE cibSrc; // Number of entries in chain
|
|
WORD *pibSrc; // Pointer to array of source offsets
|
|
};
|
|
|
|
#define VXD_BLOCKSIZE 16 // pibSrc[] array in VXD_BASE_RELOC grows in
|
|
// increments of this size.
|
|
|
|
struct VXDPAGE {
|
|
struct VXDRELOC *pvxdreloc;
|
|
DWORD fo;
|
|
};
|
|
|
|
|
|
struct INTERNAL_ERROR {
|
|
char *Phase;
|
|
char CombinedFilenames[_MAX_PATH*2];
|
|
};
|
|
|
|
typedef INT MainFunc;
|
|
|
|
// List of RVA's.
|
|
|
|
#define crvaInLrva 32
|
|
struct LRVA {
|
|
DWORD rgrva[crvaInLrva];
|
|
struct LRVA *plrvaNext;
|
|
};
|
|
|
|
typedef struct OMAP
|
|
{
|
|
DWORD rva;
|
|
DWORD rvaTo;
|
|
} OMAP, *POMAP;
|
|
|
|
typedef struct XFIXUP {
|
|
WORD wType;
|
|
WORD wExtra;
|
|
DWORD rva;
|
|
DWORD rvaTarget;
|
|
} XFIXUP, *PXFIXUP;
|
|
|
|
#define cxfixupPage 341
|
|
|
|
struct FIXPAG {
|
|
struct FIXPAG *pfixpagNext;
|
|
XFIXUP rgxfixup[cxfixupPage];
|
|
};
|
|
|
|
// ilink failure values: add as required
|
|
enum ERRINC {
|
|
errNone,
|
|
errNoChanges,
|
|
errFileAdded,
|
|
errFileDeleted,
|
|
errLibChanged,
|
|
errTooManyChanges,
|
|
errExports,
|
|
errDataMoved,
|
|
errCommonSym,
|
|
errAbsolute,
|
|
errJmpTblOverflow,
|
|
errWeakExtern,
|
|
errUndefinedSyms,
|
|
errCalcPtrs,
|
|
errOutOfMemory,
|
|
errOutOfDiskSpace,
|
|
errTypes,
|
|
errFpo,
|
|
errBaseReloc,
|
|
errDirectives,
|
|
errNotSupportedForTarget,
|
|
errPdata,
|
|
errTocTblOverflow, // PowerMac specific
|
|
errDescOverflow, // PowerMac specific
|
|
errLibRefSetChanged,
|
|
errMultDefFound,
|
|
errComdat,
|
|
errDbiFormat
|
|
};
|
|
|
|
typedef struct SYMBOL_INFO { // used for ilink to avoid searching
|
|
BOOL fJmpTbl; // for externs while doing fixups
|
|
DWORD Offset;
|
|
} SYMBOL_INFO, *PSYMBOL_INFO;
|
|
|
|
typedef struct EXPINFO {
|
|
const char *szExpFile; // name of DEF file OR export object if any
|
|
DWORD tsExp; // timestamp of DEF file or export object
|
|
const char *szImpLib; // name of import library if any
|
|
DWORD tsImpLib; // timestamp of import library
|
|
PMOD pmodGen; // mod of export file generated, NULL if .exp was used.
|
|
NAME_LIST nlExports; // list of exports (NULL if export obj used)
|
|
} EXPINFO, *PEXPINFO;
|
|
|
|
// RESN -- a linked list of records describing "non-code" stuff which is to be written to
|
|
// the .exe file.
|
|
|
|
enum RESNT
|
|
{
|
|
resntBinaryResource, // data is a Mac binary resource file
|
|
resntDataFork, // data is arbitrary contents of the app's data fork (68K only, not PPC)
|
|
resntAfpInfo // data is finder info (type, creator, and bundle bit)
|
|
};
|
|
|
|
struct RESN {
|
|
struct RESN *presnNext;
|
|
RESNT resnt;
|
|
char *szFilename;
|
|
BYTE *pbData; // valid iff szFilename==NULL
|
|
DWORD cb;
|
|
PCON pcon;
|
|
DWORD TimeStamp;
|
|
};
|
|
|
|
struct MFLR // Mapfile Linenum Record
|
|
{
|
|
DWORD line;
|
|
struct SEC *psec;
|
|
DWORD offset;
|
|
};
|
|
|
|
struct MFL // Mapfile linenums
|
|
{
|
|
char *szFilename;
|
|
BLK blkRgmflr;
|
|
struct MFL *pmflNext;
|
|
};
|
|
|
|
struct WEAK_EXTERN_LIST {
|
|
PEXTERNAL pext;
|
|
PEXTERNAL pextWeakDefault;
|
|
struct WEAK_EXTERN_LIST *pwelNext;
|
|
};
|
|
|
|
extern WEAK_EXTERN_LIST *pwelHead;
|
|
|
|
extern const IMAGE_FILE_HEADER DefImageFileHdr;
|
|
extern const IMAGE_OPTIONAL_HEADER DefImageOptionalHdr;
|
|
extern const SWITCH DefSwitch;
|
|
extern const SWITCH_INFO DefSwitchInfo;
|
|
|
|
extern const IMAGE_SECTION_HEADER NullSectionHdr;
|
|
extern const IMAGE_SYMBOL NullSymbol;
|
|
extern const RESERVED_SECTION ReservedSection;
|
|
extern const char *Delimiters;
|
|
|
|
extern BOOL fCtrlCSignal;
|
|
|
|
extern INT FileReadHandle, FileWriteHandle;
|
|
extern DWORD MemberSeekBase;
|
|
extern DWORD MemberSize;
|
|
extern DWORD CoffHeaderSeek;
|
|
extern char *StringTable;
|
|
|
|
extern BOOL Verbose;
|
|
extern BOOL fVerboseLib;
|
|
extern FILE *InfoStream;
|
|
extern char *OutFilename;
|
|
extern char *szInfoFilename;
|
|
extern char *DefFilename;
|
|
extern char *szModuleName;
|
|
|
|
extern DWORD dwMaxCurrentVer; // Current Version of the shared library in PowerMac
|
|
extern DWORD dwMinOldAPIVer; // Old API Version of the shared library in PowerMac
|
|
extern DWORD dwMinOldCodeVer; // Old Code Version of the shared library in PowerMac
|
|
|
|
// ilink specific
|
|
extern INT FileIncrDbHandle;
|
|
extern BOOL fIncrDbFile;
|
|
extern BOOL fINCR;
|
|
extern DWORD cextFCNs;
|
|
extern PCON pconJmpTbl;
|
|
extern ERRINC errInc;
|
|
extern char *szIncrDbFilename;
|
|
extern char *PdbFilename;
|
|
extern NAME_LIST ModFileList;
|
|
extern PLMOD PCTMods;
|
|
extern PCON pconTocTable; // PowerMac Specific
|
|
extern PCON pconMppcFuncTable; // PowerMac Specific
|
|
extern PCON pconTocDescriptors; // PowerMac Specific
|
|
extern PCON pconGlueCode; // PowerMac Specific
|
|
extern PCON pconPowerMacLoader; // PowerMac Specific
|
|
extern BOOL fMfilePad; // PowerMac Specific Mfile padding
|
|
|
|
extern OPTION_ACTION OAComment, OAStub;
|
|
#ifdef INSTRUMENT
|
|
extern LOG Log;
|
|
#endif // INSTRUMENT
|
|
extern BOOL fPdb;
|
|
|
|
extern BOOL fOpenedOutFilename;
|
|
|
|
extern CVSEEKS CvSeeks;
|
|
extern PCVINFO CvInfo;
|
|
extern DWORD NextCvObject;
|
|
|
|
extern NAME_LIST SwitchArguments;
|
|
extern NAME_LIST ExportSwitches;
|
|
extern NAME_LIST MergeSwitches;
|
|
extern NAME_LIST FilenameArguments;
|
|
extern NAME_LIST ObjectFilenameArguments;
|
|
extern NAME_LIST ArchiveFilenameArguments;
|
|
extern NAME_LIST SectionNames;
|
|
extern NAME_LIST NoDefaultLibs;
|
|
extern NAME_LIST WeakImportsFunctionList; // Weak imports list for Functions
|
|
extern NAME_LIST WeakImportsContainerList; // Weak imports list for Containers
|
|
extern NAME_LIST ZappedBaseRelocList; // Deleted Base Reloc list for MPPC iLink
|
|
extern NAME_LIST MacResourceList; // PowerMac specific resource List
|
|
extern NAME_LIST MppcImportList; // PowerMac specific import List
|
|
|
|
extern DWORD *MemberStart;
|
|
extern PARGUMENT_LIST LastUserLib;
|
|
extern PARGUMENT_LIST FirstDefaultLib;
|
|
extern PARGUMENT_LIST pargFirst;
|
|
extern const char *ToolName;
|
|
extern const char *ToolGenericName;
|
|
extern char *Entry;
|
|
extern DWORD csymDebug;
|
|
extern char ShortName[];
|
|
extern DWORD UndefinedSymbols;
|
|
extern DWORD foCoffSyms;
|
|
extern DWORD VerifyImageSize;
|
|
extern DWORD cextWeakOrLazy;
|
|
extern BOOL BadFuzzyMatch;
|
|
extern BOOL fMultipleDefinitions;
|
|
|
|
extern PSEC psecBaseReloc;
|
|
extern PSEC psecCommon;
|
|
extern PSEC psecData;
|
|
extern PSEC psecDebug;
|
|
extern PSEC psecException;
|
|
extern PSEC psecExport;
|
|
extern PSEC psecGp;
|
|
extern PSEC psecXdata;
|
|
extern PSEC psecIdata2;
|
|
extern PSEC psecIdata5;
|
|
extern PSEC psecImportDescriptor;
|
|
extern PSEC psecPowerMacLoader;
|
|
extern PSEC psecReadOnlyData;
|
|
extern PSEC psecResource;
|
|
|
|
extern PGRP pgrpCvPTypes;
|
|
extern PGRP pgrpCvSymbols;
|
|
extern PGRP pgrpCvTypes;
|
|
extern PGRP pgrpExport;
|
|
extern PGRP pgrpFpoData;
|
|
extern PGRP pgrpPdata;
|
|
|
|
extern PMOD pmodLinkerDefined;
|
|
extern PEXTERNAL pextEntry;
|
|
extern TOOL_TYPE Tool;
|
|
extern BOOL IncludeDebugSection;
|
|
extern BOOL fImageMappedAsFile;
|
|
extern BASE_RELOC *rgbr;
|
|
extern BASE_RELOC *pbrCur;
|
|
extern BASE_RELOC *pbrEnd;
|
|
extern INTERNAL_ERROR InternalError;
|
|
|
|
extern BOOL fAlphaCheckLongBsr;
|
|
|
|
extern DWORD csymDebugEst;
|
|
extern DWORD totalStringTableSize;
|
|
extern INT fdExeFile;
|
|
extern PFI *rgpfi;
|
|
|
|
extern PEXTERNAL pextGp;
|
|
extern unsigned cFixupError;
|
|
|
|
extern char SzFixupMapInfo[81];
|
|
extern DWORD RvaFixupMapLast;
|
|
|
|
extern BOOL fReproducible;
|
|
|
|
extern size_t cbFree, cbTotal, cbTemp;
|
|
extern BYTE *pch;
|
|
|
|
extern BOOL PrependUnderscore;
|
|
extern BOOL SkipUnderscore;
|
|
extern WORD NextMember;
|
|
extern DWORD SmallestOrdinal;
|
|
extern DWORD LargestOrdinal;
|
|
extern DWORD TotalSizeOfForwarderStrings;
|
|
extern DWORD TotalSizeOfInternalNames;
|
|
extern char szDefaultCvpackName[];
|
|
|
|
extern LRVA *plrvaFixupsForMapFile;
|
|
extern DWORD crvaFixupsForMapFile;
|
|
|
|
extern DWORD crelocTotal;
|
|
extern FIXPAG *pfixpagHead;
|
|
extern FIXPAG *pfixpagCur;
|
|
extern DWORD cfixpag;
|
|
extern DWORD cxfixupCur;
|
|
|
|
extern BOOL fNeedSubsystem;
|
|
extern BOOL fDidMachineDependentInit;
|
|
extern BOOL fMPPCVersionConflict;
|
|
|
|
extern BOOL fNeedBanner;
|
|
extern BOOL fExplicitOptRef;
|
|
extern BLK blkResponseFileEcho;
|
|
extern BLK blkComment;
|
|
|
|
extern PLIB plibCmdLineObjs;
|
|
extern PCON pconCvSignature;
|
|
extern PCON pconDebugDir;
|
|
extern PCON pconCoffDebug;
|
|
extern PCON pconFixupDebug;
|
|
extern PCON pconMiscDebug;
|
|
extern WORD WarningLevel;
|
|
|
|
extern char szCvtomfSourceName[]; // import from cvtomf (if linked)
|
|
extern char *ImplibFilename;
|
|
extern char *szReproDir;
|
|
extern FILE *pfileReproResponse;
|
|
|
|
extern const BYTE DosHeaderArray[];
|
|
extern const LONG DosHeaderSize;
|
|
|
|
extern BOOL fExceptionsOff;
|
|
|
|
extern BOOL fAlphaCheckLongBsr;
|
|
extern unsigned cError;
|
|
extern RESN *presnFirst;
|
|
|
|
extern BOOL fPowerPC;
|
|
extern BYTE *mpisymbToc;
|
|
extern DWORD *mpisymdwRestoreToc;
|
|
extern PEXTERNAL pextToc;
|
|
extern PEXTERNAL pextFTInfo;
|
|
|
|
extern char szVersion[];
|
|
|
|
extern size_t cbExternal;
|
|
|
|
extern DWORD rvaGp;
|
|
extern DWORD rvaGpMax;
|
|
|
|
extern BOOL fErr;
|
|
extern BOOL fExportDirective;
|
|
extern BOOL fDbgImpLib;
|
|
extern BOOL fNoBaseRelocs;
|
|
extern BOOL fTest;
|
|
|
|
#ifdef ILINKLOG
|
|
extern BOOL fIlinkLog;
|
|
extern WORD wMachine; // UNDONE: take it out after ImgFileHdr can be used
|
|
#endif // ILINKLOG
|