kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 };