We use armv7-marvell-linux-gnueabi-softfp toolchain gcc version 4.6.4 (Marvell GCC release 20150204-c4af733b 64K MAXPAGESIZE ALIGN CVE-2015-0235)
Is this toolchain too old? I am asking because I saw other strange issues as well: I have successfully build server, client and minimal VM, when I run Dhrystone benchmark file (the same jar file from http://www.okayan.jp/DhrystoneApplet/), the performance from server VM is much better than client and minimal VM. (minimal: 1629852, client: 1615508, server: 2338871 ) And when run Whetstone Benchmark from http://www.roylongbottom.org.uk/online/whetjava2.html, server VM finished with good result, client and minimal VM not able to finish (program stuck there forever after print 1st line of output). On Wed, Mar 1, 2017 at 1:56 PM, David Holmes <david.hol...@oracle.com> wrote: > On 1/03/2017 3:39 PM, Zhu Yong wrote: > >> 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. >> > > That seems to be a compiler issue. jvmtiEnvBase.hpp is unconditionally > included in a couple of places because we have to have enough of the JVMTI > code to say JVMTI is not available. Those doit() implementations, though > arguably could be conditional on INCLUDE_JVMTI, are not referenced by any > called code and so should not linked in. But in your case it seems they are. > > What toolchain are you using? > > David > ----- > > 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 >> <mailto: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 >> >> >>