我正在尝试构建并运行来自Getting started with embedding V8的hello-world.cc示例。我正在从Linux x86 (Windows10Native OS上的Hyper-V Ubuntu虚拟机)交叉编译到Linux Arm64 (碰巧是NVIDIA Jetson Nano)。
当我运行示例时,它在v8::V8::Initialize函数中挂起。
我不知道哪里出了问题。但我会尽我最大的努力概述我采取的步骤。
在x86构建系统(虚拟机)上。
我根据these instructions检查了depot_tools,并执行了相关的后续步骤(使用gclient sync和./build/install-build-deps.sh进行了更新
我根据these instructions获取了v8并做了glient sync。
我从头开始做忍者:
git clone git://github.com/ninja-build/ninja.git && cd ninja
git checkout release
cat README.md
./configure.py --bootstrap
cp ninja /usr/local/bin我安装了clang
sudo apt-get install clang-7 clang-tools-7 clang-7-doc libclang-common-7-dev libclang-7-dev libclang1-7 clang-format-7 python-clang-7
cd /usr/bin
sudo ln -s ../lib/llvm-7/bin/clang clang
sudo ln -s ../lib/llvm-7/bin/clang++ clang++我设置了gn
gn
git clone https://gn.googlesource.com/gn
cd gn
python build/gen.py
ninja -C out然后我尝试构建V8:
cd ~/v8/v8
/home/username/gn/out/gn gen out.gn/arm64.release
/home/username/gn/out/gn args out.gn/arm64.release我使用了以下gn参数:
is_debug = false
target_cpu = "arm64"
v8_target_cpu = "arm64"
v8_monolithic = true
v8_use_external_startup_data = false
target_os = "linux"然后,我将out.gn/aarch64.release文件夹复制到目标arm机器,并尝试在该机器上编译示例。
在Arm64机器上
clang++ -I. -Iinclude src/hello-world.cc -o hello_world -lv8_monolith -Lout.gn/arm64.release/obj -pthread -stdlib=libc++ -DV8_COMPRESS_POINTERS
./hello_world此示例在v8::V8::Initialize中挂起。我通过在hello-world.cc文件的每一行后面添加print语句来验证这一点。
我可能忘了在这篇文章中提供关于安装一些构建必备组件的细节(我以前从这个VM构建过其他东西,所以已经有一段时间了)。我还忽略了详细说明我是如何在Arm系统上对v8进行基本的对称检查的(我实际上并没有在该系统上构建v8 )。
我能够在VM中为x86构建V8,并在该系统上构建和运行hello-world嵌入示例。但是交叉编译Arm并尝试在Arm系统上构建和运行示例时,它只是在初始化期间挂起。
我不知道我可能做错了什么,也不知道应该进一步调查什么。
更新
堆栈似乎在下面:v8::internal::ComputeFlagListHash()
#0 0x0000000000408e80 in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::push_back(char)@plt ()
#1 0x0000000000469064 in std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) ()
#2 0x0000007fb7f1eb24 in std::__1::basic_streambuf<char, std::__1::char_traits<char> >::xsputn(char const*, long) () from /usr/lib/aarch64-linux-gnu/libc++.so.1
#3 0x000000000040a6ec in std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) ()
#4 0x000000000040a1d4 in std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) ()
#5 0x00000000004c7184 in v8::internal::ComputeFlagListHash() ()
#6 0x00000000005af44c in v8::internal::V8::InitializeOncePerProcessImpl() ()
#7 0x0000000000adf744 in v8::base::CallOnceImpl(std::__1::atomic<unsigned char>*, std::__1::function<void ()>) ()
#8 0x00000000005af318 in v8::internal::V8::Initialize() ()
#9 0x000000000042e5f4 in v8::V8::Initialize(int) ()
#10 0x0000000000409b88 in main ()我担心这可能与浮点指令集有关。
仅供参考: /proc/cpuinfo:
processor : 0
model name : ARMv8 Processor rev 1 (v8l)
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x1
CPU part : 0xd07
CPU revision : 1(...actual输出重复4次处理器)
发布于 2020-06-08 12:54:56
事实证明这只是一件小事。我链接到了错误的标准库实现。我只需将此代码添加到gn参数中:
use_custom_libcxx = false然后删除-stdlib=libc++选项。(我应该知道,为了消除链接器错误,我必须首先添加它,这很可疑。)
我必须说,奇怪的是,它只是永远循环,而不是崩溃。
https://stackoverflow.com/questions/62250913
复制相似问题