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


Reply via email to