Clean up JNI dlsym lookup trampoline.
Make sure the GenericJniTrampoline recognizes the trampoline
in primary boot image oat file. Rename that trampoline, add
a test and flag some issues in the code.
Test: New test 178-app-image-native-method.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Test: testrunner.py --host -t 178-app-image-native-method
Bug: 112189621
Change-Id: I8f8cd11998af536fd3842dd4183a25f0367655a6
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 438d5cb..3f904f3 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -611,6 +611,7 @@
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 @@
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 @@
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 @@
// 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 @@
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::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 {