1 /* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*-
3 * Copyright (c) 2005-2007 Apple Inc. All rights reserved.
5 * @APPLE_LICENSE_HEADER_START@
7 * This file contains Original Code and/or Modifications of Original Code
8 * as defined in and that are subject to the Apple Public Source License
9 * Version 2.0 (the 'License'). You may not use this file except in
10 * compliance with the License. Please obtain a copy of the License at
11 * http://www.opensource.apple.com/apsl/ and read it before using this
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
19 * Please see the License for the specific language governing rights and
20 * limitations under the License.
22 * @APPLE_LICENSE_HEADER_END@
30 #include <mach/machine.h>
33 #include <ext/hash_set>
34 #include <ext/hash_map>
36 #include "ObjectFile.h"
38 extern void throwf (const char* format
, ...) __attribute__ ((noreturn
,format(printf
, 1, 2)));
39 extern void warning(const char* format
, ...) __attribute__((format(printf
, 1, 2)));
44 LibraryOptions() : fWeakImport(false), fReExport(false), fBundleLoader(false), fLazyLoad(false), fForceLoad(false) {}
45 // for dynamic libraries
50 // for static libraries
57 // The public interface to the Options class is the abstract representation of what work the linker
60 // This abstraction layer will make it easier to support a future where the linker is a shared library
61 // invoked directly from Xcode. The target settings in Xcode would be used to directly construct an Options
62 // object (without building a command line which is then parsed).
68 Options(int argc
, const char* argv
[]);
71 enum OutputKind
{ kDynamicExecutable
, kStaticExecutable
, kDynamicLibrary
, kDynamicBundle
, kObjectFile
, kDyld
, kPreload
, kKextBundle
};
72 enum NameSpace
{ kTwoLevelNameSpace
, kFlatNameSpace
, kForceFlatNameSpace
};
73 // Standard treatment for many options.
74 enum Treatment
{ kError
, kWarning
, kSuppress
, kNULL
, kInvalid
};
75 enum UndefinedTreatment
{ kUndefinedError
, kUndefinedWarning
, kUndefinedSuppress
, kUndefinedDynamicLookup
};
76 enum WeakReferenceMismatchTreatment
{ kWeakReferenceMismatchError
, kWeakReferenceMismatchWeak
,
77 kWeakReferenceMismatchNonWeak
};
78 enum CommonsMode
{ kCommonsIgnoreDylibs
, kCommonsOverriddenByDylibs
, kCommonsConflictsDylibsError
};
79 enum DeadStripMode
{ kDeadStripOff
, kDeadStripOn
, kDeadStripOnPlusUnusedInits
};
80 enum UUIDMode
{ kUUIDNone
, kUUIDRandom
, kUUIDContent
};
81 enum LocalSymbolHandling
{ kLocalSymbolsAll
, kLocalSymbolsNone
, kLocalSymbolsSelectiveInclude
, kLocalSymbolsSelectiveExclude
};
87 LibraryOptions options
;
91 const char* segmentName
;
92 const char* sectionName
;
98 struct SectionAlignment
{
99 const char* segmentName
;
100 const char* sectionName
;
104 struct OrderedSymbol
{
105 const char* symbolName
;
106 const char* objectFileName
;
109 struct SegmentStart
{
119 struct SegmentProtect
{
125 struct DylibOverride
{
126 const char* installName
;
127 const char* useInstead
;
131 const ObjectFile::ReaderOptions
& readerOptions();
132 const char* getOutputFilePath();
133 std::vector
<FileInfo
>& getInputFiles();
135 cpu_type_t
architecture() { return fArchitecture
; }
136 bool preferSubArchitecture() { return fHasPreferredSubType
; }
137 cpu_subtype_t
subArchitecture() { return fSubArchitecture
; }
138 bool allowSubArchitectureMismatches() { return fAllowCpuSubtypeMismatches
; }
139 OutputKind
outputKind();
142 bool fullyLoadArchives();
143 NameSpace
nameSpace();
144 const char* installPath(); // only for kDynamicLibrary
145 uint32_t currentVersion(); // only for kDynamicLibrary
146 uint32_t compatibilityVersion(); // only for kDynamicLibrary
147 const char* entryName(); // only for kDynamicExecutable or kStaticExecutable
148 const char* executablePath();
149 uint64_t baseAddress();
150 bool keepPrivateExterns(); // only for kObjectFile
151 bool needsModuleTable(); // only for kDynamicLibrary
152 bool interposable(const char* name
);
153 bool hasExportRestrictList(); // -exported_symbol or -unexported_symbol
154 bool hasExportMaskList(); // just -exported_symbol
155 bool hasWildCardExportRestrictList();
156 bool allGlobalsAreDeadStripRoots();
157 bool shouldExport(const char*);
158 bool ignoreOtherArchInputFiles();
159 bool forceCpuSubtypeAll();
161 bool traceArchives();
162 DeadStripMode
deadStrip();
163 UndefinedTreatment
undefinedTreatment();
164 ObjectFile::ReaderOptions::MacVersionMin
macosxVersionMin() { return fReaderOptions
.fMacVersionMin
; }
165 ObjectFile::ReaderOptions::IPhoneVersionMin
iphoneOSVersionMin() { return fReaderOptions
.fIPhoneVersionMin
; }
166 bool minOS(ObjectFile::ReaderOptions::MacVersionMin mac
, ObjectFile::ReaderOptions::IPhoneVersionMin iPhoneOS
);
167 bool messagesPrefixedWithArchitecture();
168 Treatment
picTreatment();
169 WeakReferenceMismatchTreatment
weakReferenceMismatchTreatment();
170 const char* umbrellaName();
171 std::vector
<const char*>& allowableClients();
172 const char* clientName();
173 const char* initFunctionName(); // only for kDynamicLibrary
174 const char* dotOutputFile();
175 uint64_t zeroPageSize();
176 bool hasCustomStack();
177 uint64_t customStackSize();
178 uint64_t customStackAddr();
179 bool hasExecutableStack();
180 std::vector
<const char*>& initialUndefines();
181 bool printWhyLive(const char* name
);
182 uint32_t minimumHeaderPad();
183 uint64_t segmentAlignment() { return fSegmentAlignment
; }
184 bool maxMminimumHeaderPad() { return fMaxMinimumHeaderPad
; }
185 std::vector
<ExtraSection
>& extraSections();
186 std::vector
<SectionAlignment
>& sectionAlignments();
187 CommonsMode
commonsMode();
189 bool keepRelocations();
190 FileInfo
findFile(const char* path
);
191 UUIDMode
getUUIDMode() { return fUUIDMode
; }
193 bool pauseAtEnd() { return fPause
; }
194 bool printStatistics() { return fStatistics
; }
195 bool printArchPrefix() { return fMessagesPrefixedWithArchitecture
; }
196 void gotoClassicLinker(int argc
, const char* argv
[]);
197 bool sharedRegionEligible() { return fSharedRegionEligible
; }
198 bool printOrderFileStatistics() { return fPrintOrderFileStatistics
; }
199 const char* dTraceScriptName() { return fDtraceScriptName
; }
200 bool dTrace() { return (fDtraceScriptName
!= NULL
); }
201 std::vector
<OrderedSymbol
>& orderedSymbols() { return fOrderedSymbols
; }
202 bool splitSeg() { return fSplitSegs
; }
203 uint64_t baseWritableAddress() { return fBaseWritableAddress
; }
204 std::vector
<SegmentStart
>& customSegmentAddresses() { return fCustomSegmentAddresses
; }
205 std::vector
<SegmentSize
>& customSegmentSizes() { return fCustomSegmentSizes
; }
206 std::vector
<SegmentProtect
>& customSegmentProtections() { return fCustomSegmentProtections
; }
207 bool saveTempFiles() { return fSaveTempFiles
; }
208 const std::vector
<const char*>& rpaths() { return fRPaths
; }
209 bool readOnlyx86Stubs() { return fReadOnlyx86Stubs
; }
210 std::vector
<DylibOverride
>& dylibOverrides() { return fDylibOverrides
; }
211 const char* generatedMapPath() { return fMapPath
; }
212 bool positionIndependentExecutable() { return fPositionIndependentExecutable
; }
213 Options::FileInfo
findFileUsingPaths(const char* path
);
214 bool deadStripDylibs() { return fDeadStripDylibs
; }
215 bool allowedUndefined(const char* name
) { return ( fAllowedUndefined
.find(name
) != fAllowedUndefined
.end() ); }
216 bool someAllowedUndefines() { return (fAllowedUndefined
.size() != 0); }
217 LocalSymbolHandling
localSymbolHandling() { return fLocalSymbolHandling
; }
218 bool keepLocalSymbol(const char* symbolName
);
219 bool allowTextRelocs() { return fAllowTextRelocs
; }
220 bool warnAboutTextRelocs() { return fWarnTextRelocs
; }
221 bool usingLazyDylibLinking() { return fUsingLazyDylibLinking
; }
222 bool verbose() { return fVerbose
; }
223 bool makeEncryptable() { return fEncryptable
; }
224 bool needsUnwindInfoSection() { return fReaderOptions
.fAddCompactUnwindEncoding
; }
225 std::vector
<const char*>& llvmOptions() { return fLLVMOptions
; }
226 bool makeClassicDyldInfo() { return fMakeClassicDyldInfo
; }
227 bool makeCompressedDyldInfo() { return fMakeCompressedDyldInfo
; }
228 bool hasExportedSymbolOrder();
229 bool exportedSymbolOrder(const char* sym
, unsigned int* order
);
230 bool orderData() { return fOrderData
; }
231 bool errorOnOtherArchFiles() { return fErrorOnOtherArchFiles
; }
232 bool markAutoDeadStripDylib() { return fMarkDeadStrippableDylib
; }
233 bool removeEHLabels() { return fReaderOptions
.fNoEHLabels
; }
234 bool useSimplifiedDylibReExports() { return fUseSimplifiedDylibReExports
; }
235 bool objCABIVersion2POverride() { return fObjCABIVersion2POverride
; }
241 bool operator()(const char* left
, const char* right
) const { return (strcmp(left
, right
) == 0); }
243 typedef __gnu_cxx::hash_map
<const char*, unsigned int, __gnu_cxx::hash
<const char*>, CStringEquals
> NameToOrder
;
244 typedef __gnu_cxx::hash_set
<const char*, __gnu_cxx::hash
<const char*>, CStringEquals
> NameSet
;
245 enum ExportMode
{ kExportDefault
, kExportSome
, kDontExportSome
};
246 enum LibrarySearchMode
{ kSearchDylibAndArchiveInEachDir
, kSearchAllDirsForDylibsThenAllDirsForArchives
};
247 enum InterposeMode
{ kInterposeNone
, kInterposeAllExternal
, kInterposeSome
};
249 class SetWithWildcards
{
251 void insert(const char*);
252 bool contains(const char*);
253 bool hasWildCards() { return !fWildCard
.empty(); }
254 NameSet::iterator
regularBegin() { return fRegular
.begin(); }
255 NameSet::iterator
regularEnd() { return fRegular
.end(); }
257 static bool hasWildCards(const char*);
258 bool wildCardMatch(const char* pattern
, const char* candidate
);
259 bool inCharRange(const char*& range
, unsigned char c
);
262 std::vector
<const char*> fWildCard
;
266 void parse(int argc
, const char* argv
[]);
267 void checkIllegalOptionCombinations();
268 void buildSearchPaths(int argc
, const char* argv
[]);
269 void parseArch(const char* architecture
);
270 FileInfo
findLibrary(const char* rootName
, bool dylibsOnly
=false);
271 FileInfo
findFramework(const char* frameworkName
);
272 FileInfo
findFramework(const char* rootName
, const char* suffix
);
273 bool checkForFile(const char* format
, const char* dir
, const char* rootName
,
275 uint32_t parseVersionNumber(const char*);
276 void parseSectionOrderFile(const char* segment
, const char* section
, const char* path
);
277 void parseOrderFile(const char* path
, bool cstring
);
278 void addSection(const char* segment
, const char* section
, const char* path
);
279 void addSubLibrary(const char* name
);
280 void loadFileList(const char* fileOfPaths
);
281 uint64_t parseAddress(const char* addr
);
282 void loadExportFile(const char* fileOfExports
, const char* option
, SetWithWildcards
& set
);
283 void parseAliasFile(const char* fileOfAliases
);
284 void parsePreCommandLineEnvironmentSettings();
285 void parsePostCommandLineEnvironmentSettings();
286 void setUndefinedTreatment(const char* treatment
);
287 void setMacOSXVersionMin(const char* version
);
288 void setIPhoneVersionMin(const char* version
);
289 void setWeakReferenceMismatchTreatment(const char* treatment
);
290 void addDylibOverride(const char* paths
);
291 void addSectionAlignment(const char* segment
, const char* section
, const char* alignment
);
292 CommonsMode
parseCommonsTreatment(const char* mode
);
293 Treatment
parseTreatment(const char* treatment
);
294 void reconfigureDefaults();
295 void checkForClassic(int argc
, const char* argv
[]);
296 void parseSegAddrTable(const char* segAddrPath
, const char* installPath
);
297 void addLibrary(const FileInfo
& info
);
298 void warnObsolete(const char* arg
);
299 uint32_t parseProtection(const char* prot
);
300 void loadSymbolOrderFile(const char* fileOfExports
, NameToOrder
& orderMapping
);
303 ObjectFile::ReaderOptions fReaderOptions
;
304 const char* fOutputFile
;
305 std::vector
<Options::FileInfo
> fInputFiles
;
306 cpu_type_t fArchitecture
;
307 cpu_subtype_t fSubArchitecture
;
308 OutputKind fOutputKind
;
309 bool fHasPreferredSubType
;
312 bool fKeepPrivateExterns
;
313 bool fNeedsModuleTable
;
314 bool fIgnoreOtherArchFiles
;
315 bool fErrorOnOtherArchFiles
;
316 bool fForceSubtypeAll
;
317 InterposeMode fInterposeMode
;
318 DeadStripMode fDeadStrip
;
319 NameSpace fNameSpace
;
320 uint32_t fDylibCompatVersion
;
321 uint32_t fDylibCurrentVersion
;
322 const char* fDylibInstallName
;
323 const char* fFinalName
;
324 const char* fEntryName
;
325 uint64_t fBaseAddress
;
326 uint64_t fBaseWritableAddress
;
328 SetWithWildcards fExportSymbols
;
329 SetWithWildcards fDontExportSymbols
;
330 SetWithWildcards fInterposeList
;
331 NameToOrder fExportSymbolsOrder
;
332 ExportMode fExportMode
;
333 LibrarySearchMode fLibrarySearchMode
;
334 UndefinedTreatment fUndefinedTreatment
;
335 bool fMessagesPrefixedWithArchitecture
;
336 WeakReferenceMismatchTreatment fWeakReferenceMismatchTreatment
;
337 std::vector
<const char*> fSubUmbellas
;
338 std::vector
<const char*> fSubLibraries
;
339 std::vector
<const char*> fAllowableClients
;
340 std::vector
<const char*> fRPaths
;
341 const char* fClientName
;
342 const char* fUmbrellaName
;
343 const char* fInitFunctionName
;
344 const char* fDotOutputFile
;
345 const char* fExecutablePath
;
346 const char* fBundleLoader
;
347 const char* fDtraceScriptName
;
348 const char* fSegAddrTablePath
;
349 const char* fMapPath
;
350 uint64_t fZeroPageSize
;
353 bool fExecutableStack
;
354 uint32_t fMinimumHeaderPad
;
355 uint64_t fSegmentAlignment
;
356 CommonsMode fCommonsMode
;
358 SetWithWildcards fLocalSymbolsIncluded
;
359 SetWithWildcards fLocalSymbolsExcluded
;
360 LocalSymbolHandling fLocalSymbolHandling
;
363 bool fKeepRelocations
;
365 bool fTraceDylibSearching
;
369 bool fSharedRegionEligible
;
370 bool fPrintOrderFileStatistics
;
371 bool fReadOnlyx86Stubs
;
372 bool fPositionIndependentExecutable
;
373 bool fDisablePositionIndependentExecutable
;
374 bool fMaxMinimumHeaderPad
;
375 bool fDeadStripDylibs
;
376 bool fAllowTextRelocs
;
377 bool fWarnTextRelocs
;
378 bool fUsingLazyDylibLinking
;
381 bool fMarkDeadStrippableDylib
;
382 bool fMakeClassicDyldInfo
;
383 bool fMakeCompressedDyldInfo
;
385 bool fAllowCpuSubtypeMismatches
;
386 bool fUseSimplifiedDylibReExports
;
387 bool fObjCABIVersion2POverride
;
388 std::vector
<const char*> fInitialUndefines
;
389 NameSet fAllowedUndefined
;
391 std::vector
<ExtraSection
> fExtraSections
;
392 std::vector
<SectionAlignment
> fSectionAlignments
;
393 std::vector
<OrderedSymbol
> fOrderedSymbols
;
394 std::vector
<SegmentStart
> fCustomSegmentAddresses
;
395 std::vector
<SegmentSize
> fCustomSegmentSizes
;
396 std::vector
<SegmentProtect
> fCustomSegmentProtections
;
397 std::vector
<DylibOverride
> fDylibOverrides
;
398 std::vector
<const char*> fLLVMOptions
;
399 std::vector
<const char*> fLibrarySearchPaths
;
400 std::vector
<const char*> fFrameworkSearchPaths
;
401 std::vector
<const char*> fSDKPaths
;
407 #endif // __OPTIONS__