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

David Holmes david.holmes at oracle.com
Wed Mar 1 05:56:46 UTC 2017


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