diff options
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r-- | runtime/class_linker.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 438d5cb709..3f904f3546 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -611,6 +611,7 @@ ClassLinker::ClassLinker(InternTable* intern_table, bool fast_class_not_found_ex log_new_roots_(false), intern_table_(intern_table), fast_class_not_found_exceptions_(fast_class_not_found_exceptions), + jni_dlsym_lookup_trampoline_(nullptr), quick_resolution_trampoline_(nullptr), quick_imt_conflict_trampoline_(nullptr), quick_generic_jni_trampoline_(nullptr), @@ -834,8 +835,10 @@ bool ClassLinker::InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> b quick_generic_jni_trampoline_ = GetQuickGenericJniStub(); if (!runtime->IsAotCompiler()) { // We need to set up the generic trampolines since we don't have an image. + jni_dlsym_lookup_trampoline_ = GetJniDlsymLookupStub(); quick_resolution_trampoline_ = GetQuickResolutionStub(); quick_imt_conflict_trampoline_ = GetQuickImtConflictStub(); + quick_generic_jni_trampoline_ = GetQuickGenericJniStub(); quick_to_interpreter_bridge_trampoline_ = GetQuickToInterpreterBridge(); } @@ -1183,6 +1186,7 @@ bool ClassLinker::InitFromBootImage(std::string* error_msg) { runtime->GetOatFileManager().RegisterImageOatFiles(spaces); DCHECK(!oat_files.empty()); const OatHeader& default_oat_header = oat_files[0]->GetOatHeader(); + jni_dlsym_lookup_trampoline_ = default_oat_header.GetJniDlsymLookupTrampoline(); quick_resolution_trampoline_ = default_oat_header.GetQuickResolutionTrampoline(); quick_imt_conflict_trampoline_ = default_oat_header.GetQuickImtConflictTrampoline(); quick_generic_jni_trampoline_ = default_oat_header.GetQuickGenericJniTrampoline(); @@ -1191,6 +1195,8 @@ bool ClassLinker::InitFromBootImage(std::string* error_msg) { // Check that the other images use the same trampoline. for (size_t i = 1; i < oat_files.size(); ++i) { const OatHeader& ith_oat_header = oat_files[i]->GetOatHeader(); + const void* ith_jni_dlsym_lookup_trampoline_ = + ith_oat_header.GetJniDlsymLookupTrampoline(); const void* ith_quick_resolution_trampoline = ith_oat_header.GetQuickResolutionTrampoline(); const void* ith_quick_imt_conflict_trampoline = @@ -1199,7 +1205,8 @@ bool ClassLinker::InitFromBootImage(std::string* error_msg) { ith_oat_header.GetQuickGenericJniTrampoline(); const void* ith_quick_to_interpreter_bridge_trampoline = ith_oat_header.GetQuickToInterpreterBridge(); - if (ith_quick_resolution_trampoline != quick_resolution_trampoline_ || + if (ith_jni_dlsym_lookup_trampoline_ != jni_dlsym_lookup_trampoline_ || + ith_quick_resolution_trampoline != quick_resolution_trampoline_ || ith_quick_imt_conflict_trampoline != quick_imt_conflict_trampoline_ || ith_quick_generic_jni_trampoline != quick_generic_jni_trampoline_ || ith_quick_to_interpreter_bridge_trampoline != quick_to_interpreter_bridge_trampoline_) { @@ -9506,7 +9513,8 @@ bool ClassLinker::IsQuickGenericJniStub(const void* entry_point) const { } bool ClassLinker::IsJniDlsymLookupStub(const void* entry_point) const { - return entry_point == GetJniDlsymLookupStub(); + return entry_point == GetJniDlsymLookupStub() || + (jni_dlsym_lookup_trampoline_ == entry_point); } const void* ClassLinker::GetRuntimeQuickGenericJniStub() const { |