From 7c7000347a51f577f44024e6c8e1a7bac626ac05 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 12 Sep 2024 18:49:17 +0200 Subject: [PATCH 1/3] [dotnet] Change the usage of the classic linker to be opt-in. Fixes https://github.com/xamarin/xamarin-macios/issues/20711. --- dotnet/targets/Xamarin.Shared.Sdk.targets | 4 ++-- tools/common/Application.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index b1b307862a84..5c624f08312a 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -1630,8 +1630,8 @@ <_AllLinkerFlags Condition="'$(_ExportSymbolsExplicitly)' != 'true'" Include="@(_ProcessedReferenceNativeSymbol->'-u%(Identity)')" /> - <_AllLinkerFlags Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(_XcodeVersion)', '15.0')) And '$(_UseClassicLinker)' != 'false'" Include="-Xlinker" /> - <_AllLinkerFlags Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(_XcodeVersion)', '15.0')) And '$(_UseClassicLinker)' != 'false'" Include="-ld_classic" /> + <_AllLinkerFlags Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(_XcodeVersion)', '15.0')) And '$(_UseClassicLinker)' != 'true'" Include="-Xlinker" /> + <_AllLinkerFlags Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(_XcodeVersion)', '15.0')) And '$(_UseClassicLinker)' != 'true'" Include="-ld_classic" /> Date: Sat, 14 Sep 2024 00:55:22 +0200 Subject: [PATCH 2/3] Only use the new linker in Xcode 16+ --- dotnet/targets/Xamarin.Shared.Sdk.targets | 12 +++++++++--- tools/common/Application.cs | 3 +-- tools/common/CompilerFlags.cs | 5 +++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index 5c624f08312a..61b32c561f43 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -1625,13 +1625,19 @@ + + + + <_UseClassicLinker Condition="'$(_UseClassicLinker)' == '' And $([MSBuild]::VersionGreaterThanOrEquals('$(_XcodeVersion)', '16.0'))">false + <_UseClassicLinker Condition="'$(_UseClassicLinker)' == '' And $([MSBuild]::VersionGreaterThanOrEquals('$(_XcodeVersion)', '15.0'))">true + + <_AllLinkerFlags Include="@(_AssemblyLinkerFlags);@(_MainLinkerFlags);@(_CustomLinkFlags)" /> <_AllLinkerFlags Condition="'$(_ExportSymbolsExplicitly)' != 'true'" Include="@(_ProcessedReferenceNativeSymbol->'-u%(Identity)')" /> - - <_AllLinkerFlags Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(_XcodeVersion)', '15.0')) And '$(_UseClassicLinker)' != 'true'" Include="-Xlinker" /> - <_AllLinkerFlags Condition="$([MSBuild]::VersionGreaterThanOrEquals('$(_XcodeVersion)', '15.0')) And '$(_UseClassicLinker)' != 'true'" Include="-ld_classic" /> + <_AllLinkerFlags Condition="'$(_UseClassicLinker)' == 'true'" Include="-Xlinker" /> + <_AllLinkerFlags Condition="'$(_UseClassicLinker)' == 'true'" Include="-ld_classic" /> args) } } - // check if needs to be removed: https://github.com/xamarin/xamarin-macios/issues/18693 - if (Driver.XcodeVersion.Major >= 15 && !Application.DisableAutomaticLinkerSelection) { + // There are known bugs in the classic linker with Xcode 15, so keep use the classic linker in that case + // In Xcode 16 we don't know of any problems for now, so enable the new linker by default + if (Driver.XcodeVersion.Major >= 15 && Driver.XcodeVersion.Major < 16 && !Application.DisableAutomaticLinkerSelection) { args.Insert (0, "-Xlinker"); args.Insert (1, "-ld_classic"); } From a1592c8f45d09586f96aba5341f0d1b5de528e9f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 16 Sep 2024 09:19:57 +0200 Subject: [PATCH 3/3] Fix build --- tools/common/Application.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/common/Application.cs b/tools/common/Application.cs index 5b5f38098feb..19685c7a962c 100644 --- a/tools/common/Application.cs +++ b/tools/common/Application.cs @@ -174,7 +174,7 @@ public bool IsDefaultMarshalManagedExceptionMode { public bool SkipMarkingNSObjectsInUserAssemblies { get; set; } - public bool DisableAutomaticLinkerSelection { get; set; }; + public bool DisableAutomaticLinkerSelection { get; set; } // assembly_build_targets describes what kind of native code each assembly should be compiled into for mobile targets (iOS, tvOS, watchOS). // An assembly can be compiled into: static object (.o), dynamic library (.dylib) or a framework (.framework).