diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-08-03 07:38:57 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-08-03 07:38:57 +0000 |
commit | cd8feea16630058c061c02c122f8008c87702bdc (patch) | |
tree | 816655053a459286df10bd12d524f55483249ceb | |
parent | 4aa0cb176c317480a3c77cd3060f73d1a67ad151 (diff) | |
parent | cc28f6ea099e667d69511a3a1b9ad72e46d6a971 (diff) | |
download | bionic-cd8feea16630058c061c02c122f8008c87702bdc.tar.gz |
release-request-ca4ad653-1655-436a-b65c-2527b02ae5f2-for-git_oc-mr1-release-4241196 snap-temp-L48200000088705722
Change-Id: I10ee03d8a1013644c1fb79c9f73c1971303c044d
-rw-r--r-- | linker/linker.cpp | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/linker/linker.cpp b/linker/linker.cpp index 8e7a1411c..b05ab9124 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -1146,6 +1146,27 @@ static bool find_loaded_library_by_inode(android_namespace_t* ns, return *candidate != nullptr; } +static bool find_loaded_library_by_realpath(android_namespace_t* ns, const char* realpath, + bool search_linked_namespaces, soinfo** candidate) { + auto predicate = [&](soinfo* si) { return strcmp(realpath, si->get_realpath()) == 0; }; + + *candidate = ns->soinfo_list().find_if(predicate); + + if (*candidate == nullptr && search_linked_namespaces) { + for (auto& link : ns->linked_namespaces()) { + android_namespace_t* linked_ns = link.linked_namespace(); + soinfo* si = linked_ns->soinfo_list().find_if(predicate); + + if (si != nullptr && link.is_accessible(si->get_soname())) { + *candidate = si; + return true; + } + } + } + + return *candidate != nullptr; +} + static bool load_library(android_namespace_t* ns, LoadTask* task, LoadTaskList* load_tasks, @@ -1956,12 +1977,18 @@ void* do_dlopen(const char* name, int flags, const char* translated_name = name; if (g_is_asan && translated_name != nullptr && translated_name[0] == '/') { - char translated_path[PATH_MAX]; - if (realpath(translated_name, translated_path) != nullptr) { - asan_name_holder = std::string(kAsanLibDirPrefix) + translated_path; + char original_path[PATH_MAX]; + if (realpath(name, original_path) != nullptr) { + asan_name_holder = std::string(kAsanLibDirPrefix) + original_path; if (file_exists(asan_name_holder.c_str())) { - translated_name = asan_name_holder.c_str(); - PRINT("linker_asan dlopen translating \"%s\" -> \"%s\"", name, translated_name); + soinfo* si = nullptr; + if (find_loaded_library_by_realpath(ns, original_path, true, &si)) { + PRINT("linker_asan dlopen NOT translating \"%s\" -> \"%s\": library already loaded", name, + asan_name_holder.c_str()); + } else { + PRINT("linker_asan dlopen translating \"%s\" -> \"%s\"", name, translated_name); + translated_name = asan_name_holder.c_str(); + } } } } |