windows-nt/Source/XPSP1/NT/sdktools/link16/newsta.c
2020-09-26 16:20:57 +08:00

543 lines
17 KiB
C

/* SCCSID = %W% %E% */
/*
* Copyright Microsoft Corporation, 1983-1987
*
* This Module contains Proprietary Information of Microsoft
* Corporation and should be treated as Confidential.
*/
/****************************************************************
* *
* NEWSTA.C *
* *
* Statically allocated global variable definitions. *
* *
****************************************************************/
#include <minlit.h>
#include <bndtrn.h>
#include <bndrel.h>
#include <newexe.h>
#if EXE386
#include <exe386.h>
#endif
#if SETVBUF
#include <lnkio.h>
#endif
#if OXOUT OR OIAPX286
#include <xenfmt.h>
#endif
#include <extern.h>
/* Variables shared regardless of executable format */
char FAR *lpszLink;
char FAR *lpszPath;
char FAR *lpszTMP;
char FAR *lpszLIB;
char FAR *lpszQH;
char FAR *lpszHELPFILES;
char FAR *lpszCmdLine;
#if OSEGEXE
RBTYPE procOrder;
#endif
int vmfd;
BSTYPE bsErr /* DLH stderr isn't constant with CRT DLL */ /* = stderr */;
BSTYPE bsInput;
BSTYPE bsLst;
BSTYPE bsRunfile;
WORD cbBakpat;
WORD cbRec;
WORD cErrors;
int (cdecl *cmpf)(const RBTYPE *sb1, const RBTYPE *sb2);
#if OMF386
FTYPE f386;
#endif
#if (OSEGEXE AND defined(LEGO)) OR EXE386
FTYPE fKeepFixups;
#endif
#if EXE386
GRTYPE ggrFlat;
FTYPE fFullMap;
FTYPE fKeepVSize;
#endif
WORD extMac;
WORD extMax;
int ExitCode=0;
FTYPE fFullMap;
FTYPE fCommon;
#if C8_IDE
FTYPE fC8IDE = FALSE;
#endif
FTYPE fDelexe = (FTYPE) FALSE;
FTYPE fDrivePass;
FTYPE fFarCallTrans;
FTYPE fIgnoreCase = (FTYPE) IGNORECASE;
FTYPE fInOverlay;
FTYPE fLibPass;
FTYPE fLibraryFile;
FTYPE fListAddrOnly;
FTYPE fLstFileOpen;
FTYPE fScrClosed = (FTYPE) TRUE;
FTYPE fUndefinedExterns;
FTYPE fExeStrSeen = FALSE;
FTYPE fPackFunctions = (FTYPE) TRUE;
#if TCE
FTYPE fTCE = FALSE;
#endif
FTYPE fTextMoved = (FTYPE) FALSE;
int NullDelta = 16;
#if O68K
FTYPE f68k = (FTYPE) FALSE;
FTYPE fTBigEndian = (FTYPE) FALSE;
BYTE iMacType = MAC_NONE;
#endif /* O68K */
GRTYPE ggrDGroup;
GRTYPE ggrMac = 1;
GRTYPE grMac;
SNTYPE gsnMac = 1;
SNTYPE gsnMax = DFGSNMAX;
SNTYPE gsnStack;
WORD ifhLibCur;
WORD ifhLibMac;
long lfaLast;
WORD lnameMac;
WORD lnameMax = 256;
WORD modkey;
SNTYPE *mpextgsn;
RATYPE *mpextra;
RBTYPE FAR *mpextprop;
SNTYPE mpggrgsn[GGRMAX];
GRTYPE *mpgrggr;
#if FAR_SEG_TABLES
RATYPE FAR *mpgsndra;
FTYPE FAR *mpgsnfCod;
RBTYPE FAR *mpgsnrprop;
SEGTYPE FAR *mpgsnseg;
RATYPE FAR *mpsegraFirst;
SATYPE FAR *mpsegsa;
BYTE FAR * FAR *mpsegMem;
BYTE FAR * FAR *mpsaMem;
#else
RATYPE *mpgsndra;
FTYPE *mpgsnfCod;
RBTYPE *mpgsnrprop;
SEGTYPE *mpgsnseg;
RATYPE *mpsegraFirst;
SATYPE *mpsegsa;
#endif
SNTYPE *mpsngsn;
RBTYPE mpifhrhte[IFHLIBMAX];
long *mpitypelen;
WORD *mpityptyp;
RBTYPE FAR *mplnamerhte;
BYTE *psbRun;
WORD pubMac;
#if TCE
APROPCOMDAT *pActiveComdat;
#endif
int QCExtDefDelta = 0;
int QCLinNumDelta = 0;
WORD symMac; /* Number of symbols defined */
long raStart;
#if NOT NEWSYM OR AUTOVM
#if AUTOVM
WORD rbMacSyms;
#else
RBTYPE rbMacSyms;
#endif
#endif
RECTTYPE rect;
#if RGMI_IN_PLACE
BYTE bufg[DATAMAX + 4];
BYTE *rgmi;
#else
BYTE rgmi[DATAMAX + 4];
#endif
RBTYPE rhteBegdata;
RBTYPE rhteBss;
RBTYPE rhteFirstObject;
RBTYPE rhteRunfile;
RBTYPE rhteStack;
RBTYPE rprop1stFile;
RBTYPE rprop1stOpenFile;
RBTYPE r1stFile;
SBTYPE sbModule;
SEGTYPE segCodeLast;
SEGTYPE segDataLast;
SEGTYPE segLast;
SEGTYPE segStart;
WORD snkey;
SNTYPE snMac;
WORD typMac;
WORD vcbData;
WORD vcln;
FTYPE vfCreated;
FTYPE vfLineNos;
FTYPE vfMap;
FTYPE vfNewOMF;
FTYPE vfNoDefaultLibrarySearch;
FTYPE vfPass1; /* Pass 1 flag */
SNTYPE vgsnCur;
#if EXE386
DWORD vpageCur; /* Current object page number */
#endif
RATYPE vraCur;
SNTYPE vgsnLineNosPrev;
RECTTYPE vrectData;
RBTYPE vrhte;
RBTYPE vrhteCODEClass;
RBTYPE vrhteFile;
RBTYPE vrprop;
RBTYPE vrpropFile;
RBTYPE vrpropTailFile;
SEGTYPE vsegCur;
WORD ExeStrLen = 0;
WORD ExeStrMax = 0;
char FAR *ExeStrBuf = 0;
#if LOCALSYMS
FTYPE fLocals;
WORD locMac;
#endif
#if FDEBUG
FTYPE fDebug;
#endif
#if CMDXENIX
WORD symlen;
#endif
#if OSMSDOS
char bigbuf[LBUFSIZ];
FTYPE fPauseRun;
BYTE chRunFile;
BYTE chListFile;
RBTYPE rhteLstfile;
BYTE DskCur;
#endif
#if LIBMSDOS
FTYPE fNoExtDic;
long libHTAddr;
#endif
#if FIXEDSTACK
int _stack = STKSIZ;
#endif
#if ECS
FTYPE fLeadByte[0x80]; /* f(n) true iff n+0x80 is lead byte */
#endif
#if CRLF
char _eol[] = "\r\n";
#endif
#if SYMDEB
FTYPE fSymdeb;
FTYPE fCVpack = (FTYPE) TRUE;
FTYPE fDebSeg;
FTYPE fSkipPublics;
WORD cSegCode;
WORD ObjDebTotal;
SEGTYPE segDebFirst;
SEGTYPE segDebLast;
//DWORD vaCVMac = (DWORD) AREACV;
//DWORD vaCVBase;
#if OSEGEXE
WORD cbImpSeg;
SNTYPE gsnImports;
#endif
#endif
#if NOT M_WORDSWAP OR M_BYTESWAP
char _cbexehdr[] = "wssssssssssssss2sssssls7sl";
char _cbnewexe[] = "wsccsslssssllsssssssslss12c";
char _cbnewrlc[] = "wccs2cs";
char _cbnewseg[] = "wssss";
char _cblong[] = "wl";
char _cbword[] = "ws";
#endif
#if C8_IDE
char msgBuf[_MAX_PATH];
#endif
#if OUT_EXP
char bufExportsFileName[_MAX_PATH] = {'\0'};
#endif
/* Variables for segmented-executable format */
#if OSEGEXE
SNTYPE gsnAppLoader;
RBTYPE vpropAppLoader;
#if EXE386
DWORD hdrSize = 0x10000L;
DWORD virtBase = 0x10000L;
DWORD cbEntTab;
DWORD cbNamePtr;
DWORD cbOrdinal;
DWORD cbExpName;
DWORD cbImports;
DWORD cbImportsMod;
DWORD *mpsaVMArea;
DWORD *mpsaBase;
DWORD cbStack;
DWORD cbStackCommit;
DWORD cbHeap;
DWORD cbHeapCommit;
#else
WORD cbHeap;
WORD cbStack;
#endif
WORD cFixupBuckets;
#if EXE386
WORD cChainBuckets = BKTMAX;
#endif
long chksum32;
WORD cMovableEntries;
#if EXE386
BYTE TargetOs;
BYTE TargetSubsys = E32_SSWINCHAR;
DWORD dfCode = OBJ_CODE | OBJ_READ | OBJ_EXEC;
DWORD dfData = OBJ_INITDATA | OBJ_READ | OBJ_WRITE;
BYTE ExeMajorVer = 0;
BYTE ExeMinorVer = 0;
BYTE UserMajorVer = 0;
BYTE UserMinorVer = 0;
#else
#if DOSEXTENDER OR DOSX32 OR WIN_NT
BYTE TargetOs = NE_WINDOWS; // For DOS the default is Windows
#else
BYTE TargetOs = NE_OS2;
#endif
WORD dfCode = NSCODE | (3<<SHIFTDPL);
WORD dfData = NSDATA | (3<<SHIFTDPL);
BYTE ExeMajorVer = DEF_EXETYPE_WINDOWS_MAJOR;
BYTE ExeMinorVer = DEF_EXETYPE_WINDOWS_MINOR;
#endif
WORD expMac;
FTYPE fHeapMax;
FTYPE fRealMode;
FTYPE fStub = (FTYPE) TRUE;
FTYPE fWarnFixup;
EPTYPE FAR * FAR *htsaraep;
DWORD FAR *mpsacb;
#if O68K
DWORD *mpsadraDP;
#endif
DWORD FAR *mpsacbinit;
#if EXE386
DWORD *mpsacrlc;
DWORD *mpsaflags;
WORD *mpextflags;
#else
RLCHASH FAR * FAR *mpsaRlc;
BYTE FAR *mpextflags;
WORD FAR *mpsaflags;
#endif
RLCPTR rlcCurLidata;
RLCPTR rlcLidata;
WORD raChksum;
RBTYPE rhteDeffile;
RBTYPE rhteModule;
RBTYPE rhteStub;
WORD fileAlign = DFSAALIGN;
#if EXE386
WORD pageAlign = DFPGALIGN;
WORD objAlign = DFOBJALIGN;
#endif
SATYPE saMac;
WORD vepMac = 1;
#if EXE386
WORD vFlags = 0;
WORD dllFlags = 0;
#else
WORD vFlags = NEINST;
BYTE vFlagsOthers;
#endif
#endif /* OSEGEXE */
FTYPE fExePack;
#if PCODE
FTYPE fMPC;
FTYPE fIgnoreMpcRun = FALSE;
#endif
/* Variables for DOS3 format executables */
#if ODOS3EXE
FTYPE fBinary = FALSE;
WORD cparMaxAlloc = 0xFFFF;
WORD csegsAbs;
WORD dosExtMode;
FTYPE fNoGrpAssoc;
SEGTYPE segResLast;
WORD vchksum;
WORD vdoslev;
FTYPE vfDSAlloc;
#if FEXEPACK
FRAMERLC FAR mpframeRlc[16];
#endif
#if OVERLAYS
FTYPE fOverlays;
FTYPE fOldOverlay = (FTYPE) FALSE;
FTYPE fDynamic;
SNTYPE gsnOvlData;
SNTYPE gsnOverlay;
WORD iovMac = 1;
WORD ovlThunkMax = 256;
WORD ovlThunkMac = 1;
SNTYPE FAR *mposngsn;
SNTYPE FAR *htgsnosn;
IOVTYPE FAR *mpsegiov;
RUNRLC FAR *mpiovRlc;
ALIGNTYPE FAR *mpsegalign;
SNTYPE osnMac = 1;
BYTE vintno = DFINTNO;
#endif /* OVERLAYS */
#endif /* ODOS3EXE */
/* Variables for segmented-x.out format */
#if OIAPX286
long absAddr = -1L;
FTYPE fPack = TRUE;
SATYPE *mpstsa;
SATYPE stBias = DFSTBIAS;
SATYPE stDataBias;
SATYPE stLast;
WORD stMac;
#if EXE386
WORD xevmod;
RATYPE rbaseText;
RATYPE rbaseData = 0x1880000L;
WORD xevmod;
FTYPE fPageswitch;
BYTE cblkPage = 1024 >> 9;
#endif
#endif
/* Variables shared by segmented x.out and DOS3 exes */
#if OIAPX286 OR ODOS3EXE
GRTYPE *mpextggr;
long FAR *mpsegcb;
FTYPE FAR *mpsegFlags;
char *ompimisegDstIdata;
#endif
/* Variables for x.out format */
#if OXOUT OR OIAPX286
FTYPE fIandD;
FTYPE fLarge;
FTYPE fLocals;
FTYPE fMedium;
FTYPE fMixed;
FTYPE fSymbol = TRUE;
WORD xever = DFXEVER;
#endif
#ifdef QCLINK
#if NOT WIN_3
FTYPE fZ1 = FALSE;
#endif
FTYPE fZ2 = FALSE;
#endif
/* Variables for ILINK support */
#if ILINK
FTYPE fZincr = FALSE;
FTYPE fQCIncremental = FALSE;
FTYPE fIncremental = FALSE;
WORD imodFile;
WORD imodCur = 0; /* one-based module number */
#endif
WORD cbPadCode; /* code padding size */
WORD cbPadData = 16; /* data padding size */
/* Variables shared by segmented-exe and DOS3 executables */
#if OEXE
FTYPE fDOSExtended;
FTYPE fNoNulls;
FTYPE fPackData = FALSE;
FTYPE fPackSet;
FTYPE fSegOrder;
DWORD packLim;
DWORD DataPackLim;
#endif
/* Variables for dual-exe format capability */
#if OSEGEXE AND ODOS3EXE
FTYPE fNewExe;
FTYPE fOptimizeFixups;
void (NEAR *pfProcFixup)(FIXINFO *pfi);
#endif
/* Variables shared by segmented-exe and segmented-x.out */
#if OSEGEXE OR OIAPX286
RBTYPE mpggrrhte[GRMAX];
#if FAR_SEG_TABLES
SNTYPE FAR *mpseggsn;
#else
SNTYPE *mpseggsn;
#endif
#endif
FTYPE fNoEchoLrf;
FTYPE fNoBanner;
FTYPE BannerOnScreen;
/* Variables for MS-DOS style command interface */
#if CMDMSDOS
BYTE bSep = ','; /* Separator character */
BYTE chMaskSpace = ' ';
FTYPE fEsc;
#if WIN_3
FTYPE fNoprompt = TRUE;
#else
FTYPE fNoprompt;
#endif
#if USE_REAL
FTYPE fUseReal = FALSE;
FTYPE fSwNoUseReal = FALSE;
#endif
RBTYPE rgLibPath[IFHLIBMAX];
WORD cLibPaths;
# if OSXENIX
char CHSWITCH = '-'; /* Switch character */
# else
char CHSWITCH = '/'; /* Switch character */
# endif
#if OSMSDOS AND NOT WIN_3
int (cdecl *pfPrompt)() = PromptStd;
#endif
#if WIN_3
int (cdecl *pfPrompt)() = NULL;
#endif
#endif /* CMDMSDOS */
/* Miscellaneous combinations */
#if QBLIB
FTYPE fQlib;
#endif
#if OSEGEXE OR QCLINK
typedef void (FAR * FARFPTYPE)(); /* FAR function pointer type */
FARFPTYPE FAR *pfQTab;
#endif
char *lnknam = "LINK";
#if NEWSYM
long cbSymtab;
void (*pfEnSyms)(void (*pproc)(APROPNAMEPTR papropName,
RBTYPE rhte,
RBTYPE rprop,
WORD fNewHte),
ATTRTYPE attr) = BigEnSyms;
#endif /* NEWSYM */
#if NEWLIST
RBTYPE rbLstUndef = RHTENIL;
#endif
#if WIN_3
void (*pfCputc)(int ch) = CputcWin;
void (*pfCputs)(char *str) = CputsWin;
#else
void (*pfCputc)(int ch) = CputcStd;
void (*pfCputs)(char *str) = CputsStd;
#endif
#if NEWIO
RBTYPE rbFilePrev;
char mpifhfh[IFHLIBMAX];
#endif
#if ILINK OR SYMDEB
long lfaBase;
#endif
#if ALIGN_REC
BYTE *pbRec; // data for current record
char recbuf[8192]; // record buffer...
#endif