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

Zhu Yong zhuyong.me at gmail.com
Wed Mar 1 05:39:26 UTC 2017


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