hosted.c (4395B)
1 #include "os/hosted_internal.h" 2 3 #include <stdio.h> 4 5 static unsigned android_api_level(KitTargetSpec target) { 6 unsigned api = target.os_version_major ? target.os_version_major : 21u; 7 return api < 21u ? 21u : api; 8 } 9 10 static int hosted_add_android_defines(const KitOsHostedRequest* req, 11 KitOsHostedPlan* plan, 12 KitTargetSpec target) { 13 char api_buf[4]; 14 int n = snprintf(api_buf, sizeof api_buf, "%u", android_api_level(target)); 15 if (n < 0 || (unsigned)n >= sizeof api_buf) return 1; 16 if (kit_os_hosted_add_clang_compat_defines(plan) != 0 || 17 kit_os_hosted_add_define(plan, "__ANDROID__", "1") != 0 || 18 kit_os_hosted_add_define(plan, "__BIONIC__", "1") != 0 || 19 kit_os_hosted_add_define(plan, "__linux__", "1") != 0 || 20 kit_os_hosted_add_define(plan, "__linux", "1") != 0 || 21 kit_os_hosted_add_define(plan, "linux", "1") != 0 || 22 kit_os_hosted_add_define(plan, "__ELF__", "1") != 0 || 23 kit_os_hosted_add_define_owned(plan, req->host, req->host_user, 24 "__ANDROID_API__", api_buf) != 0) 25 return 1; 26 return 0; 27 } 28 29 static int hosted_resolve_android(const KitOsHostedRequest* req, 30 const KitOsHostedDirs* dirs, 31 KitOsHostedPlan* plan) { 32 if (req->target.arch != KIT_ARCH_ARM_64) { 33 kit_os_hosted_errf(req->host, req->host_user, req->tool, 34 "Android hosted profile supports aarch64 only"); 35 return 1; 36 } 37 if (req->static_link) { 38 kit_os_hosted_errf(req->host, req->host_user, req->tool, 39 "Android hosted profile supports dynamic links only"); 40 return 1; 41 } 42 if (dirs->nlibdirs == 0) { 43 kit_os_hosted_errf(req->host, req->host_user, req->tool, 44 "Android hosted profile requires --sysroot or " 45 "KIT_SYSROOT"); 46 return 1; 47 } 48 plan->profile_name = 49 req->shared_link ? "android-bionic-shared" : "android-bionic-dynamic"; 50 if (!req->shared_link) plan->interp_path = "/system/bin/linker64"; 51 if (hosted_add_android_defines(req, plan, req->target) != 0 || 52 kit_os_hosted_add_incdirs(plan, req->host, req->host_user, dirs) != 0) { 53 kit_os_hosted_errf(req->host, req->host_user, req->tool, "out of memory"); 54 return 1; 55 } 56 if (!req->link_inputs) return 0; 57 if (kit_os_hosted_add_required_search( 58 plan->before, &plan->nbefore, KIT_OS_HOSTED_MAX_BEFORE, req, dirs, 59 req->shared_link ? "crtbegin_so.o" : "crtbegin_dynamic.o", 60 KIT_OS_HOSTED_INPUT_OBJECT) != 0) 61 return 1; 62 if (kit_os_hosted_add_required_search( 63 plan->after, &plan->nafter, KIT_OS_HOSTED_MAX_AFTER, req, dirs, 64 "libc.so", KIT_OS_HOSTED_INPUT_DSO) != 0 || 65 kit_os_hosted_add_required_search( 66 plan->after, &plan->nafter, KIT_OS_HOSTED_MAX_AFTER, req, dirs, 67 "libdl.so", KIT_OS_HOSTED_INPUT_DSO) != 0) 68 return 1; 69 if (kit_os_hosted_add_required_search( 70 plan->final, &plan->nfinal, KIT_OS_HOSTED_MAX_FINAL, req, dirs, 71 req->shared_link ? "crtend_so.o" : "crtend_android.o", 72 KIT_OS_HOSTED_INPUT_OBJECT) != 0) 73 return 1; 74 return 0; 75 } 76 77 static int hosted_sysroot_layout_android(KitOsHostedDirs* dirs, 78 KitTargetSpec target, 79 const char* sysroot) { 80 char api_dir[64]; 81 int n; 82 if (target.arch != KIT_ARCH_ARM_64) return 0; 83 n = snprintf(api_dir, sizeof api_dir, "usr/lib/aarch64-linux-android/%u", 84 android_api_level(target)); 85 if (n < 0 || (unsigned)n >= sizeof api_dir) return 1; 86 if (kit_os_hosted_dirs_add_inc_join(dirs, sysroot, "usr/include") != 0 || 87 kit_os_hosted_dirs_add_inc_join(dirs, sysroot, 88 "usr/include/aarch64-linux-android") != 89 0 || 90 kit_os_hosted_dirs_add_lib_join(dirs, sysroot, api_dir) != 0 || 91 kit_os_hosted_dirs_add_lib_join(dirs, sysroot, 92 "usr/lib/aarch64-linux-android") != 0) 93 return 1; 94 return 0; 95 } 96 97 const KitOsHostedOps kit_os_android_hosted_ops = { 98 .obj = KIT_OBJ_ELF, 99 .default_profile = 1, 100 .needs_sysroot_libdir = 0, 101 .shared_uses_hosted = 1, 102 .resolve = hosted_resolve_android, 103 .sysroot_layout = hosted_sysroot_layout_android, 104 };