Merge "split first stage init into a separate executable"

am: 574533a657

Change-Id: Ib26d1b54dc654883eaccd1d5dc9575cfac1262a5
This commit is contained in:
Tom Cherry 2018-08-07 10:48:01 -07:00 committed by android-build-merger
commit fc464cabcc
5 changed files with 29 additions and 58 deletions

View file

@ -92,6 +92,7 @@ cc_defaults {
cc_library_static {
name: "libinit",
recovery_available: true,
defaults: ["init_defaults"],
srcs: [
"action.cpp",
@ -107,7 +108,6 @@ cc_library_static {
"first_stage_mount.cpp",
"import_parser.cpp",
"init.cpp",
"init_first_stage.cpp",
"keychords.cpp",
"modalias_handler.cpp",
"parser.cpp",
@ -138,29 +138,21 @@ cc_library_static {
},
}
/*
This is not yet ready, see the below TODOs for what is missing
cc_binary {
// TODO: Missing,
//LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
//LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)
name: "init",
name: "init_second_stage",
recovery_available: true,
stem: "init",
defaults: ["init_defaults"],
static_libs: ["libinit"],
required: [
"e2fsdroid",
"mke2fs",
"sload_f2fs",
"make_f2fs",
],
static_executable: true,
srcs: ["main.cpp"],
symlinks: [
"sbin/ueventd",
],
symlinks: ["ueventd"],
}
*/
// Tests
// ------------------------------------------------------------------------------

View file

@ -41,35 +41,35 @@ init_cflags += \
include $(CLEAR_VARS)
LOCAL_CPPFLAGS := $(init_cflags)
LOCAL_SRC_FILES := main.cpp
LOCAL_SRC_FILES := \
devices.cpp \
first_stage_mount.cpp \
init_first_stage.cpp \
reboot_utils.cpp \
selinux.cpp \
uevent_listener.cpp \
util.cpp \
LOCAL_MODULE:= init
LOCAL_MODULE := init
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)
LOCAL_STATIC_LIBRARIES := \
libinit \
libbootloader_message \
libfs_mgr \
libfec \
libfec_rs \
libhidl-gen-utils \
libsquashfs_utils \
liblogwrap \
libext4_utils \
libseccomp_policy \
libcrypto_utils \
libsparse \
libprocessgroup \
libavb \
libkeyutils \
libprotobuf-cpp-lite \
libpropertyinfoserializer \
libpropertyinfoparser \
liblp \
shared_libs := \
libcutils \
libbase \
liblog \
@ -77,27 +77,11 @@ shared_libs := \
libdl \
libz \
libselinux \
ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
# init is static executable for non-system-as-root devices, because the dynamic linker
# and shared libs are not available before /system is mounted, but init has to run
# before the partition is mounted.
LOCAL_STATIC_LIBRARIES += $(shared_libs) libc++_static
LOCAL_FORCE_STATIC_EXECUTABLE := true
else
LOCAL_SHARED_LIBRARIES := $(shared_libs) libc++
endif
shared_libs :=
libcap \
LOCAL_REQUIRED_MODULES := \
e2fsdroid \
mke2fs \
sload_f2fs \
make_f2fs \
# Create symlinks.
LOCAL_POST_INSTALL_CMD := $(hide) mkdir -p $(TARGET_ROOT_OUT)/sbin; \
ln -sf ../init $(TARGET_ROOT_OUT)/sbin/ueventd; \
init_second_stage \
init_second_stage.recovery \
LOCAL_SANITIZE := signed-integer-overflow
include $(BUILD_EXECUTABLE)

View file

@ -565,8 +565,6 @@ static void InitKernelLogging(char* argv[]) {
android::base::InitLogging(argv, &android::base::KernelLogger, InitAborter);
}
int first_stage_main(int argc, char** argv);
int main(int argc, char** argv) {
if (!strcmp(basename(argv[0]), "ueventd")) {
return ueventd_main(argc, argv);
@ -578,10 +576,6 @@ int main(int argc, char** argv) {
return SubcontextMain(argc, argv, &function_map);
}
if (getenv("INIT_SECOND_STAGE") == nullptr) {
return first_stage_main(argc, argv);
}
if (REBOOT_BOOTLOADER_ON_PANIC) {
InstallRebootSignalHandlers();
}
@ -617,7 +611,6 @@ int main(int argc, char** argv) {
if (avb_version) property_set("ro.boot.avb_version", avb_version);
// Clean up our environment.
unsetenv("INIT_SECOND_STAGE");
unsetenv("INIT_STARTED_AT");
unsetenv("INIT_SELINUX_TOOK");
unsetenv("INIT_AVB_VERSION");

View file

@ -51,7 +51,7 @@ static void GlobalSeccomp() {
});
}
int first_stage_main(int argc, char** argv) {
int main(int argc, char** argv) {
if (REBOOT_BOOTLOADER_ON_PANIC) {
InstallRebootSignalHandlers();
}
@ -141,17 +141,15 @@ int first_stage_main(int argc, char** argv) {
// Unneeded? It's an ext4 file system so shouldn't it have the right domain already?
// We're in the kernel domain, so re-exec init to transition to the init domain now
// that the SELinux policy has been loaded.
if (selinux_android_restorecon("/init", 0) == -1) {
PLOG(FATAL) << "restorecon failed of /init failed";
if (selinux_android_restorecon("/system/bin/init", 0) == -1) {
PLOG(FATAL) << "restorecon failed of /system/bin/init failed";
}
setenv("INIT_SECOND_STAGE", "true", 1);
static constexpr uint32_t kNanosecondsPerMillisecond = 1e6;
uint64_t start_ms = start_time.time_since_epoch().count() / kNanosecondsPerMillisecond;
setenv("INIT_STARTED_AT", std::to_string(start_ms).c_str(), 1);
const char* path = argv[0];
const char* path = "/system/bin/init";
const char* args[] = {path, nullptr};
execv(path, const_cast<char**>(args));
@ -164,3 +162,7 @@ int first_stage_main(int argc, char** argv) {
} // namespace init
} // namespace android
int main(int argc, char** argv) {
return android::init::main(argc, argv);
}

View file

@ -751,7 +751,7 @@ on property:security.perf_harden=1
## Daemon processes to be run by init.
##
service ueventd /sbin/ueventd
service ueventd /system/bin/ueventd
class core
critical
seclabel u:r:ueventd:s0