Build for Android with libstdc++

189 views
Skip to first unread message

Jaemin Park

unread,
Jul 15, 2019, 4:05:23 AM7/15/19
to v8-users

Hi, I'm working on embedding v8 to Unreal Engine(UE4) application. As of now UE4 is still uses libstdc++ for Android, I had to build v8 with libstdc++ to match stdlib. I was able to build with minimal modification (as possible) of build script, but I experienced some runtime assurance failure.

At first, I'm working with 7.4.288 version of v8 and my modification to build with libstdc++ is as follows:

diff --git a/config/BUILDCONFIG.gn b/config/BUILDCONFIG.gn
index 9e843f3..6e718e1 100644
--- a/config/BUILDCONFIG.gn
+++ b/config/BUILDCONFIG.gn
@@ -438,7 +438,6 @@ default_compiler_configs = [
   "//build/config/compiler:no_exceptions",
   "//build/config/compiler:no_rtti",
   "//build/config/compiler:runtime_library",
-  "//build/config/compiler:thin_archive",
   "//build/config/coverage:default_coverage",
   "//build/config/sanitizers:default_sanitizer_flags",
 ]
diff --git a/config/android/BUILD.gn b/config/android/BUILD.gn
index b69d42b..c2c0897 100644
--- a/config/android/BUILD.gn
+++ b/config/android/BUILD.gn
@@ -27,6 +27,9 @@ config("compiler") {
     # Forces full rebuilds on NDK rolls. To rebuild everything when NDK version
     # stays the same, increment the suffix number.
     "ANDROID_NDK_VERSION_ROLL=${android_ndk_version}_1",
+    "_GLIBCXX_USE_C99=1",
+    "_GLIBCXX_HAVE_WCSTOF=1",
+    "_GLIBCXX_USE_C99_MATH_TR1=1",
   ]

   if (current_cpu == "mips64el") {
@@ -109,6 +112,26 @@ config("runtime_library") {
                 rebase_path("$android_ndk_root/sources/android/support/include",
                             root_build_dir) ]

+  if (current_cpu == "arm") {
+    cflags_cc += [
+      "-isystem" +
+          rebase_path("$android_ndk_root/sources/cxx-stl/gnu-libstdc++/4.9/include",
+                      root_build_dir),
+      "-isystem" +
+          rebase_path("$android_ndk_root/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include",
+                      root_build_dir),
+    ]
+  } else if (current_cpu == "arm64") {
+    cflags_cc += [
+      "-isystem" +
+          rebase_path("$android_ndk_root/sources/cxx-stl/gnu-libstdc++/4.9/include",
+                      root_build_dir),
+      "-isystem" +
+          rebase_path("$android_ndk_root/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/include",
+                      root_build_dir),
+    ]
+  }
+
   defines = [
     "__GNU_SOURCE=1",  # Necessary for clone().
     "CHROMIUM_CXX_TWEAK_INLINES",  # Saves binary size.
diff --git a/config/compiler/BUILD.gn b/config/compiler/BUILD.gn
index 402dac4..ee3015a 100644
--- a/config/compiler/BUILD.gn
+++ b/config/compiler/BUILD.gn
@@ -1456,7 +1456,7 @@ config("default_warnings") {

       # Don't warn about "maybe" uninitialized. Clang doesn't include this
       # in -Wall but gcc does, and it gives false positives.
-      cflags += [ "-Wno-maybe-uninitialized" ]
+      cflags += [ "-Wno-uninitialized" ]
       cflags += [ "-Wno-deprecated-declarations" ]

       # -Wcomment gives too many false positives in the case a


I built it with these settings:
# Build arguments go here.
# See "gn args <out_dir> --list" for available build arguments.
is_debug = true
android_full_debug = is_debug
is_component_build = false
target_os = "android"
target_cpu = "arm64"
use_custom_libcxx = false
use_custom_libcxx_for_host = true
use_allocator_shim = false
v8_enable_i18n_support = false
v8_use_external_startup_data = false
v8_use_snapshot = false
v8_static_library = true



And I encountered two types of failures. The first one occurs when creating Isolate(Isolate::New).
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : # Fatal error in ../../src/handles.cc, line 86
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : Debug check failed: limit - current->next < kHandleBlockSize (1022 vs. 1022).
07-15 16:02:35.393  7153  7269 E v8      :
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : #FailureMessage Object: 0x74f95e01a0


and the second one is when setting field to prototype template(Template->PrototypeTemplate()->Set()).

07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : # Fatal error in ../../src/api.cc, line 1350
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo().
07-15 13:42:24.488 23217 23318 E v8      :
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #FailureMessage Object: 0x74f95f90e0


I know it's very limited information and the range of the question is broad to you. But I'd like to know where to start. I can provide more information if you need.

Thank you in advance!

Jakob Kummerow

unread,
Jul 15, 2019, 5:05:10 AM7/15/19
to v8-users
On Mon, Jul 15, 2019 at 10:05 AM Jaemin Park <pppa...@gmail.com> wrote:
I built it with these settings:
# Build arguments go here.
# See "gn args <out_dir> --list" for available build arguments.
is_debug = true
android_full_debug = is_debug
is_component_build = false
target_os = "android"
target_cpu = "arm64"
use_custom_libcxx = false
use_custom_libcxx_for_host = true
use_allocator_shim = false
v8_enable_i18n_support = false
v8_use_external_startup_data = false
v8_use_snapshot = false
v8_static_library = true
 
Are you sure you want v8_use_snapshot=false ? It massively slows down startup while providing no benefit that I'm aware of.
 
And I encountered two types of failures. The first one occurs when creating Isolate(Isolate::New).
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : # Fatal error in ../../src/handles.cc, line 86
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : Debug check failed: limit - current->next < kHandleBlockSize (1022 vs. 1022).
07-15 16:02:35.393  7153  7269 E v8      :
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : #FailureMessage Object: 0x74f95e01a0

At first glance, one might suspect that this check should maybe check for <= rather than <, but it's been this way since 2011, so presumably it's working as intended (and, in fact, maybe ruling out the == case is precisely the point here; I'm not familiar with this code). Can you reproduce this without modifications to V8? Creating Isolates generally works in Debug mode, so I wonder what might be different in your environment.
 
and the second one is when setting field to prototype template(Template->PrototypeTemplate()->Set()).

07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : # Fatal error in ../../src/api.cc, line 1350
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo().
07-15 13:42:24.488 23217 23318 E v8      :
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #FailureMessage Object: 0x74f95f90e0

This looks like you're passing an invalid value to the function. It must be a v8::Object or a v8::ObjectTemplate or a v8::FunctionTemplate.

Jaemin Park

unread,
Jul 15, 2019, 6:18:09 AM7/15/19
to v8-users


2019년 7월 15일 월요일 오후 6시 5분 10초 UTC+9, Jakob Kummerow 님의 말:
On Mon, Jul 15, 2019 at 10:05 AM Jaemin Park <pppa...@gmail.com> wrote:
I built it with these settings:
# Build arguments go here.
# See "gn args <out_dir> --list" for available build arguments.
is_debug = true
android_full_debug = is_debug
is_component_build = false
target_os = "android"
target_cpu = "arm64"
use_custom_libcxx = false
use_custom_libcxx_for_host = true
use_allocator_shim = false
v8_enable_i18n_support = false
v8_use_external_startup_data = false
v8_use_snapshot = false
v8_static_library = true
 
Are you sure you want v8_use_snapshot=false ? It massively slows down startup while providing no benefit that I'm aware of.

It is not my intention. I will turn it on again if everything is fine.

 
 
And I encountered two types of failures. The first one occurs when creating Isolate(Isolate::New).
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : # Fatal error in ../../src/handles.cc, line 86
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : Debug check failed: limit - current->next < kHandleBlockSize (1022 vs. 1022).
07-15 16:02:35.393  7153  7269 E v8      :
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : #
07-15 16:02:35.393  7153  7269 E v8      : #FailureMessage Object: 0x74f95e01a0

At first glance, one might suspect that this check should maybe check for <= rather than <, but it's been this way since 2011, so presumably it's working as intended (and, in fact, maybe ruling out the == case is precisely the point here; I'm not familiar with this code). Can you reproduce this without modifications to V8? Creating Isolates generally works in Debug mode, so I wonder what might be different in your environment.

The limit - current->next value varies. There are situations the value is larger than kHandleBlockSize when check failed. 
 
 
and the second one is when setting field to prototype template(Template->PrototypeTemplate()->Set()).

07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : # Fatal error in ../../src/api.cc, line 1350
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo().
07-15 13:42:24.488 23217 23318 E v8      :
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #FailureMessage Object: 0x74f95f90e0

This looks like you're passing an invalid value to the function. It must be a v8::Object or a v8::ObjectTemplate or a v8::FunctionTemplate.


According to code and stack dump, value_obj should be v8::ObjectTemplate or v8::FunctionTemplate. I am going to investigate which type of the object is.
 

Jaemin Park

unread,
Jul 15, 2019, 11:16:38 PM7/15/19
to v8-users

 
 
and the second one is when setting field to prototype template(Template->PrototypeTemplate()->Set()).

07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : # Fatal error in ../../src/api.cc, line 1350
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo().
07-15 13:42:24.488 23217 23318 E v8      :
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #
07-15 13:42:24.488 23217 23318 E v8      : #FailureMessage Object: 0x74f95f90e0

This looks like you're passing an invalid value to the function. It must be a v8::Object or a v8::ObjectTemplate or a v8::FunctionTemplate.


According to code and stack dump, value_obj should be v8::ObjectTemplate or v8::FunctionTemplate. I am going to investigate which type of the object is.
 

My mistake, I checked out which value type makes check failure and it was v8::External, not template ones. But I don't know why this code works on windows platform 

 
Reply all
Reply to author
Forward
0 new messages