diff --git a/swift-driver/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift b/swift-driver/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift
index 06a29d8..5cbfddd 100644
--- a/swift-driver/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift
+++ b/swift-driver/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift
@@ -14,6 +14,7 @@ import SwiftOptions
 
 extension GenericUnixToolchain {
   private func defaultLinker(for targetTriple: Triple) -> String? {
+    if targetTriple.environment == .android { return "lld" }
     switch targetTriple.arch {
     case .arm, .aarch64, .armeb, .thumb, .thumbeb:
       // BFD linker has issues wrt relocation of the protocol conformance
@@ -133,8 +137,7 @@ extension GenericUnixToolchain {
         isShared: hasRuntimeArgs
       )
 
-      if hasRuntimeArgs && targetTriple.environment != .android &&
-          toolchainStdlibRpath {
+      if hasRuntimeArgs && toolchainStdlibRpath {
         // FIXME: We probably shouldn't be adding an rpath here unless we know
         //        ahead of time the standard library won't be copied.
         for path in runtimePaths {
diff --git a/swift-driver/Utilities/build-script-helper.py b/swift-driver/Utilities/build-script-helper.py
index e986475..83916c3 100755
--- a/swift-driver/Utilities/build-script-helper.py
+++ b/swift-driver/Utilities/build-script-helper.py
@@ -11,6 +11,7 @@ import shutil
 import subprocess
 import sys
 import errno
+import re
 
 if platform.system() == 'Darwin':
     shared_lib_ext = '.dylib'
@@ -96,8 +97,13 @@ def get_swiftpm_options(args):
       os.path.join(args.toolchain, 'lib', 'swift', 'Block'),
     ]
 
-    if 'ANDROID_DATA' in os.environ:
+    if args.cross_compile_hosts:
+      swiftpm_args += [ '--destination', args.cross_compile_config ]
+
+    if 'ANDROID_DATA' in os.environ or (args.cross_compile_hosts and re.match(
+        'android-', args.cross_compile_hosts[0])):
       swiftpm_args += [
+        '-Xlinker', '-landroid-spawn',
         '-Xlinker', '-rpath', '-Xlinker', '$ORIGIN/../lib/swift/android',
         # SwiftPM will otherwise try to compile against GNU strerror_r on
         # Android and fail.
@@ -177,8 +185,13 @@ def handle_invocation(args):
   if args.sysroot:
     env['SDKROOT'] = args.sysroot
 
+  env['SWIFT_EXEC'] = '%sc' % (swift_exec)
+
   if args.action == 'build':
-    build_using_cmake(args, toolchain_bin, args.build_path, targets)
+    if args.cross_compile_hosts and not re.match('-macosx', args.cross_compile_hosts[0]):
+      swiftpm('build', swift_exec, swiftpm_args, env)
+    else:
+      build_using_cmake(args, toolchain_bin, args.build_path, targets)
 
   elif args.action == 'clean':
     print('Cleaning ' + args.build_path)
@@ -188,7 +201,6 @@ def handle_invocation(args):
         tool_path = os.path.join(toolchain_bin, tool)
         if os.path.exists(tool_path):
             env['SWIFT_DRIVER_' + tool.upper().replace('-','_') + '_EXEC'] = '%s' % (tool_path)
-    env['SWIFT_EXEC'] = '%sc' % (swift_exec)
     test_args = swiftpm_args
     test_args += ['-Xswiftc', '-enable-testing']
     if should_test_parallel():
@@ -205,16 +217,17 @@ def handle_invocation(args):
     else:
       bin_path = swiftpm_bin_path(swift_exec, swiftpm_args, env)
       swiftpm('build', swift_exec, swiftpm_args, env)
-      non_darwin_install(bin_path, args.toolchain, args.verbose)
+      non_darwin_install(args, bin_path)
   else:
     assert False, 'unknown action \'{}\''.format(args.action)
 
 # Installation flow for non-darwin platforms, only copies over swift-driver and swift-help
 # TODO: Unify CMake-based installation flow used on Darwin with this
-def non_darwin_install(swiftpm_bin_path, toolchain, verbose):
-  toolchain_bin = os.path.join(toolchain, 'bin')
-  for exe in executables_to_install:
-    install_binary(exe, swiftpm_bin_path, toolchain_bin, verbose)
+def non_darwin_install(args, swiftpm_bin_path):
+  for prefix in args.install_prefixes:
+    prefix_bin = os.path.join(prefix, 'bin')
+    for exe in executables_to_install:
+      install_binary(exe, swiftpm_bin_path, prefix_bin, args.verbose)
 
 def install(args, build_dir, targets):
   # Construct and install universal swift-driver, swift-help executables
@@ -581,6 +594,10 @@ def main():
         nargs='*',
         help='List of cross compile hosts targets.',
         default=[])
+    parser.add_argument(
+        '--cross-compile-config',
+        metavar='PATH',
+        help="A JSON SPM config file with Swift flags for cross-compilation")
     parser.add_argument('--ninja-bin', metavar='PATH', help='ninja binary to use for testing')
     parser.add_argument('--cmake-bin', metavar='PATH', help='cmake binary to use for building')
     parser.add_argument('--build-path', metavar='PATH', default='.build', help='build in the given path')
@@ -617,9 +634,6 @@ def main():
   else:
     args.sysroot = None
 
-  if args.cross_compile_hosts and not all('apple-macos' in target for target in args.cross_compile_hosts):
-    error('Cross-compilation is currently only supported for the Darwin platform.')
-
   if args.cross_compile_hosts and args.local_compiler_build:
     error('Cross-compilation is currently not supported for the local compiler installation')
 
