Loading libnativeloader/native_loader.cpp +35 −0 Original line number Diff line number Diff line Loading @@ -137,6 +137,12 @@ static constexpr const char* kWhitelistedDirectories = "/data:/mnt/expand"; static constexpr const char* kApexPath = "/apex/"; #if defined(__LP64__) static constexpr const char* kRuntimeApexLibPath = "/apex/com.android.runtime/lib64"; #else static constexpr const char* kRuntimeApexLibPath = "/apex/com.android.runtime/lib"; #endif static bool is_debuggable() { char debuggable[PROP_VALUE_MAX]; property_get("ro.debuggable", debuggable, "0"); Loading Loading @@ -408,6 +414,14 @@ class LibraryNamespaces { } } // Remove the public libs in the runtime namespace. // These libs are listed in public.android.txt, but we don't want the rest of android // in default namespace to dlopen the libs. // For example, libicuuc.so is exposed to classloader namespace from runtime namespace. // Unfortunately, it does not have stable C symbols, and default namespace should only use // stable symbols in libandroidicu.so. http://b/120786417 removePublicLibsIfExistsInRuntimeApex(sonames); // android_init_namespaces() expects all the public libraries // to be loaded so that they can be found by soname alone. // Loading Loading @@ -502,6 +516,27 @@ class LibraryNamespaces { } } /** * Remove the public libs in runtime namespace */ void removePublicLibsIfExistsInRuntimeApex(std::vector<std::string>& sonames) { for (const std::string& lib_name : kRuntimePublicLibraries) { std::string path(kRuntimeApexLibPath); path.append("/").append(lib_name); struct stat s; // Do nothing if the path in /apex does not exist. // Runtime APEX must be mounted since libnativeloader is in the same APEX if (stat(path.c_str(), &s) != 0) { continue; } auto it = std::find(sonames.begin(), sonames.end(), lib_name); if (it != sonames.end()) { sonames.erase(it); } } } bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames, const std::function<bool(const std::string& /* soname */, Loading Loading
libnativeloader/native_loader.cpp +35 −0 Original line number Diff line number Diff line Loading @@ -137,6 +137,12 @@ static constexpr const char* kWhitelistedDirectories = "/data:/mnt/expand"; static constexpr const char* kApexPath = "/apex/"; #if defined(__LP64__) static constexpr const char* kRuntimeApexLibPath = "/apex/com.android.runtime/lib64"; #else static constexpr const char* kRuntimeApexLibPath = "/apex/com.android.runtime/lib"; #endif static bool is_debuggable() { char debuggable[PROP_VALUE_MAX]; property_get("ro.debuggable", debuggable, "0"); Loading Loading @@ -408,6 +414,14 @@ class LibraryNamespaces { } } // Remove the public libs in the runtime namespace. // These libs are listed in public.android.txt, but we don't want the rest of android // in default namespace to dlopen the libs. // For example, libicuuc.so is exposed to classloader namespace from runtime namespace. // Unfortunately, it does not have stable C symbols, and default namespace should only use // stable symbols in libandroidicu.so. http://b/120786417 removePublicLibsIfExistsInRuntimeApex(sonames); // android_init_namespaces() expects all the public libraries // to be loaded so that they can be found by soname alone. // Loading Loading @@ -502,6 +516,27 @@ class LibraryNamespaces { } } /** * Remove the public libs in runtime namespace */ void removePublicLibsIfExistsInRuntimeApex(std::vector<std::string>& sonames) { for (const std::string& lib_name : kRuntimePublicLibraries) { std::string path(kRuntimeApexLibPath); path.append("/").append(lib_name); struct stat s; // Do nothing if the path in /apex does not exist. // Runtime APEX must be mounted since libnativeloader is in the same APEX if (stat(path.c_str(), &s) != 0) { continue; } auto it = std::find(sonames.begin(), sonames.end(), lib_name); if (it != sonames.end()) { sonames.erase(it); } } } bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames, const std::function<bool(const std::string& /* soname */, Loading