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

Zhu Yong zhuyong.me at gmail.com
Wed Mar 1 06:26:22 UTC 2017


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:

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 )

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


On Wed, Mar 1, 2017 at 1:56 PM, David Holmes <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>> 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