From a3d5d09fda7f36c2d68a369530798cd16d6af0b7 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Thu, 26 Sep 2019 23:23:50 +0900 Subject: [PATCH] Make linkerconfig support host By supplying two additional args for host running --root --vndk one can run linkerconfig and see the resulting ld.config.txt Some input files are found under /system/etc with . For example, out/target/vsoc_x86/system/etc/llndk.libraries.29.txt Bug: 141660636 Test: m linkerconfig Test: linkerconfig --root $OUT --vndk 29 Change-Id: I4aeab731a17764d7aa7e508842eae620f55f781e --- Android.bp | 1 + generator/include/linkerconfig/variableloader.h | 4 ++- generator/variableloader.cc | 33 ++++++++++--------- main.cc | 43 ++++++++++++++++++++++--- 4 files changed, 60 insertions(+), 21 deletions(-) diff --git a/Android.bp b/Android.bp index bcd5d47..3e62e89 100644 --- a/Android.bp +++ b/Android.bp @@ -25,6 +25,7 @@ cc_defaults { "libbase", "liblog", ], + host_supported: true, } cc_defaults { diff --git a/generator/include/linkerconfig/variableloader.h b/generator/include/linkerconfig/variableloader.h index 9807b29..b15c5a0 100644 --- a/generator/include/linkerconfig/variableloader.h +++ b/generator/include/linkerconfig/variableloader.h @@ -16,11 +16,13 @@ #pragma once +#include + namespace android { namespace linkerconfig { namespace generator { -void LoadVariables(); +void LoadVariables(const std::string& root); } // namespace generator } // namespace linkerconfig diff --git a/generator/variableloader.cc b/generator/variableloader.cc index a2b6e0f..4e649d0 100644 --- a/generator/variableloader.cc +++ b/generator/variableloader.cc @@ -61,21 +61,22 @@ void LoadVariableFromPartitionPath(std::string variable_name, std::string path) } } -void LoadPartitionPathVariables() { - LoadVariableFromPartitionPath("PRODUCT", "/product"); - LoadVariableFromPartitionPath("SYSTEM_EXT", "/system_ext"); +void LoadPartitionPathVariables(const std::string& root) { + // TODO(b/141714913): generalize path handling + LoadVariableFromPartitionPath("PRODUCT", root + "/product"); + LoadVariableFromPartitionPath("SYSTEM_EXT", root + "/system_ext"); } -void LoadLibraryListVariables() { - auto private_library_path = - "/system/etc/vndkprivate.libraries." + GetVendorVndkVersion() + ".txt"; +void LoadLibraryListVariables(const std::string& root) { + auto private_library_path = root + "/system/etc/vndkprivate.libraries." + + GetVendorVndkVersion() + ".txt"; auto llndk_library_path = - "/system/etc/llndk.libraries." + GetVendorVndkVersion() + ".txt"; + root + "/system/etc/llndk.libraries." + GetVendorVndkVersion() + ".txt"; auto vndksp_library_path = - "/system/etc/vndksp.libraries." + GetVendorVndkVersion() + ".txt"; - auto vndkcore_library_path = - "/system/etc/vndkcore.libraries." + GetVendorVndkVersion() + ".txt"; - auto sanitizer_library_path = "/system/etc/sanitizer.libraries.txt"; + root + "/system/etc/vndksp.libraries." + GetVendorVndkVersion() + ".txt"; + auto vndkcore_library_path = root + "/system/etc/vndkcore.libraries." + + GetVendorVndkVersion() + ".txt"; + auto sanitizer_library_path = root + "/system/etc/sanitizer.libraries.txt"; Variables::AddValue( "LLNDK_LIBRARIES", @@ -101,11 +102,13 @@ void LoadLibraryListVariables() { namespace android { namespace linkerconfig { namespace generator { -void LoadVariables() { + +void LoadVariables(const std::string& root) { LoadVndkVersionVariable(); - LoadPartitionPathVariables(); - LoadLibraryListVariables(); + LoadPartitionPathVariables(root); + LoadLibraryListVariables(root); } + } // namespace generator } // namespace linkerconfig -} // namespace android \ No newline at end of file +} // namespace android diff --git a/main.cc b/main.cc index 5362175..a7dc090 100644 --- a/main.cc +++ b/main.cc @@ -23,31 +23,49 @@ #include "linkerconfig/baseconfig.h" #include "linkerconfig/log.h" #include "linkerconfig/variableloader.h" +#include "linkerconfig/variables.h" namespace { const static struct option program_options[] = { {"target", required_argument, 0, 't'}, +#ifndef __ANROID__ + {"root", required_argument, 0, 'r'}, + {"vndk", required_argument, 0, 'v'}, +#endif {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; struct ProgramArgs { std::string target_file; + std::string root; + std::string vndk_version; }; [[noreturn]] void PrintUsage(int status = EXIT_SUCCESS) { - std::cerr << "Usage : linkerconfig [--target ] [--help]" + std::cerr << "Usage : linkerconfig [--target ]" +#ifndef __ANDROID__ + " --root " + " --vndk " +#endif + " [--help]" << std::endl; exit(status); } bool ParseArgs(int argc, char* argv[], ProgramArgs* args) { int parse_result; - while ((parse_result = - getopt_long(argc, argv, "th:", program_options, NULL)) != -1) { + while ((parse_result = getopt_long( + argc, argv, "t:r:v:h", program_options, NULL)) != -1) { switch (parse_result) { case 't': args->target_file = optarg; break; + case 'r': + args->root = optarg; + break; + case 'v': + args->vndk_version = optarg; + break; case 'h': PrintUsage(); default: @@ -73,6 +91,7 @@ android::linkerconfig::modules::Configuration GetConfiguration() { return android::linkerconfig::contents::CreateBaseConfiguration(); } +#ifdef __ANDROID__ struct CombinedLogger { android::base::LogdLogger logd; @@ -83,11 +102,17 @@ struct CombinedLogger { KernelLogger(id, severity, tag, file, line, message); } }; +#endif } // namespace int main(int argc, char* argv[]) { - android::base::InitLogging(argv, CombinedLogger()); + android::base::InitLogging(argv +#ifdef __ANDROID__ + , + CombinedLogger() +#endif + ); ProgramArgs args; @@ -107,7 +132,15 @@ int main(int argc, char* argv[]) { out = &file_out; } - android::linkerconfig::generator::LoadVariables(); +#ifndef __ANDROID__ + if (args.root == "" || args.vndk_version == "") { + PrintUsage(); + } + android::linkerconfig::modules::Variables::AddValue("ro.vndk.version", + args.vndk_version); +#endif + + android::linkerconfig::generator::LoadVariables(args.root); auto config = GetConfiguration(); android::linkerconfig::modules::ConfigWriter config_writer; -- 2.11.0