/* -*- 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@
*
#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;
};
//
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;
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<FileInfo>& 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();
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();
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<const char*>& allowableClients();
const char* clientName();
std::vector<const char*>& initialUndefines();
bool printWhyLive(const char* name);
uint32_t minimumHeaderPad();
+ bool maxMminimumHeaderPad() { return fMaxMinimumHeaderPad; }
std::vector<ExtraSection>& extraSections();
std::vector<SectionAlignment>& sectionAlignments();
CommonsMode commonsMode();
bool warnCommons();
bool keepRelocations();
- std::vector<const char*>& 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<OrderedSymbol>& orderedSymbols() { return fOrderedSymbols; }
+ bool splitSeg() { return fSplitSegs; }
+ uint64_t baseWritableAddress() { return fBaseWritableAddress; }
+ std::vector<SegmentStart>& customSegmentAddresses() { return fCustomSegmentAddresses; }
+ std::vector<SegmentProtect>& customSegmentProtections() { return fCustomSegmentProtections; }
+ bool saveTempFiles() { return fSaveTempFiles; }
+ const std::vector<const char*>& rpaths() { return fRPaths; }
+ bool readOnlyx86Stubs() { return fReadOnlyx86Stubs; }
+ bool slowx86Stubs() { return fReaderOptions.fSlowx86Stubs; }
+ std::vector<DylibOverride>& 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
typedef __gnu_cxx::hash_set<const char*, __gnu_cxx::hash<const char*>, 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<const char*> 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 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<Options::FileInfo> 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<const char*> fSubUmbellas;
std::vector<const char*> fSubLibraries;
std::vector<const char*> fAllowableClients;
+ std::vector<const char*> 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<const char*> fInitialUndefines;
+ NameSet fAllowedUndefined;
NameSet fWhyLive;
- std::vector<const char*> fTraceSymbols;
- unsigned long fLimitUndefinedSymbols;
std::vector<ExtraSection> fExtraSections;
std::vector<SectionAlignment> fSectionAlignments;
+ std::vector<OrderedSymbol> fOrderedSymbols;
+ std::vector<SegmentStart> fCustomSegmentAddresses;
+ std::vector<SegmentProtect> fCustomSegmentProtections;
+ std::vector<DylibOverride> fDylibOverrides;
std::vector<const char*> fLibrarySearchPaths;
std::vector<const char*> fFrameworkSearchPaths;
std::vector<const char*> fSDKPaths;
- bool fAllowStackExecute;
-
+ bool fSaveTempFiles;
};
-
#endif // __OPTIONS__