aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitriy Ivanov <dimitry@google.com>2015-06-17 17:15:04 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-06-17 17:15:06 +0000
commit462df82902e6982f5b5c2ea443e84f39980259e1 (patch)
tree79af3a29d00f552950460aa85096893c12945fd3
parentd49850d6abb1b70c34be99a46e383a6a878ae19e (diff)
parentea4ef52fa46602a5853df0e5b1ddd71b194d54ce (diff)
downloadandroid_bionic-462df82902e6982f5b5c2ea443e84f39980259e1.tar.gz
android_bionic-462df82902e6982f5b5c2ea443e84f39980259e1.tar.bz2
android_bionic-462df82902e6982f5b5c2ea443e84f39980259e1.zip
Merge "Improve library lookup logic" into mnc-dev
-rw-r--r--linker/linker.cpp12
-rw-r--r--linker/linker_sdk_versions.cpp4
2 files changed, 16 insertions, 0 deletions
diff --git a/linker/linker.cpp b/linker/linker.cpp
index bbdd1b04c..9c8765d9e 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -1349,7 +1349,19 @@ static soinfo *find_loaded_library_by_soname(const char* name) {
return nullptr;
}
+ uint32_t target_sdk_version = get_application_target_sdk_version();
+
for (soinfo* si = solist; si != nullptr; si = si->next) {
+ // If the library was opened under different target sdk version
+ // skip this step and try to reopen it. The exceptions are
+ // "libdl.so" and global group. There is no point in skipping
+ // them because relocation process is going to use them
+ // in any case.
+ if (si != solist && (si->get_dt_flags_1() & DF_1_GLOBAL) == 0 &&
+ si->is_linked() && si->get_target_sdk_version() != target_sdk_version) {
+ continue;
+ }
+
const char* soname = si->get_soname();
if (soname != nullptr && (strcmp(name, soname) == 0)) {
return si;
diff --git a/linker/linker_sdk_versions.cpp b/linker/linker_sdk_versions.cpp
index e9ad3dc25..9aebb06ad 100644
--- a/linker/linker_sdk_versions.cpp
+++ b/linker/linker_sdk_versions.cpp
@@ -21,6 +21,10 @@
static std::atomic<uint32_t> g_target_sdk_version(__ANDROID_API__);
void set_application_target_sdk_version(uint32_t target) {
+ // translate current sdk_version to platform sdk_version
+ if (target == 0) {
+ target = __ANDROID_API__;
+ }
g_target_sdk_version = target;
}