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.
395 lines
15 KiB
395 lines
15 KiB
/***********************************************************************
|
|
* Microsoft (R) 32-Bit Incremental Linker
|
|
*
|
|
* Copyright (C) Microsoft Corp 1992-1996. All rights reserved.
|
|
*
|
|
* File: data.cpp
|
|
*
|
|
* File Comments:
|
|
*
|
|
* Contains the globals data for the linker, librarian, and dumper.
|
|
*
|
|
***********************************************************************/
|
|
|
|
#include "link.h"
|
|
|
|
const SWITCH DefSwitch = {
|
|
{ // Linker switches
|
|
FALSE, // Out
|
|
FALSE, // Base
|
|
FALSE, // Heap
|
|
FALSE, // Stack
|
|
#ifdef NT_BUILD
|
|
FALSE, // fCallTree
|
|
#endif
|
|
FALSE, // fChecksum
|
|
FALSE, // fDriver
|
|
FALSE, // fFixed
|
|
TRUE, // fMacBundle
|
|
FALSE, // fMap
|
|
FALSE, // fMapLines
|
|
FALSE, // fMiscInRData
|
|
FALSE, // fNewGlue // UNDONE: Temporary
|
|
FALSE, // fNewRelocs // UNDONE: Temporary
|
|
FALSE, // fNoDefaultLibs
|
|
FALSE, // fNoEntry
|
|
FALSE, // fNoPack
|
|
FALSE, // fNoPagedCode
|
|
TRUE, // fNotifyFullBuild
|
|
FALSE, // fOptIdata
|
|
FALSE, // fOrder
|
|
TRUE, // fPadMipsCode
|
|
TRUE, // fPE
|
|
FALSE, // fProfile
|
|
FALSE, // fROM
|
|
FALSE, // fTCE
|
|
0, // GpSize
|
|
None, // DebugInfo
|
|
NoDebug, // DebugType
|
|
ftNone, // Force
|
|
NULL, // szMacCreator
|
|
NULL // szMacType
|
|
},
|
|
|
|
{ // Librarian switches
|
|
NULL, // DllName
|
|
".dll", // DllExtension
|
|
FALSE, // List
|
|
FALSE // DefFile
|
|
},
|
|
|
|
{ // Dumper switches
|
|
0, // LinkerMember
|
|
0, // RawDisplaySize
|
|
IMAGE_DEBUG_TYPE_COFF, // SymbolType
|
|
Bytes, // RawDisplayType
|
|
FALSE, // Headers
|
|
FALSE, // Relocations
|
|
FALSE, // Linenumbers
|
|
FALSE, // Symbols
|
|
FALSE, // BaseRelocations
|
|
FALSE, // Imports
|
|
FALSE, // Exports
|
|
FALSE, // RawData
|
|
TRUE, // Summary
|
|
FALSE, // ArchiveMembers
|
|
FALSE, // FpoData
|
|
FALSE, // PData
|
|
FALSE, // OmapTo
|
|
FALSE, // OmapFrom
|
|
FALSE, // Fixup
|
|
FALSE, // SymbolMap
|
|
FALSE, // Warnings
|
|
FALSE, // Disasm
|
|
FALSE, // Directives
|
|
}
|
|
};
|
|
|
|
const SWITCH_INFO DefSwitchInfo = {
|
|
0, // user options
|
|
0, // cb of comment
|
|
NULL, // ptr to entry point
|
|
NULL, // ptr to Mac Init Routine
|
|
NULL, // ptr to Mac Term Routine
|
|
NULL, // ptr to list of includes
|
|
{ // section names list
|
|
NULL, // first
|
|
NULL, // last
|
|
0 // count
|
|
}
|
|
};
|
|
|
|
const IMAGE_FILE_HEADER DefImageFileHdr = {
|
|
IMAGE_FILE_MACHINE_UNKNOWN, // Machine
|
|
0, // NumberOfSections
|
|
0, // TimeDateStamp
|
|
0, // PointerToSymbolTable
|
|
0, // NumberOfSymbols
|
|
sizeof(IMAGE_OPTIONAL_HEADER), // SizeOfOptionalHeader
|
|
IMAGE_FILE_32BIT_MACHINE // Characteristics
|
|
};
|
|
|
|
const IMAGE_OPTIONAL_HEADER DefImageOptionalHdr = {
|
|
IMAGE_NT_OPTIONAL_HDR_MAGIC, // Magic
|
|
rmj, // MajorLinkerVersion
|
|
rmm, // MinorLinkerVersion
|
|
0, // SizeOfCode
|
|
0, // SizeOfInitializedData
|
|
0, // SizeOfUninitializedData
|
|
0, // AddressOfEntryPoint
|
|
0, // BaseOfCode
|
|
0, // BaseOfData
|
|
0x00400000, // ImageBase
|
|
_4K, // SectionAlignment
|
|
SECTOR_SIZE, // FileAlignment
|
|
4, // MajorOperatingSystemVersion
|
|
0, // MinorOperatingSystemVersion
|
|
0, // MajorImageVersion
|
|
0, // MinorImageVersion
|
|
0, // MajorSubsystemVersion
|
|
0, // MinorSubsystemVersion
|
|
0, // Reserved1
|
|
0, // SizeOfImage
|
|
0, // SizeOfHeaders
|
|
0, // CheckSum
|
|
0, // Subsystem
|
|
0, // DllCharacteristics
|
|
_1MEG, // SizeOfStackReserve
|
|
_4K, // SizeOfStackCommit // UNDONE: Fix for Alpha
|
|
_1MEG, // SizeOfHeapReserve
|
|
_4K, // SizeOfHeapCommit // UNDONE: Fix for Alpha
|
|
0, // LoaderFlags
|
|
IMAGE_NUMBEROF_DIRECTORY_ENTRIES, // NumberOfRvaAndSizes
|
|
{ // DataDirectory
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_EXPORT
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_IMPORT
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_RESOURCE
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_EXCEPTION
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_SECURITY
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_BASERELOC
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_DEBUG
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_COPYRIGHT
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_GLOBALPTR
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_TLS
|
|
{ 0, 0 }, // IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG
|
|
{ 0, 0 }, // spare (11)
|
|
{ 0, 0 }, // spare (12)
|
|
{ 0, 0 }, // spare (13)
|
|
{ 0, 0 }, // spare (14)
|
|
{ 0, 0 } // spare (15)
|
|
}
|
|
};
|
|
|
|
const IMAGE_SECTION_HEADER NullSectionHdr = { 0 };
|
|
const IMAGE_SYMBOL NullSymbol = { 0 };
|
|
|
|
const RESERVED_SECTION ReservedSection = {
|
|
".rdata", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ, // Read only data
|
|
".bss", IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | // Common (fold into .bss, not actually a reserved name)
|
|
IMAGE_SCN_MEM_WRITE,
|
|
".sdata", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // Gp relative data (including some common)
|
|
IMAGE_SCN_MEM_WRITE,
|
|
".xdata", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ, // Exception data
|
|
".debug", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // Debug
|
|
IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_1BYTES,
|
|
".edata", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ, // Export
|
|
".idata$2", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // DLL Descriptor (fold into .idata)
|
|
IMAGE_SCN_MEM_WRITE | IMAGE_SCN_ALIGN_1BYTES,
|
|
".rsrc", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // Resource
|
|
IMAGE_SCN_MEM_WRITE,
|
|
".pdata", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ, // Exception table
|
|
".reloc", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // Base relocations
|
|
IMAGE_SCN_MEM_DISCARDABLE,
|
|
".drectve", IMAGE_SCN_LNK_REMOVE | IMAGE_SCN_LNK_INFO, // Directives
|
|
".debug$S", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // CodeView $$Symbols
|
|
IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_1BYTES,
|
|
".debug$T", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // CodeView $$Types
|
|
IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_1BYTES,
|
|
".debug$P", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // CodeView precompiled types
|
|
IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_1BYTES,
|
|
".debug$F", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // Fpo Data
|
|
IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_1BYTES,
|
|
".text", IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | // PowerPC glue code
|
|
IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_MEM_READ,
|
|
".data", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // TOC table data
|
|
IMAGE_SCN_MEM_WRITE,
|
|
".ppcldr", IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | // TOC table data
|
|
IMAGE_SCN_MEM_DISCARDABLE,
|
|
};
|
|
|
|
|
|
const char *Delimiters = " \t";
|
|
|
|
BOOL fCtrlCSignal;
|
|
|
|
VOID (*ApplyFixups)(PCON, PIMAGE_RELOCATION, DWORD, BYTE *, PIMAGE_SYMBOL, PIMAGE, PSYMBOL_INFO);
|
|
|
|
INT FileReadHandle, FileWriteHandle;
|
|
DWORD MemberSeekBase;
|
|
DWORD MemberSize;
|
|
DWORD CoffHeaderSeek;
|
|
char *StringTable;
|
|
BOOL Verbose;
|
|
BOOL fVerboseLib;
|
|
char *OutFilename;
|
|
BOOL fOpenedOutFilename;
|
|
char *szInfoFilename;
|
|
char *DefFilename = "";
|
|
char *szModuleName = "";
|
|
FILE *InfoStream;
|
|
|
|
// ilink specific
|
|
BOOL fIncrDbFile;
|
|
BOOL fINCR;
|
|
INT FileIncrDbHandle;
|
|
PCON pconJmpTbl; // dummy CON for the jump table
|
|
ERRINC errInc = errNone;
|
|
char *szIncrDbFilename;
|
|
char *PdbFilename;
|
|
OPTION_ACTION OAComment, OAStub;
|
|
BOOL fMfilePad = FALSE;
|
|
|
|
NAME_LIST ModFileList;
|
|
DWORD cextFCNs;
|
|
PLMOD PCTMods; // list of pct mods
|
|
#ifdef INSTRUMENT
|
|
LOG Log;
|
|
#endif // INSTRUMENT
|
|
BOOL fPdb = TRUE; // By default pdb is specified
|
|
|
|
CVSEEKS CvSeeks;
|
|
PCVINFO CvInfo;
|
|
DWORD NextCvObject;
|
|
|
|
NAME_LIST SwitchArguments;
|
|
NAME_LIST ExportSwitches;
|
|
NAME_LIST MergeSwitches;
|
|
NAME_LIST FilenameArguments;
|
|
NAME_LIST ObjectFilenameArguments;
|
|
NAME_LIST ArchiveFilenameArguments;
|
|
NAME_LIST SectionNames;
|
|
NAME_LIST WeakImportsFunctionList; // List of Weak imports for Functions
|
|
NAME_LIST WeakImportsContainerList; // List of Weak imports for Containers
|
|
NAME_LIST ZappedBaseRelocList; // Deleted Base Reloc list for MPPC iLink
|
|
NAME_LIST MacResourceList; // PowerMac specific resource List
|
|
NAME_LIST MppcImportList; // PowerMac specific import list
|
|
|
|
DWORD *MemberStart;
|
|
|
|
PARGUMENT_LIST pargFirst;
|
|
const char *ToolName;
|
|
const char *ToolGenericName; // e.g. "Linker"
|
|
DWORD csymDebug;
|
|
char ShortName[9]; // Last byte must stay NULL
|
|
DWORD UndefinedSymbols;
|
|
DWORD foCoffSyms;
|
|
DWORD VerifyImageSize;
|
|
DWORD cextWeakOrLazy;
|
|
BOOL BadFuzzyMatch;
|
|
BOOL fMultipleDefinitions;
|
|
DWORD dwMaxCurrentVer = 0; // Current Version of the shared library in PowerMac
|
|
DWORD dwMinOldAPIVer = UINT_MAX; // Old API Version of the shared library in PowerMac
|
|
DWORD dwMinOldCodeVer = UINT_MAX; // Old Code Version of the shared library in PowerMac
|
|
BOOL fMPPCVersionConflict = FALSE;
|
|
|
|
PMOD pmodLinkerDefined;
|
|
|
|
PSEC psecBaseReloc;
|
|
PSEC psecCommon;
|
|
PSEC psecData;
|
|
PSEC psecDebug;
|
|
PSEC psecException;
|
|
PSEC psecExport;
|
|
PSEC psecGp;
|
|
PSEC psecXdata;
|
|
PSEC psecImportDescriptor;
|
|
PSEC psecIdata2;
|
|
PSEC psecIdata5;
|
|
PSEC psecPowerMacLoader;
|
|
PSEC psecReadOnlyData;
|
|
PSEC psecResource;
|
|
|
|
PGRP pgrpCvPTypes;
|
|
PGRP pgrpCvSymbols;
|
|
PGRP pgrpCvTypes;
|
|
PGRP pgrpExport;
|
|
PGRP pgrpFpoData;
|
|
PGRP pgrpPdata;
|
|
|
|
// alpha bsr flag
|
|
BOOL fAlphaCheckLongBsr;
|
|
|
|
PEXTERNAL pextEntry;
|
|
TOOL_TYPE Tool;
|
|
BOOL IncludeDebugSection;
|
|
BOOL fImageMappedAsFile;
|
|
BASE_RELOC *rgbr;
|
|
BASE_RELOC *pbrCur;
|
|
BASE_RELOC *pbrEnd;
|
|
INTERNAL_ERROR InternalError = { "SetupPhase", '\0' };
|
|
|
|
DWORD csymDebugEst;
|
|
DWORD totalStringTableSize;
|
|
INT fdExeFile = -1;
|
|
|
|
PEXTERNAL pextGp;
|
|
unsigned cFixupError;
|
|
|
|
BOOL PrependUnderscore;
|
|
BOOL SkipUnderscore;
|
|
WORD NextMember;
|
|
PIMAGE pimageDeflib;
|
|
DWORD SmallestOrdinal;
|
|
DWORD LargestOrdinal;
|
|
DWORD TotalSizeOfForwarderStrings;
|
|
DWORD TotalSizeOfInternalNames;
|
|
|
|
BOOL fReproducible; // don't use timestamps
|
|
|
|
LRVA *plrvaFixupsForMapFile;
|
|
DWORD crvaFixupsForMapFile;
|
|
|
|
DWORD crelocTotal; // Estimate of fixups from pass 1
|
|
FIXPAG *pfixpagHead; // First fixup page
|
|
FIXPAG *pfixpagCur; // Current fixup page
|
|
DWORD cfixpag; // Number of pages of fixups
|
|
DWORD cxfixupCur; // Number of fixups on current page
|
|
|
|
BOOL fNeedSubsystem;
|
|
BOOL fDidMachineDependentInit;
|
|
|
|
BOOL fNeedBanner = TRUE; // for handling -nologo
|
|
BLK blkResponseFileEcho;
|
|
BLK blkComment;
|
|
|
|
PCON pconCvSignature; // dummy CON for CV debug signature
|
|
PCON pconCoffDebug; // dummy CON for COFF debug info
|
|
PCON pconFixupDebug; // dummy CON for Fixup debug info
|
|
PCON pconMiscDebug; // dummy CON for misc. debug info
|
|
PCON pconDebugDir; // dummy CON for CV debug directory
|
|
PLIB plibCmdLineObjs; // the dummy lib for top-level obj's
|
|
|
|
char *ImplibFilename;
|
|
BOOL fExplicitOptRef;
|
|
|
|
char *szReproDir;
|
|
FILE *pfileReproResponse;
|
|
|
|
WORD WarningLevel = 1;
|
|
|
|
BOOL fExceptionsOff;
|
|
//
|
|
// Permanent memory allocation variables
|
|
//
|
|
|
|
size_t cbFree;
|
|
size_t cbTotal = _4K;
|
|
size_t cbTemp;
|
|
BYTE *pch;
|
|
|
|
/* count for number of errors so far */
|
|
unsigned cError;
|
|
|
|
BOOL fPowerPC;
|
|
BYTE *mpisymbToc;
|
|
DWORD *mpisymdwRestoreToc;
|
|
PEXTERNAL pextToc;
|
|
PEXTERNAL pextFTInfo;
|
|
|
|
char szVersion[80];
|
|
|
|
// size of extern
|
|
size_t cbExternal = sizeof(EXTERNAL);
|
|
|
|
// head of weak extern list
|
|
WEAK_EXTERN_LIST *pwelHead;
|
|
|
|
DWORD rvaGp;
|
|
DWORD rvaGpMax;
|
|
|
|
BOOL fNoBaseRelocs;
|
|
BOOL fTest = FALSE;
|
|
#ifdef ILINKLOG
|
|
BOOL fIlinkLog = TRUE;
|
|
WORD wMachine; // UNDONE: take it out after ImgFileHdr can be used
|
|
#endif // ILINKLOG
|