浏览代码

fix: cross-compilation for android on linux

add `-nodefaultlibs` when cross-linking for android to prevent clang from linking with libgcc

check build mode first before calling `init_android_values` to prevent printing a message
that tells the user to set `-android-keystore` if its not set and build mode is exe
IllusionMan1212 5 月之前
父节点
当前提交
44950d5f37
共有 2 个文件被更改,包括 26 次插入25 次删除
  1. 24 24
      src/build_settings.cpp
  2. 2 1
      src/linker.cpp

+ 24 - 24
src/build_settings.cpp

@@ -1781,6 +1781,30 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
 		bc->ODIN_WINDOWS_SUBSYSTEM = windows_subsystem_names[Windows_Subsystem_CONSOLE];
 	}
 
+	if (subtarget == Subtarget_Android) {
+		switch (build_context.build_mode) {
+		case BuildMode_DynamicLibrary:
+		case BuildMode_Object:
+		case BuildMode_Assembly:
+		case BuildMode_LLVM_IR:
+			break;
+		default:
+		case BuildMode_Executable:
+		case BuildMode_StaticLibrary:
+			if ((build_context.command_kind & Command__does_build) != 0) {
+				gb_printf_err("Unsupported -build-mode for -subtarget:android\n");
+				gb_printf_err("\tCurrently only supporting: \n");
+				// gb_printf_err("\t\texe\n");
+				gb_printf_err("\t\tshared\n");
+				gb_printf_err("\t\tobject\n");
+				gb_printf_err("\t\tassembly\n");
+				gb_printf_err("\t\tllvm-ir\n");
+				gb_exit(1);
+			}
+			break;
+		}
+	}
+
 	if (metrics->os == TargetOs_darwin && subtarget == Subtarget_iOS) {
 		switch (metrics->arch) {
 		case TargetArch_arm64:
@@ -1900,30 +1924,6 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
 	if (bc->metrics.os == TargetOs_freestanding) {
 		bc->ODIN_DEFAULT_TO_NIL_ALLOCATOR = !bc->ODIN_DEFAULT_TO_PANIC_ALLOCATOR;
 	}
-
-	if (subtarget == Subtarget_Android) {
-		switch (build_context.build_mode) {
-		case BuildMode_DynamicLibrary:
-		case BuildMode_Object:
-		case BuildMode_Assembly:
-		case BuildMode_LLVM_IR:
-			break;
-		default:
-		case BuildMode_Executable:
-		case BuildMode_StaticLibrary:
-			if ((build_context.command_kind & Command__does_build) != 0) {
-				gb_printf_err("Unsupported -build-mode for -subtarget:android\n");
-				gb_printf_err("\tCurrently only supporting: \n");
-				// gb_printf_err("\t\texe\n");
-				gb_printf_err("\t\tshared\n");
-				gb_printf_err("\t\tobject\n");
-				gb_printf_err("\t\tassembly\n");
-				gb_printf_err("\t\tllvm-ir\n");
-				gb_exit(1);
-			}
-			break;
-		}
-	}
 }
 
 #if defined(GB_SYSTEM_WINDOWS)

+ 2 - 1
src/linker.cpp

@@ -143,7 +143,7 @@ gb_internal i32 linker_stage(LinkerData *gen) {
 			LIT(target_arch_names[build_context.metrics.arch])
 		);
 #endif
-	} else if (build_context.cross_compiling && build_context.different_os) {
+	} else if (build_context.cross_compiling) {
 		switch (selected_subtarget) {
 		case Subtarget_Android:
 			is_cross_linking = true;
@@ -840,6 +840,7 @@ try_cross_linking:;
 
 			if (is_android) {
 				link_command_line = gb_string_append_fmt(link_command_line, " --target=aarch64-linux-android%d ", ODIN_ANDROID_API_LEVEL);
+				link_command_line = gb_string_appendc(link_command_line, " -nodefaultlibs");
 			}
 			link_command_line = gb_string_appendc(link_command_line, " -Wno-unused-command-line-argument ");
 			link_command_line = gb_string_appendc(link_command_line, object_files);