Remove the public libs in runtime namespace am: f70a2fe4c1 am: 2c75b73688

am: b4f1e56942

Change-Id: I27495388d8a5b7604046d811019b25fdafed0e18
This commit is contained in:
Victor Chang 2019-02-19 02:54:23 -08:00 committed by android-build-merger
commit 394812d8ef

View file

@ -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 */,