IEnumerable <Config> GetLinkerConfigs() { var abis = new Dictionary <string, InputFiles> (StringComparer.Ordinal); ITaskItem[] dsos = ApplicationSharedLibraries; foreach (ITaskItem item in dsos) { string abi = item.GetMetadata("abi"); abis [abi] = GatherFilesForABI(item.ItemSpec, abi, ObjectFiles); } foreach (var kvp in abis) { string abi = kvp.Key; InputFiles inputs = kvp.Value; AndroidTargetArch arch; var linkerArgs = new List <string> { "--unresolved-symbols=ignore-in-shared-libs", "--export-dynamic", "-soname", "libxamarin-app.so", "-z", "relro", "-z", "noexecstack", "--enable-new-dtags", "--eh-frame-hdr", "-shared", "--build-id", "--warn-shared-textrel", "--fatal-warnings", "-o", QuoteFileName(inputs.OutputSharedLibrary), }; string elf_arch; switch (abi) { case "armeabi-v7a": arch = AndroidTargetArch.Arm; linkerArgs.Add("-X"); elf_arch = "armelf_linux_eabi"; break; case "arm64": case "arm64-v8a": case "aarch64": arch = AndroidTargetArch.Arm64; linkerArgs.Add("--fix-cortex-a53-843419"); elf_arch = "aarch64linux"; break; case "x86": arch = AndroidTargetArch.X86; elf_arch = "elf_i386"; break; case "x86_64": arch = AndroidTargetArch.X86_64; elf_arch = "elf_x86_64"; break; default: throw new NotSupportedException($"Unsupported Android target architecture ABI: {abi}"); } linkerArgs.Add("-m"); linkerArgs.Add(elf_arch); foreach (string file in inputs.ObjectFiles) { linkerArgs.Add(QuoteFileName(file)); } string ld = MonoAndroidHelper.GetExecutablePath(AndroidBinUtilsDirectory, $"{NdkUtil.GetNdkToolchainPrefix (arch, false)}ld"); yield return(new Config { LinkerPath = Path.Combine(AndroidBinUtilsDirectory, ld), LinkerOptions = String.Join(" ", linkerArgs), OutputSharedLibrary = inputs.OutputSharedLibrary, }); } }