diff options
Diffstat (limited to 'init/builtins.cpp')
| -rw-r--r-- | init/builtins.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/init/builtins.cpp b/init/builtins.cpp index 62a19abc57..3c32d8ba2a 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -59,6 +59,7 @@ #include <fs_mgr.h> #include <fscrypt/fscrypt.h> #include <libgsi/libgsi.h> +#include <logwrap/logwrap.h> #include <selinux/android.h> #include <selinux/label.h> #include <selinux/selinux.h> @@ -1176,6 +1177,42 @@ static Result<void> do_mark_post_data(const BuiltinArguments& args) { return {}; } +static Result<void> GenerateLinkerConfiguration() { + const char* linkerconfig_binary = "/system/bin/linkerconfig"; + const char* linkerconfig_target = "/linkerconfig/ld.config.txt"; + const char* arguments[] = {linkerconfig_binary, "--target", linkerconfig_target}; + + if (logwrap_fork_execvp(arraysize(arguments), arguments, nullptr, false, LOG_KLOG, false, + nullptr) != 0) { + return ErrnoError() << "failed to execute linkerconfig"; + } + + mode_t mode = get_mode("0444"); + if (fchmodat(AT_FDCWD, linkerconfig_target, mode, AT_SYMLINK_NOFOLLOW) < 0) { + return ErrnoErrorIgnoreEnoent() << "fchmodat() failed"; + } + + LOG(INFO) << "linkerconfig generated " << linkerconfig_target + << " with mounted APEX modules info"; + + return {}; +} + +static bool IsApexUpdatable() { + static bool updatable = android::sysprop::ApexProperties::updatable().value_or(false); + return updatable; +} + +static Result<void> do_update_linker_config(const BuiltinArguments&) { + // If APEX is not updatable, then all APEX information are already included in the first + // linker config generation, so there is no need to update linker configuration again. + if (IsApexUpdatable()) { + return GenerateLinkerConfiguration(); + } + + return {}; +} + static Result<void> parse_apex_configs() { glob_t glob_result; static constexpr char glob_pattern[] = "/apex/*/etc/*.rc"; @@ -1251,6 +1288,12 @@ static Result<void> do_perform_apex_config(const BuiltinArguments& args) { if (!parse_configs) { return parse_configs.error(); } + + auto update_linker_config = do_update_linker_config(args); + if (!update_linker_config) { + return update_linker_config.error(); + } + return {}; } @@ -1317,6 +1360,7 @@ const BuiltinFunctionMap& GetBuiltinFunctionMap() { {"perform_apex_config", {0, 0, {false, do_perform_apex_config}}}, {"umount", {1, 1, {false, do_umount}}}, {"umount_all", {1, 1, {false, do_umount_all}}}, + {"update_linker_config", {0, 0, {false, do_update_linker_config}}}, {"readahead", {1, 2, {true, do_readahead}}}, {"remount_userdata", {0, 0, {false, do_remount_userdata}}}, {"restart", {1, 1, {false, do_restart}}}, |
