summaryrefslogtreecommitdiff
path: root/init/builtins.cpp
diff options
context:
space:
mode:
authorKiyoung Kim <kiyoungkim@google.com>2019-12-16 14:31:04 +0900
committerKiyoung Kim <kiyoungkim@google.com>2019-12-20 09:46:59 +0900
commit7c0aa789991e2fbbbf3d34c8d44f52bf036da55d (patch)
treef3e65ee3bc34cb80a158ee06be9e9978c1ba9330 /init/builtins.cpp
parent0b5810f0dcf4e2c96834016532707ab3a7b20bd0 (diff)
Generate linkerconfig per mount namespaces
There are two namespaces from init - bootstrap and default - and those will have different set of APEX modules. To support difference between two namespaces, linker config should be generated per namespace and each namespace should use its own linker configuration. As a first step of the work, this change will create different mount point for each namespace, and re-generate linker config after APEX mount from each namespaces. Bug: 144664390 Test: m -j passed & tested from cuttlefish Change-Id: Iac2e222376ec4b0ced6c29eed18b21d39ff0b1ba
Diffstat (limited to 'init/builtins.cpp')
-rw-r--r--init/builtins.cpp44
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}}},