ld.config.txt for APEX
When executing an executable in an APEX (i.e., /apex/<name>/bin),
ld.config.txt file is read from the same APEX, not from /system/etc.
Bug: 115787633
Test: m apex.test; adb push ...apex.test.apex /data/apex; adb reboot
Test: adb root; adb shell /apex/com.android.example.apex/bin/dex2oat
is runnable.
Change-Id: I6400251f99d24f2379dbaf655ecd84da02490617
diff --git a/linker/linker.cpp b/linker/linker.cpp
index e866c3d..0470d7a 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -3712,6 +3712,15 @@
return namespaces;
}
+// return /apex/<name>/etc/ld.config.txt from /apex/<name>/bin/<exec>
+static std::string get_ld_config_file_apex_path(const char* executable_path) {
+ std::vector<std::string> paths = android::base::Split(executable_path, "/");
+ if (paths.size() == 5 && paths[1] == "apex" && paths[3] == "bin") {
+ return std::string("/apex/") + paths[2] + "/etc/ld.config.txt";
+ }
+ return "";
+}
+
static std::string get_ld_config_file_vndk_path() {
if (android::base::GetBoolProperty("ro.vndk.lite", false)) {
return kLdConfigVndkLiteFilePath;
@@ -3726,7 +3735,7 @@
return ld_config_file_vndk;
}
-static std::string get_ld_config_file_path() {
+static std::string get_ld_config_file_path(const char* executable_path) {
#ifdef USE_LD_CONFIG_FILE
// This is a debugging/testing only feature. Must not be available on
// production builds.
@@ -3736,13 +3745,23 @@
}
#endif
- if (file_exists(kLdConfigArchFilePath)) {
- return kLdConfigArchFilePath;
+ std::string path = get_ld_config_file_apex_path(executable_path);
+ if (!path.empty()) {
+ if (file_exists(path.c_str())) {
+ return path;
+ }
+ DL_WARN("Warning: couldn't read config file \"%s\" for \"%s\"",
+ path.c_str(), executable_path);
}
- std::string ld_config_file_vndk = get_ld_config_file_vndk_path();
- if (file_exists(ld_config_file_vndk.c_str())) {
- return ld_config_file_vndk;
+ path = kLdConfigArchFilePath;
+ if (file_exists(path.c_str())) {
+ return path;
+ }
+
+ path = get_ld_config_file_vndk_path();
+ if (file_exists(path.c_str())) {
+ return path;
}
return kLdConfigFilePath;
@@ -3765,7 +3784,7 @@
std::string error_msg;
- std::string ld_config_file_path = get_ld_config_file_path();
+ std::string ld_config_file_path = get_ld_config_file_path(executable_path);
if (!Config::read_binary_config(ld_config_file_path.c_str(),
executable_path,