【问题标题】:Cross-compiling V8 for Arm - hello-world hangs during Initialize为 Arm 交叉编译 V8 - hello-world 在初始化期间挂起
【发布时间】:2020-06-07 20:00:53
【问题描述】:

我正在尝试从Getting started with embedding V8 构建和运行 hello-world.cc 示例。我正在从 Linux x86(Windows 10 Native 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 文件的每一行之后添加打印语句来验证这一点。

我可能忽略了在这篇文章中提供有关安装一些构建要素的详细信息(我之前已经从这个 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

(...实际输出重复 4 个处理器)

【问题讨论】:

    标签: arm cross-compiling v8


    【解决方案1】:

    原来是一件小事。我正在链接错误的标准库实现。我只需要将它添加到我的 gn args 中:

    use_custom_libcxx = false
    

    然后删除-stdlib=libc++ 选项。 (应该知道,我不得不首先添加它以消除链接器错误。)

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

    【讨论】:

      猜你喜欢
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2015-07-19
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      相关资源
      最近更新 更多