X-Git-Url: https://git.saurik.com/apple/ld64.git/blobdiff_plain/69a49097222b02da1734b2c7a46b6ebb29f32fbc..77cc3118ce7a3a70a0a7364d77ae1eb766a477e7:/src/Options.h diff --git a/src/Options.h b/src/Options.h index dcedf8e..d185848 100644 --- a/src/Options.h +++ b/src/Options.h @@ -1,6 +1,6 @@ /* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*- * - * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2005-2007 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -34,17 +34,18 @@ #include "ObjectFile.h" -void throwf (const char* format, ...) __attribute__ ((noreturn)); +extern void throwf (const char* format, ...) __attribute__ ((noreturn)); +extern void warning(const char* format, ...); class DynamicLibraryOptions { public: - DynamicLibraryOptions() : fWeakImport(false), fReExport(false), fBundleLoader(false), fInstallPathOverride(NULL) {} + DynamicLibraryOptions() : fWeakImport(false), fReExport(false), fBundleLoader(false), fLazyLoad(false) {} bool fWeakImport; bool fReExport; bool fBundleLoader; - const char* fInstallPathOverride; + bool fLazyLoad; }; // @@ -71,7 +72,8 @@ public: kWeakReferenceMismatchNonWeak }; enum CommonsMode { kCommonsIgnoreDylibs, kCommonsOverriddenByDylibs, kCommonsConflictsDylibsError }; enum DeadStripMode { kDeadStripOff, kDeadStripOn, kDeadStripOnPlusUnusedInits }; - enum VersionMin { kMinUnset, k10_1, k10_2, k10_3, k10_4, k10_5 }; + enum UUIDMode { kUUIDNone, kUUIDRandom, kUUIDContent }; + enum LocalSymbolHandling { kLocalSymbolsAll, kLocalSymbolsNone, kLocalSymbolsSelectiveInclude, kLocalSymbolsSelectiveExclude }; struct FileInfo { const char* path; @@ -94,13 +96,36 @@ public: uint8_t alignment; }; + struct OrderedSymbol { + const char* symbolName; + const char* objectFileName; + }; + + struct SegmentStart { + const char* name; + uint64_t address; + }; + + struct SegmentProtect { + const char* name; + uint32_t max; + uint32_t init; + }; + + struct DylibOverride { + const char* installName; + const char* useInstead; + }; + + const ObjectFile::ReaderOptions& readerOptions(); const char* getOutputFilePath(); std::vector& getInputFiles(); - cpu_type_t architecture(); + cpu_type_t architecture() { return fArchitecture; } + bool preferSubArchitecture() { return fHasPreferredSubType; } + cpu_subtype_t subArchitecture() { return fSubArchitecture; } OutputKind outputKind(); - bool stripLocalSymbols(); bool prebind(); bool bindAtLoad(); bool fullyLoadArchives(); @@ -111,9 +136,12 @@ public: const char* entryName(); // only for kDynamicExecutable or kStaticExecutable const char* executablePath(); uint64_t baseAddress(); - bool keepPrivateExterns(); // only for kObjectFile - bool interposable(); // only for kDynamicLibrary + bool keepPrivateExterns(); // only for kObjectFile + bool needsModuleTable(); // only for kDynamicLibrary + bool interposable(const char* name); bool hasExportRestrictList(); + bool hasExportMaskList(); + bool hasWildCardExportRestrictList(); bool allGlobalsAreDeadStripRoots(); bool shouldExport(const char*); bool ignoreOtherArchInputFiles(); @@ -122,13 +150,10 @@ public: bool traceArchives(); DeadStripMode deadStrip(); UndefinedTreatment undefinedTreatment(); - VersionMin macosxVersionMin(); + ObjectFile::ReaderOptions::VersionMin macosxVersionMin(); bool messagesPrefixedWithArchitecture(); Treatment picTreatment(); WeakReferenceMismatchTreatment weakReferenceMismatchTreatment(); - Treatment multipleDefinitionsInDylibs(); - Treatment overridingDefinitionInDependentDylib(); - bool warnOnMultipleDefinitionsInObjectFiles(); const char* umbrellaName(); std::vector& allowableClients(); const char* clientName(); @@ -142,19 +167,46 @@ public: std::vector& initialUndefines(); bool printWhyLive(const char* name); uint32_t minimumHeaderPad(); + bool maxMminimumHeaderPad() { return fMaxMinimumHeaderPad; } std::vector& extraSections(); std::vector& sectionAlignments(); CommonsMode commonsMode(); bool warnCommons(); bool keepRelocations(); - std::vector& traceSymbols(); FileInfo findFile(const char* path); - bool emitUUID(); + UUIDMode getUUIDMode() { return fUUIDMode; } bool warnStabs(); bool pauseAtEnd() { return fPause; } bool printStatistics() { return fStatistics; } bool printArchPrefix() { return fMessagesPrefixedWithArchitecture; } - bool makeTentativeDefinitionsReal() { return fMakeTentativeDefinitionsReal; } + void gotoClassicLinker(int argc, const char* argv[]); + bool sharedRegionEligible() { return fSharedRegionEligible; } + bool printOrderFileStatistics() { return fPrintOrderFileStatistics; } + const char* dTraceScriptName() { return fDtraceScriptName; } + bool dTrace() { return (fDtraceScriptName != NULL); } + std::vector& orderedSymbols() { return fOrderedSymbols; } + bool splitSeg() { return fSplitSegs; } + uint64_t baseWritableAddress() { return fBaseWritableAddress; } + std::vector& customSegmentAddresses() { return fCustomSegmentAddresses; } + std::vector& customSegmentProtections() { return fCustomSegmentProtections; } + bool saveTempFiles() { return fSaveTempFiles; } + const std::vector& rpaths() { return fRPaths; } + bool readOnlyx86Stubs() { return fReadOnlyx86Stubs; } + bool slowx86Stubs() { return fReaderOptions.fSlowx86Stubs; } + std::vector& dylibOverrides() { return fDylibOverrides; } + const char* generatedMapPath() { return fMapPath; } + bool positionIndependentExecutable() { return fPositionIndependentExecutable; } + Options::FileInfo findFileUsingPaths(const char* path); + bool deadStripDylibs() { return fDeadStripDylibs; } + bool allowedUndefined(const char* name) { return ( fAllowedUndefined.find(name) != fAllowedUndefined.end() ); } + bool someAllowedUndefines() { return (fAllowedUndefined.size() != 0); } + LocalSymbolHandling localSymbolHandling() { return fLocalSymbolHandling; } + bool keepLocalSymbol(const char* symbolName); + bool allowTextRelocs() { return fAllowTextRelocs; } + bool warnAboutTextRelocs() { return fWarnTextRelocs; } + bool usingLazyDylibLinking() { return fUsingLazyDylibLinking; } + bool verbose() { return fVerbose; } + bool makeEncryptable() { return fEncryptable; } private: class CStringEquals @@ -166,106 +218,150 @@ private: typedef __gnu_cxx::hash_set, CStringEquals> NameSet; enum ExportMode { kExportDefault, kExportSome, kDontExportSome }; enum LibrarySearchMode { kSearchDylibAndArchiveInEachDir, kSearchAllDirsForDylibsThenAllDirsForArchives }; + enum InterposeMode { kInterposeNone, kInterposeAllExternal, kInterposeSome }; + + class SetWithWildcards { + public: + void insert(const char*); + bool contains(const char*); + bool hasWildCards() { return !fWildCard.empty(); } + NameSet::iterator regularBegin() { return fRegular.begin(); } + NameSet::iterator regularEnd() { return fRegular.end(); } + private: + static bool hasWildCards(const char*); + bool wildCardMatch(const char* pattern, const char* candidate); + bool inCharRange(const char*& range, unsigned char c); + + NameSet fRegular; + std::vector fWildCard; + }; + void parse(int argc, const char* argv[]); void checkIllegalOptionCombinations(); void buildSearchPaths(int argc, const char* argv[]); void parseArch(const char* architecture); - FileInfo findLibrary(const char* rootName); - FileInfo findFramework(const char* rootName); + FileInfo findLibrary(const char* rootName, bool dylibsOnly=false); + FileInfo findFramework(const char* frameworkName); + FileInfo findFramework(const char* rootName, const char* suffix); bool checkForFile(const char* format, const char* dir, const char* rootName, FileInfo& result); uint32_t parseVersionNumber(const char*); void parseSectionOrderFile(const char* segment, const char* section, const char* path); + void parseOrderFile(const char* path, bool cstring); void addSection(const char* segment, const char* section, const char* path); void addSubLibrary(const char* name); void loadFileList(const char* fileOfPaths); uint64_t parseAddress(const char* addr); - void loadExportFile(const char* fileOfExports, const char* option, NameSet& set); + void loadExportFile(const char* fileOfExports, const char* option, SetWithWildcards& set); + void parseAliasFile(const char* fileOfAliases); void parsePreCommandLineEnvironmentSettings(); void parsePostCommandLineEnvironmentSettings(); void setUndefinedTreatment(const char* treatment); - void setVersionMin(const char* version); + void setMacOSXVersionMin(const char* version); + void setIPhoneVersionMin(const char* version); void setWeakReferenceMismatchTreatment(const char* treatment); - void setDylibInstallNameOverride(const char* paths); + void addDylibOverride(const char* paths); void addSectionAlignment(const char* segment, const char* section, const char* alignment); CommonsMode parseCommonsTreatment(const char* mode); Treatment parseTreatment(const char* treatment); void reconfigureDefaults(); - + void checkForClassic(int argc, const char* argv[]); + void parseSegAddrTable(const char* segAddrPath, const char* installPath); + void addLibrary(const FileInfo& info); + void warnObsolete(const char* arg); + uint32_t parseProtection(const char* prot); ObjectFile::ReaderOptions fReaderOptions; const char* fOutputFile; std::vector fInputFiles; cpu_type_t fArchitecture; + cpu_subtype_t fSubArchitecture; OutputKind fOutputKind; + bool fHasPreferredSubType; bool fPrebind; bool fBindAtLoad; - bool fStripLocalSymbols; bool fKeepPrivateExterns; - bool fInterposable; + bool fNeedsModuleTable; bool fIgnoreOtherArchFiles; bool fForceSubtypeAll; + InterposeMode fInterposeMode; DeadStripMode fDeadStrip; - VersionMin fVersionMin; NameSpace fNameSpace; uint32_t fDylibCompatVersion; uint32_t fDylibCurrentVersion; const char* fDylibInstallName; + const char* fFinalName; const char* fEntryName; uint64_t fBaseAddress; - NameSet fExportSymbols; - NameSet fDontExportSymbols; + uint64_t fBaseWritableAddress; + bool fSplitSegs; + SetWithWildcards fExportSymbols; + SetWithWildcards fDontExportSymbols; + SetWithWildcards fInterposeList; ExportMode fExportMode; LibrarySearchMode fLibrarySearchMode; UndefinedTreatment fUndefinedTreatment; bool fMessagesPrefixedWithArchitecture; - Treatment fPICTreatment; WeakReferenceMismatchTreatment fWeakReferenceMismatchTreatment; - Treatment fMultiplyDefinedDynamic; - Treatment fMultiplyDefinedUnused; - bool fWarnOnMultiplyDefined; std::vector fSubUmbellas; std::vector fSubLibraries; std::vector fAllowableClients; + std::vector fRPaths; const char* fClientName; const char* fUmbrellaName; const char* fInitFunctionName; const char* fDotOutputFile; const char* fExecutablePath; const char* fBundleLoader; + const char* fDtraceScriptName; + const char* fSegAddrTablePath; + const char* fMapPath; uint64_t fZeroPageSize; uint64_t fStackSize; uint64_t fStackAddr; bool fExecutableStack; uint32_t fMinimumHeaderPad; CommonsMode fCommonsMode; + UUIDMode fUUIDMode; + SetWithWildcards fLocalSymbolsIncluded; + SetWithWildcards fLocalSymbolsExcluded; + LocalSymbolHandling fLocalSymbolHandling; bool fWarnCommons; bool fVerbose; bool fKeepRelocations; - bool fEmitUUID; bool fWarnStabs; bool fTraceDylibSearching; bool fPause; bool fStatistics; bool fPrintOptions; - bool fMakeTentativeDefinitionsReal; + bool fSharedRegionEligible; + bool fPrintOrderFileStatistics; + bool fReadOnlyx86Stubs; + bool fPositionIndependentExecutable; + bool fMaxMinimumHeaderPad; + bool fDeadStripDylibs; + bool fAllowTextRelocs; + bool fWarnTextRelocs; + bool fUsingLazyDylibLinking; + bool fEncryptable; std::vector fInitialUndefines; + NameSet fAllowedUndefined; NameSet fWhyLive; - std::vector fTraceSymbols; - unsigned long fLimitUndefinedSymbols; std::vector fExtraSections; std::vector fSectionAlignments; + std::vector fOrderedSymbols; + std::vector fCustomSegmentAddresses; + std::vector fCustomSegmentProtections; + std::vector fDylibOverrides; std::vector fLibrarySearchPaths; std::vector fFrameworkSearchPaths; std::vector fSDKPaths; - bool fAllowStackExecute; - + bool fSaveTempFiles; }; - #endif // __OPTIONS__