Fwd: cross compile OpenJDK-9+158 minimal variant failed when link libjvm.so

David Holmes david.holmes at oracle.com
Wed Mar 1 07:14:53 UTC 2017


On 1/03/2017 4:26 PM, Zhu Yong wrote:
> 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:

We last used gcc 4.7.2. I can't really say if 4.6.4 is "too old".

> 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 )

That's expected. The server VM is high performance.

> 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).

That needs investigating. You need to try and generate a stackdump to 
see where things are stuck.

David

>
> On Wed, Mar 1, 2017 at 1:56 PM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at 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.holmes at oracle.com <mailto:david.holmes at oracle.com>
>         <mailto:david.holmes at oracle.com
>         <mailto:david.holmes at 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
>
>
>



More information about the build-dev mailing list