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

David Holmes david.holmes at oracle.com
Mon Mar 6 01:09:47 UTC 2017


On 3/03/2017 6:59 PM, Zhu Yong wrote:
> Thank you very much for helping.
>
> Today I tried to debug the test code, but without luck, still can't
> figure out why.
>
> First, I followed the instruction
> http://stackoverflow.com/questions/29916995/intellij-idea-remotely-debug-java-console-program,
> changed suspend=y because the test code is short, it will exit before
> debug start if not suspend first. Unfortunately, with remote debug, I
> was not able to reproduce the issue. Same class file, directly run, will
> produce the issue, remote debug won't.
>
> Then, I tried *jdb *from my OpenJDK9 client vm, run directly on my
> target system to debug the code. If I set breakpoint, program run
> without issue, however, if don't set breakpoint, just "run" in jdb,
> problem reproduced.

This suggests to me that a floating-point register is not being 
preserved when needed. When you run with the breakpoint you will get 
full save/restore of all the register state. Just a theory.

> Next, I tried to use *javap *to decompile the output class file, run
> OpenJDK9 client vm javap and host side javap on same class file, the
> output is same for getTime function.

It is a native code issue not a bytecode issue, so javap wont help here.

> One interesting point I noticed today is the output like below when
> problem happen, 2nd call of getTime() has value of 1st call result /
> 1000. Looks like 2nd call getTime(), double variable q was not updated
> startTime: 284092.063000 endTime: 284.092063 runTime: -283807.970937
>
> What should I do so that I can come a conclusion that it's due to
> compiler issue?

Can you get access to a different gcc to build with?

David
-----

>
> On Thu, Mar 2, 2017 at 12:32 PM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
>     I built your sample program with latest JDK 9 for arm-vfp-sflt and
>     ran on an emulator I have available, and I had no issues.
>
>     So I still have concerns this may be a build/compiler issue.
>
>     David
>
>
>     On 2/03/2017 12:51 PM, David Holmes wrote:
>
>         I've moved this discussion over to hotspot-dev as this seems no
>         longer a
>         build issue but a C1 soft-float issue.
>
>         David
>
>         On 2/03/2017 12:35 PM, Zhu Yong wrote:
>
>             If run with -Xint, it works.
>
>             I have created simplified FP test by remove all non-related
>             code from
>             Whetstone test code.
>             The test code is here:
>             https://gist.github.com/yongzhy/d65c26d39fe5d549d1b406c7c84eacd4
>             <https://gist.github.com/yongzhy/d65c26d39fe5d549d1b406c7c84eacd4>
>
>             I am not sure if the test code can help or not. The
>             behaviour is weird  :
>             - If I print both itime and q, program will run OK
>             - inside condition block if(q<1.0f), if I use exit code
>             2,3,4,5, problem
>             appears, however, if I use exit code >=6, program run OK.
>
>             I always get exit code 5, the line q = (double)itime is wrong?
>
>                 public static double getTime()
>                 {
>                         double q;
>                         long itime;
>                         itime = System.currentTimeMillis();
>                         if(itime<1000000) {
>                             System.exit(1);
>                         }
>                         //System.out.printf("time long value %d\n", itime);
>                         q = (double) itime;
>                         if(q < 1.0f) {
>                             System.exit(5);  // I always get exit code 5
>                         }
>                         //System.out.printf("time float value %f\n", q);
>                         return q / 1000.0;
>                 }
>
>
>
>             On Wed, Mar 1, 2017 at 5:31 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 1/03/2017 6:45 PM, Zhu Yong wrote:
>
>                     OK, for the Whetstone Benchmark, I added debug
>             printing and
>                     found it's
>                     due to function getTime(), it only get good value on
>             1st call,
>             all
>                     following calls get 0s.
>                     Debug printing of itime value is correct. So reason
>             should be
>                     the return
>                     division line. Could it because toolchain's floating
>             point
>                     operation???
>                     But why server VM Ok?
>
>
>                 Server and client implement FP logic differently, and
>             particularly
>                 as this is soft-fp, they may well not be in sync. Does
>             -Xint work?
>
>                 Can you isolate to a simple FP test?
>
>                 David
>
>                         public static double getTime()
>                         {
>                                 double q;
>                                 long itime;
>                                 itime = System.currentTimeMillis();
>                                 q = (double) itime;
>                                 return q / 1000.0;
>                         }
>
>                     On Wed, Mar 1, 2017 at 3:14 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>>
>                     <mailto: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 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/
>             <http://www.okayan.jp/DhrystoneApplet/>
>                     <http://www.okayan.jp/DhrystoneApplet/
>             <http://www.okayan.jp/DhrystoneApplet/>>
>                             <http://www.okayan.jp/DhrystoneApplet/
>             <http://www.okayan.jp/DhrystoneApplet/>
>                     <http://www.okayan.jp/DhrystoneApplet/
>             <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
>             <http://www.roylongbottom.org.uk/online/whetjava2.html>
>
>             <http://www.roylongbottom.org.uk/online/whetjava2.html
>             <http://www.roylongbottom.org.uk/online/whetjava2.html>>
>
>             <http://www.roylongbottom.org.uk/online/whetjava2.html
>             <http://www.roylongbottom.org.uk/online/whetjava2.html>
>
>             <http://www.roylongbottom.org.uk/online/whetjava2.html
>             <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>
>                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>>
>             <mailto:david.holmes at oracle.com <mailto:david.holmes at oracle.com>
>                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>>>
>                             <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>
>                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>>
>                             <mailto: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 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>>
>                             <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>
>                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>>>
>                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>
>             <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>>
>                             <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>
>                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>>>>
>                                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>
>                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>>
>                             <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>
>                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>>>
>
>                                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>
>                     <mailto:david.holmes at oracle.com
>             <mailto:david.holmes at oracle.com>>
>                             <mailto: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 hotspot-dev mailing list