diff options
-rw-r--r-- | linker/linker.cpp | 7 | ||||
-rw-r--r-- | tests/dlfcn_test.cpp | 4 |
2 files changed, 11 insertions, 0 deletions
diff --git a/linker/linker.cpp b/linker/linker.cpp index b59df7302..324f3ef23 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -1162,6 +1162,13 @@ static int open_library(android_namespace_t* ns, } } +#if !defined(__ANDROID_APEX__) + if (fd == -1) { + std::vector<std::string> bootstrap_paths = { std::string(kSystemLibDir) + "/bootstrap" }; + fd = open_library_on_paths(zip_archive_cache, name, file_offset, bootstrap_paths, realpath); + } +#endif + if (fd == -1) { fd = open_library_on_paths(zip_archive_cache, name, file_offset, ns->get_default_library_paths(), realpath); } diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp index f3be9883d..7ff553d49 100644 --- a/tests/dlfcn_test.cpp +++ b/tests/dlfcn_test.cpp @@ -999,6 +999,7 @@ TEST(dlfcn, dlopen_executable_by_absolute_path) { #error "Unknown architecture" #endif #define PATH_TO_LIBC PATH_TO_SYSTEM_LIB "libc.so" +#define PATH_TO_BOOTSTRAP_LIBC PATH_TO_SYSTEM_LIB "bootstrap/libc.so" #define ALTERNATE_PATH_TO_LIBC ALTERNATE_PATH_TO_SYSTEM_LIB "libc.so" TEST(dlfcn, dladdr_libc) { @@ -1018,6 +1019,9 @@ TEST(dlfcn, dladdr_libc) { sizeof(ALTERNATE_PATH_TO_SYSTEM_LIB) - 1) == 0) { // Platform with emulated architecture. Symlink on ARC++. ASSERT_TRUE(realpath(ALTERNATE_PATH_TO_LIBC, libc_realpath) == libc_realpath); + } else if (strncmp(PATH_TO_BOOTSTRAP_LIBC, info.dli_fname, + sizeof(PATH_TO_BOOTSTRAP_LIBC) - 1) == 0) { + ASSERT_TRUE(realpath(PATH_TO_BOOTSTRAP_LIBC, libc_realpath) == libc_realpath); } else { // /system/lib is symlink when this test is executed on host. ASSERT_TRUE(realpath(PATH_TO_LIBC, libc_realpath) == libc_realpath); |