v8::internal::Isolate::Exit() 使用 clang 编译时出现段错误

问题描述 投票:0回答:1

使用 gcc 编译嵌入式 v8

hello-world.cc
(https://chromium.googlesource.com/v8/v8/+/main/samples/hello-world.cc) 代码示例时,它可以正常工作:

$ g++ -I/path/to/v8/include hello-world.cc -o hello_world -fno-rtti -lv8_monolith -lv8_libbase -lv8_libplatform -ldl -L/path/to/v8/out.gn/x64.release.sample/obj/ -pthread -std=c++20 -DV8_COMPRESS_POINTERS -DV8_ENABLE_SANDBOX -ggdb

$ ./hello_world 
Hello, World!
3 + 4 = 7

但是,当我使用 clang 时,当 v8::Isolate::Scope 对象解构时,它会出现段错误:

$ clang++ -I/path/to/v8/include hello-world.cc -o hello_world -fno-rtti -lv8_monolith -lv8_libbase -lv8_libplatform -ldl -L/path/to/v8/out.gn/x64.release.sample/obj/ -pthread -std=c++20 -DV8_COMPRESS_POINTERS -DV8_ENABLE_SANDBOX -ggdb

$ ./hello_world 
Hello, World!
3 + 4 = 7
[1]    684462 segmentation fault (core dumped)  ./hello_world

堆栈跟踪:

#0  v8::internal::Isolate::Exit() () at ../../build/linux/debian_bullseye_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/atomic_base.h:747
#1  0x0000555555698c68 in v8::Isolate::Scope::~Scope (this=0x7fffffffd250) at /path/to/v8/include/v8-isolate.h:312
#2  0x00005555556987ff in main (argc=0x1, argv=0x7fffffffd658) at hello-world.cc:96

$rdi 不是有效的指针 (

0x555500000001
),因此在取消引用时失败:

   0x55555594514a <v8::internal::Isolate::Exit()+10> push   rbx
   0x55555594514b <v8::internal::Isolate::Exit()+11> sub    rsp, 0x10
   0x55555594514f <v8::internal::Isolate::Exit()+15> mov    r14, rdi
 → 0x555555945152 <v8::internal::Isolate::Exit()+18> mov    rbx, QWORD PTR [rdi+0xf380]
   0x555555945159 <v8::internal::Isolate::Exit()+25> test   rbx, rbx
   0x55555594515c <v8::internal::Isolate::Exit()+28> je     0x55555594523e <_ZN2v88internal7Isolate4ExitEv+254>
   0x555555945162 <v8::internal::Isolate::Exit()+34> mov    rax, QWORD PTR [rbx+0x8]
   0x555555945166 <v8::internal::Isolate::Exit()+38> test   rax, rax
   0x555555945169 <v8::internal::Isolate::Exit()+41> je     0x55555594517d <_ZN2v88internal7Isolate4ExitEv+61>

调试gcc版本时,$rdi是

0x00555559b21000
,一个有效的指针。

我已经在 v8 上使用 v12.9 和 HEAD (781c2056824) 尝试过此操作,并在 x86_64 上使用

clang version 18.1.8
gcc version 14.2.1 20240805 (GCC)
。这些是我通过
gn args
:

构建的参数
dcheck_always_on = false
is_component_build = false
is_debug = true
target_cpu = "x64"
use_custom_libcxx = false
v8_monolithic = true
v8_use_external_startup_data = false

我的直觉是这可能是 v8 中的一个错误,但我不确定。

c++ clang v8 embedded-v8
1个回答
0
投票

这可能就是here报告的内容:如果您在 GN args 中使用

is_debug = true
编译 V8,那么您需要在包含 V8 标头的您自己的编译单元中设置
-DV8_ENABLE_CHECKS

(这个要求绝对应该被记录或消除,或者至少以更容易理解的方式失败;它似乎很新,或者至少我最近才听说它。如果您能简短地报告回来,我将不胜感激这是否可以解决您的问题。)

© www.soinside.com 2019 - 2024. All rights reserved.