diff options
author | vichang <vichang@google.com> | 2019-02-19 10:14:31 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2019-02-19 10:14:31 +0000 |
commit | ce912aadda68e6f3f4261d78bb9564cdad7513ba (patch) | |
tree | 8886abc2c315d6fe5981eddcb1f03150f02131f4 /libnativeloader/native_loader.cpp | |
parent | f80c326d2e90c648196e9da5b536fa382b1ee7ad (diff) | |
parent | 785ba2e68ee2ded4c04c2d0433db2bea84526ab6 (diff) |
Merge changes from topic "dup_icu4c"
* changes:
Linker namespace changes for moving ICU4C to APEX
Remove the public libs in runtime namespace
Diffstat (limited to 'libnativeloader/native_loader.cpp')
-rw-r--r-- | libnativeloader/native_loader.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index 5394d7eae..09998f027 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -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"); @@ -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. // @@ -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 */, |