fVerbose(false), fKeepRelocations(false), fWarnStabs(false),
fTraceDylibSearching(false), fPause(false), fStatistics(false), fPrintOptions(false),
fSharedRegionEligible(false), fPrintOrderFileStatistics(false),
- fReadOnlyx86Stubs(false), fPositionIndependentExecutable(false), fMaxMinimumHeaderPad(false),
+ fReadOnlyx86Stubs(false), fPositionIndependentExecutable(false),
+ fDisablePositionIndependentExecutable(false), fMaxMinimumHeaderPad(false),
fDeadStripDylibs(false), fAllowTextRelocs(false), fWarnTextRelocs(false),
fUsingLazyDylibLinking(false), fEncryptable(true),
fOrderData(true), fMarkDeadStrippableDylib(false),
fMakeClassicDyldInfo(true), fMakeCompressedDyldInfo(true), fAllowCpuSubtypeMismatches(false),
- fUseSimplifiedDylibReExports(false), fSaveTempFiles(false)
+ fUseSimplifiedDylibReExports(false), fObjCABIVersion2POverride(false), fSaveTempFiles(false)
{
this->checkForClassic(argc, argv);
this->parsePreCommandLineEnvironmentSettings();
case 6:
fReaderOptions.fMacVersionMin = ObjectFile::ReaderOptions::k10_6;
break;
+ case 7:
+ fReaderOptions.fMacVersionMin = ObjectFile::ReaderOptions::k10_7;
+ break;
default:
- fReaderOptions.fMacVersionMin = ObjectFile::ReaderOptions::k10_6;
+ fReaderOptions.fMacVersionMin = ObjectFile::ReaderOptions::k10_7;
break;
}
}
else if ( strcmp(arg, "-pie") == 0 ) {
fPositionIndependentExecutable = true;
}
+ else if ( strcmp(arg, "-no_pie") == 0 ) {
+ fDisablePositionIndependentExecutable = true;
+ }
else if ( strncmp(arg, "-reexport-l", 11) == 0 ) {
FileInfo info = findLibrary(&arg[11], true);
info.options.fReExport = true;
else if ( strcmp(arg, "-no_zero_fill_sections") == 0 ) {
fReaderOptions.fOptimizeZeroFill = false;
}
+ else if ( strcmp(arg, "-objc_abi_version") == 0 ) {
+ const char* version = argv[++i];
+ if ( version == NULL )
+ throw "-objc_abi_version missing version number";
+ if ( strcmp(version, "2") == 0 )
+ fObjCABIVersion2POverride = true;
+ else
+ warning("ignoring unrecognized argument (%s) to -objc_abi_version", version);
+ }
+ else if ( strcmp(arg, "-demangle") == 0 ) {
+ // <rdar://problem/8303976> add -demangle noop to ld64-97
+ }
else {
throwf("unknown option: %s", arg);
}
fMakeCompressedDyldInfo = false;
fMakeClassicDyldInfo = true;
}
+ // temporary until projects adopt -no_pie
+ if ( getenv("LD_NO_PIE") != NULL ) {
+ warning("LD_NO_PIE being used to disble building a position independent executable");
+ fDisablePositionIndependentExecutable = true;
+ }
sWarningsSideFilePath = getenv("LD_WARN_FILE");
}
// Mac OS X 10.5 and iPhoneOS 2.0 support LC_REEXPORT_DYLIB
if ( minOS(ObjectFile::ReaderOptions::k10_5, ObjectFile::ReaderOptions::k2_0) )
fUseSimplifiedDylibReExports = true;
+
+ // x86_64 for MacOSX 10.7 defaults to PIE
+ if ( (fArchitecture == CPU_TYPE_X86_64) && (fOutputKind == kDynamicExecutable)
+ && (fReaderOptions.fMacVersionMin >= ObjectFile::ReaderOptions::k10_7) ) {
+ fPositionIndependentExecutable = true;
+ }
}
void Options::checkIllegalOptionCombinations()
if ( strncmp(name, ".objc_class_name_", 17) == 0 ) {
// rdar://problem/4718189 map ObjC class names to new runtime names
switch (fArchitecture) {
+ case CPU_TYPE_I386:
+ // i386 only uses new symbols when using objc2 ABI
+ if ( !fObjCABIVersion2POverride )
+ break;
+ // when using objc2 ABI to same as archs below
case CPU_TYPE_POWERPC64:
case CPU_TYPE_X86_64:
case CPU_TYPE_ARM:
if ( fPositionIndependentExecutable ) {
switch ( fOutputKind ) {
case Options::kDynamicExecutable:
+ // -no_pie anywhere on command line disable PIE
+ if ( fDisablePositionIndependentExecutable )
+ fPositionIndependentExecutable = false;
+ break;
case Options::kPreload:
break;
case Options::kDynamicLibrary: