diff options
Diffstat (limited to 'linker/linker_main.cpp')
-rw-r--r-- | linker/linker_main.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/linker/linker_main.cpp b/linker/linker_main.cpp index 1a0d1642b..a8741527e 100644 --- a/linker/linker_main.cpp +++ b/linker/linker_main.cpp @@ -197,12 +197,16 @@ extern "C" int __system_properties_init(void); static const char* get_executable_path() { static std::string executable_path; if (executable_path.empty()) { - char path[PATH_MAX]; - ssize_t path_len = readlink("/proc/self/exe", path, sizeof(path)); - if (path_len == -1 || path_len >= static_cast<ssize_t>(sizeof(path))) { - async_safe_fatal("readlink('/proc/self/exe') failed: %s", strerror(errno)); + if (!is_init()) { + char path[PATH_MAX]; + ssize_t path_len = readlink("/proc/self/exe", path, sizeof(path)); + if (path_len == -1 || path_len >= static_cast<ssize_t>(sizeof(path))) { + async_safe_fatal("readlink('/proc/self/exe') failed: %s", strerror(errno)); + } + executable_path = std::string(path, path_len); + } else { + executable_path = "/init"; } - executable_path = std::string(path, path_len); } return executable_path.c_str(); @@ -288,8 +292,14 @@ static ElfW(Addr) linker_main(KernelArgumentBlock& args) { // Stat "/proc/self/exe" instead of executable_path because // the executable could be unlinked by this point and it should // not cause a crash (see http://b/31084669) - if (TEMP_FAILURE_RETRY(stat("/proc/self/exe", &file_stat)) != 0) { - async_safe_fatal("unable to stat \"/proc/self/exe\": %s", strerror(errno)); + if (!is_init()) { + if (TEMP_FAILURE_RETRY(stat("/proc/self/exe", &file_stat)) != 0) { + async_safe_fatal("unable to stat \"/proc/self/exe\": %s", strerror(errno)); + } + } else { + // /proc fs is not mounted when init starts. Therefore we can't use + // /proc/self/exe for init. + stat("/init", &file_stat); } const char* executable_path = get_executable_path(); |