交叉编译Arm的V8--hello-world在初始化时挂起

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

我正试图构建并运行来自于 开始嵌入V8. 我正在从Linux x86(Windows 10 Native OS上的Hyper-V Ubuntu虚拟机)交叉编译到Linux Arm64(正好是NVIDIA Jetson Nano)。

当我运行示例时,它挂在了 v8::V8::Initialize 功能。

我不知道哪里出了问题。 但我会尽力概述我所采取的步骤。

在x86构建系统(虚拟机)上。

我检查出了depot_tools根据 本说明 并做了相关的后续步骤(更新后有 gclient sync./build/install-build-deps.sh

我取了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 args:

is_debug = false
target_cpu = "arm64"
v8_target_cpu = "arm64"
v8_monolithic = true
v8_use_external_startup_data = false
target_os = "linux"

然后我把out.gnaarch64.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文件的每一行后添加打印语句来验证这一点。

我可能忽略了在这篇文章中提供关于安装一些构建必需品的细节(我以前用这个虚拟机构建过其他东西,所以已经有一段时间了),我也忽略了详细说明我是如何在Arm系统上对v8进行对称检查的(我只是没有在该系统上真正构建v8)。

我能够在虚拟机内构建x86的v8,并在该系统上构建和运行hello-world嵌入样本。 但是在Arm系统上交叉编译并尝试在Arm系统上构建和运行示例时,它只是在Initialize期间挂起。

我不知道我可能做错了什么,也不知道该进一步调查什么。

更新

貌似堆栈在下面。 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 ()

我担心这可能与浮点指令集有关。

顺便说一下:proccpuinfo:

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

(... ...实际输出是重复4个处理器的次数)

arm cross-compiling v8
1个回答
0
投票

原来是一件小事。 我是针对错误的标准库实现进行链接的。 我只需要在我的gn args中添加这个。

use_custom_libcxx = false

然后删除 -stdlib=libc++ 选项。 (早该知道,当初为了摆脱链接器错误,我不得不加上它,真是可疑)。

我必须说,它只是永远地循环而不是崩溃,这很奇怪。

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