Thank you for the information, I managed to make minimal build pass now. Initially I though JVM_EXCLUDE_FILES need to add additional 3 generated files (they appeared in _BUILD_LIBJVM_objectfilenames.txt) : bytecodeInterpreterWithChecks.cpp jvmtiEnter.cpp jvmtiEnterTrace.cpp But build still fail with same error message.
Finally I figured out it's due to those 8 doit() functions implementation in jvmtiEnvBase.hpp file. After move all those 8 doit() implementations to jvmtiEnvBase.cpp, build of minimal VM passed without any issue. Changes appended ============= --- .../src/share/vm/prims/jvmtiEnvBase.cpp | 74 ++++++++++++++++++++++ .../src/share/vm/prims/jvmtiEnvBase.hpp | 68 +++----------------- 2 files changed, 82 insertions(+), 60 deletions(-) mode change 100644 => 100755 hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.cpp mode change 100644 => 100755 hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.hpp diff --git a/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.cpp b/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.cpp old mode 100644 new mode 100755 index dd241a0..e5832ba --- a/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.cpp +++ b/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.cpp @@ -1283,6 +1283,80 @@ VM_GetMultipleStackTraces::allocate_and_fill_stacks(jint thread_count) { "the last copied frame info must be the last record"); } +void +VM_UpdateForPopTopFrame::doit() { + JavaThread* jt = _state->get_thread(); + if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) { + _state->update_for_pop_top_frame(); + } else { + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; + } +} + +void +VM_SetFramePop::doit() { + JavaThread* jt = _state->get_thread(); + if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) { + int frame_number = _state->count_frames() - _depth; + _state->env_thread_state((JvmtiEnvBase*)_env)->set_frame_pop(frame_number); + } else { + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; + } +} + +void +VM_GetOwnedMonitorInfo::doit() { + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; + if (Threads::includes(_java_thread) && !_java_thread->is_exiting() + && _java_thread->threadObj() != NULL) { + _result = ((JvmtiEnvBase *)_env)->get_owned_monitors(_calling_thread, _java_thread, + _owned_monitors_list); + } +} + +void +VM_GetObjectMonitorUsage::doit() { + _result = ((JvmtiEnvBase*) _env)->get_object_monitor_usage(_calling_thread, _object, _info_ptr); +} + +void +VM_GetCurrentContendedMonitor::doit() { + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; + if (Threads::includes(_java_thread) && !_java_thread->is_exiting() && + _java_thread->threadObj() != NULL) { + _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor(_calling_thread,_java_thread,_owned_monitor_ptr); + } +} + +void +VM_GetStackTrace::doit() { + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; + if (Threads::includes(_java_thread) && !_java_thread->is_exiting() + && _java_thread->threadObj() != NULL) { + _result = ((JvmtiEnvBase *)_env)->get_stack_trace(_java_thread, + _start_depth, _max_count, + _frame_buffer, _count_ptr); + } +} + +void +VM_GetFrameCount::doit() { + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; + JavaThread* jt = _state->get_thread(); + if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) { + _result = ((JvmtiEnvBase*)_env)->get_frame_count(_state, _count_ptr); + } +} + +void +VM_GetFrameLocation::doit() { + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; + if (Threads::includes(_java_thread) && !_java_thread->is_exiting() && + _java_thread->threadObj() != NULL) { + _result = ((JvmtiEnvBase*)_env)->get_frame_location(_java_thread, _depth, + _method_ptr, _location_ptr); + } +} void VM_GetThreadListStackTraces::doit() { diff --git a/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.hpp b/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.hpp old mode 100644 new mode 100755 index 04e6869..00b9890 --- a/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.hpp +++ b/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.hpp @@ -359,14 +359,7 @@ public: } VMOp_Type type() const { return VMOp_UpdateForPopTopFrame; } jvmtiError result() { return _result; } - void doit() { - JavaThread* jt = _state->get_thread(); - if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) { - _state->update_for_pop_top_frame(); - } else { - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; - } - } + void doit(); }; // VM operation to set frame pop. @@ -389,15 +382,7 @@ public: bool allow_nested_vm_operations() const { return true; } VMOp_Type type() const { return VMOp_SetFramePop; } jvmtiError result() { return _result; } - void doit() { - JavaThread* jt = _state->get_thread(); - if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) { - int frame_number = _state->count_frames() - _depth; - _state->env_thread_state((JvmtiEnvBase*)_env)->set_frame_pop(frame_number); - } else { - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; - } - } + void doit(); }; @@ -421,14 +406,7 @@ public: _result = JVMTI_ERROR_NONE; } VMOp_Type type() const { return VMOp_GetOwnedMonitorInfo; } - void doit() { - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; - if (Threads::includes(_java_thread) && !_java_thread->is_exiting() - && _java_thread->threadObj() != NULL) { - _result = ((JvmtiEnvBase *)_env)->get_owned_monitors(_calling_thread, _java_thread, - _owned_monitors_list); - } - } + void doit(); jvmtiError result() { return _result; } }; @@ -451,10 +429,7 @@ public: } VMOp_Type type() const { return VMOp_GetObjectMonitorUsage; } jvmtiError result() { return _result; } - void doit() { - _result = ((JvmtiEnvBase*) _env)->get_object_monitor_usage(_calling_thread, _object, _info_ptr); - } - + void doit(); }; // VM operation to get current contended monitor. @@ -475,13 +450,7 @@ public: } VMOp_Type type() const { return VMOp_GetCurrentContendedMonitor; } jvmtiError result() { return _result; } - void doit() { - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; - if (Threads::includes(_java_thread) && !_java_thread->is_exiting() && - _java_thread->threadObj() != NULL) { - _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor(_calling_thread,_java_thread,_owned_monitor_ptr); - } - } + void doit(); }; // VM operation to get stack trace at safepoint. @@ -508,15 +477,7 @@ public: } jvmtiError result() { return _result; } VMOp_Type type() const { return VMOp_GetStackTrace; } - void doit() { - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; - if (Threads::includes(_java_thread) && !_java_thread->is_exiting() - && _java_thread->threadObj() != NULL) { - _result = ((JvmtiEnvBase *)_env)->get_stack_trace(_java_thread, - _start_depth, _max_count, - _frame_buffer, _count_ptr); - } - } + void doit(); }; // forward declaration @@ -606,13 +567,7 @@ public: } VMOp_Type type() const { return VMOp_GetFrameCount; } jvmtiError result() { return _result; } - void doit() { - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; - JavaThread* jt = _state->get_thread(); - if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) { - _result = ((JvmtiEnvBase*)_env)->get_frame_count(_state, _count_ptr); - } - } + void doit(); }; // VM operation to frame location at safepoint. @@ -636,14 +591,7 @@ public: } VMOp_Type type() const { return VMOp_GetFrameLocation; } jvmtiError result() { return _result; } - void doit() { - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; - if (Threads::includes(_java_thread) && !_java_thread->is_exiting() && - _java_thread->threadObj() != NULL) { - _result = ((JvmtiEnvBase*)_env)->get_frame_location(_java_thread, _depth, - _method_ptr, _location_ptr); - } - } + void doit(); }; -- 2.1.4 On Tue, Feb 28, 2017 at 6:11 PM, David Holmes <david.hol...@oracle.com> wrote: > On 28/02/2017 7:35 PM, David Holmes wrote: > >> On 28/02/2017 6:51 PM, Zhu Yong wrote: >> >>> Dear All, >>> >>> I am testing cross compile OpenJDK-9+158 for our embedded system using >>> buildroot, I can build server and client variants successfully, but the >>> output compact1 profile file size is too big, then I tried to build >>> minimal >>> variant, failed when linking libjvm.so. >>> >>> I checked build/linux-arm-normal-minimal-release/hotspot/variant- >>> minimal/ >>> libjvm/objs/_BUILD_LIBJVM_objectfilenames.txt, jvmtiEnvBase.o >>> and jvmtiEnvThreadState.o are not listed in the file (which is required >>> from the error message below). >>> >> >> Right - JVM TI is not part of the Minimal VM. At the moment it looks >> like some service has either been enabled when it should not have been, >> or has not been correctly if'def in the source. >> > > As far as I can see your error messages are complaining about missing > functions that are called from the same sources as the functions that are > missing! ie. > > undefined reference to > `JvmtiEnvBase::get_current_contended_monitor(JavaThread*, JavaThread*, > _jobject**)' > /tmp/cc27HS5M.ltrans0.ltrans.o: In function `VM_GetOwnedMonitorInfo::doit( > ) > > but VM_GetOwnedMonitorInfo is defined in jvmtiEnv.cpp which should be > included or excluded the same as jvmtiEnBase.cpp. Here's the logic in the > makefile that controls this: > > ifneq ($(call check-jvm-feature, jvmti), true) > JVM_CFLAGS_FEATURES += -DINCLUDE_JVMTI=0 > JVM_EXCLUDE_FILES += jvmtiGetLoadedClasses.cpp jvmtiThreadState.cpp > jvmtiExtensions.cpp \ > jvmtiImpl.cpp jvmtiManageCapabilities.cpp jvmtiRawMonitor.cpp > jvmtiUtil.cpp jvmtiTrace.cpp \ > jvmtiCodeBlobEvents.cpp jvmtiEnv.cpp jvmtiRedefineClasses.cpp > jvmtiEnvBase.cpp jvmtiEnvThreadState.cpp \ > jvmtiTagMap.cpp jvmtiEventController.cpp evmCompat.cpp > jvmtiEnter.xsl jvmtiExport.cpp \ > jvmtiClassFileReconstituter.cpp > endif > > Can you run with LOG=trace so that each compiled file is listed in the > build log, then see if there are any jvmti* files listed there. > > Thanks, > David > > > > > Can you provide the lines from your spec.gmk that define the >> JVM_FEATURES_* variables please. >> >> Thanks, >> David >> ------ >> >> >>> === Output from failing command(s) repeated here === >>> * For target hotspot_variant-minimal_libjvm_objs_BUILD_LIBJVM_link: >>> /tmp/cc27HS5M.ltrans0.ltrans.o: In function `VM_GetStackTrace::doit() >>> [clone .local.640]': >>> cc27HS5M.ltrans0.o:(.text+0xce5e): undefined reference to >>> `JvmtiEnvBase::get_stack_trace(JavaThread*, int, int, _jvmtiFrameInfo*, >>> int*)' >>> /tmp/cc27HS5M.ltrans0.ltrans.o: In function >>> `VM_GetCurrentContendedMonitor::doit() >>> [clone .local.639]': >>> cc27HS5M.ltrans0.o:(.text+0xcec2): undefined reference to >>> `JvmtiEnvBase::get_current_contended_monitor(JavaThread*, JavaThread*, >>> _jobject**)' >>> /tmp/cc27HS5M.ltrans0.ltrans.o: In function >>> `VM_GetOwnedMonitorInfo::doit() >>> [clone .local.638]': >>> cc27HS5M.ltrans0.o:(.text+0xcf26): undefined reference to >>> `JvmtiEnvBase::get_owned_monitors(JavaThread*, JavaThread*, >>> GrowableArray<_ >>> jvmtiMonitorStackDepthInfo*>*)' >>> /tmp/cc27HS5M.ltrans0.ltrans.o: In function `VM_GetFrameCount::doit() >>> [clone .local.637]': >>> cc27HS5M.ltrans0.o:(.text+0xcf8a): undefined reference to >>> `JvmtiEnvBase::get_frame_count(JvmtiThreadState*, int*)' >>> /tmp/cc27HS5M.ltrans0.ltrans.o: In function `VM_SetFramePop::doit() >>> [clone >>> .local.636]': >>> cc27HS5M.ltrans0.o:(.text+0xcfea): undefined reference to >>> `JvmtiThreadState::count_frames()' >>> cc27HS5M.ltrans0.o:(.text+0xd030): undefined reference to >>> `JvmtiEnvThreadState::set_frame_pop(int)' >>> /tmp/cc27HS5M.ltrans0.ltrans.o: In function `VM_GetFrameLocation::doit() >>> [clone .local.641]': >>> ... (rest of output omitted) >>> >>> >>> My configuration: >>> >>> --with-jdk-variant=normal \ >>> --with-jvm-variants=minimal \ >>> --with-debug-level=release \ >>> --disable-warnings-as-errors \ >>> --disable-hotspot-gtest \ >>> --with-abi-profile=arm-vfp-sflt \ >>> --openjdk-target=$(GNU_TARGET_NAME) \ >>> --with-sys-root=$(STAGING_DIR) \ >>> --with-tools-dir=$(HOST_DIR) \ >>> --with-freetype-include=$(STAGING_DIR)/usr/include \ >>> --with-freetype-lib=$(STAGING_DIR)/usr/lib \ >>> --with-freetype=$(STAGING_DIR)/usr/ \ >>> --with-alsa-include=$(STAGING_DIR)/usr/include \ >>> --with-alsa-lib=$(STAGING_DIR)/usr/lib \ >>> --with-alsa=$(STAGING_DIR)/usr/ \ >>> --with-cups=$(STAGING_DIR)/usr/ \ >>> --with-x=$(STAGING_DIR)/usr/include \ >>> --with-extra-ldflags=--sysroot=$(STAGING_DIR) \ >>> --enable-headless-only \ >>> --disable-freetype-bundling \ >>> --enable-unlimited-crypto \ >>> --with-boot-jdk=/opt/java/jdk1.8.0_102 >>> >>>