web-dev-qa-db-ja.com

ARMアーキテクチャ用にnode.jsをクロスコンパイルするにはどうすればよいですか?GCCはFP ABI用にコンパイルされたABIを報告しません

環境

  • TARGETシングルボードコンピューター:FriendlyARM mini210s
  • ターゲットLinux:3.0.8 armv7l
  • Vagrant box Ubuntu Precise64でのクロスコンパイル

GCC4.5.1とのクロスコンパイル

  • arm-none-linux-gnueabi-gcc(ctng-1.8.1-FA)4.5.1

arm-none-linux-gnueabi-gcc --verbose

Using built-in specs.
COLLECT_GCC=arm-none-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/opt/FriendlyARM/toolschain/4.5.1/libexec/gcc/arm-none-linux-gnueabi/4.5.1/lto-wrapper
Target: arm-none-linux-gnueabi
Configured with: /work/toolchain/build/src/gcc-4.5.1/configure --build=i686-build_pc-linux-gnu --Host=i686-build_pc-linux-gnu --target=arm-none-linux-gnueabi --prefix=/opt/FriendlyARM/toolschain/4.5.1 --with-sysroot=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root --enable-languages=c,c++ --disable-multilib --with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp --with-pkgversion=ctng-1.8.1-FA --with-bugurl=http://www.arm9.net/ --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --with-Host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-gmp=/work/toolchain/build/arm-none-linux-gnueabi/build/static --with-mpfr=/work/toolchain/build/arm-none-linux-gnueabi/build/static --with-ppl=/work/toolchain/build/arm-none-linux-gnueabi/build/static --with-cloog=/work/toolchain/build/arm-none-linux-gnueabi/build/static --with-mpc=/work/toolchain/build/arm-none-linux-gnueabi/build/static --with-libelf=/work/toolchain/build/arm-none-linux-gnueabi/build/static --enable-threads=posix --with-local-prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.5.1 (ctng-1.8.1-FA) 

エラーが発生し、「お使いのバージョンのGCCはFP ABIコンパイル済み」を報告しません。」というメッセージが表示されます。

以下、私が行った手順は次のとおりです。

Node.jsを取得する

wget http://nodejs.org/dist/v0.10.35/node-v0.10.35.tar.gz 
tar xzvf node-v0.10.35.tar.gz 
cd node-v0.10.35/

設定環境

export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin
export PKG_CONFIG_PATH=/usr/arm-linux-gnueabi/lib/pkgconfig 
export CC=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-gcc
export CXX=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g++
export AR=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-ar
export RANLIB=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-ranlib
export LINK="${CXX}"
export CCFLAGS="-march=armv7-a -mtune=cortex-a8 -mfpu=vfp -mfloat-abi=hard -DUSE_EABI_HARDFLOAT"
export CXXFLAGS="-march=armv7-a -mtune=cortex-a8 -mfpu=vfp -mfloat-abi=hard -DUSE_EABI_HARDFLOAT"
export OPENSSL_armcap=7
export GYPFLAGS="-Darmeabi=hard -Dv8_use_arm_eabi_hardfloat=true -Dv8_can_use_vfp3_instructions=true -Dv8_can_use_vfp2_instructions=true -Darm7=1"
export VFP3=on
export VFP2=on
export PREFIX_DIR=/usr/arm-linux-gnueabi

構成、設定

vagrant@vagrant:~/node-v0.10.35$ ./configure --without-snapshot --without-ssl --dest-cpu=arm --dest-os=linux --with-arm-float-abi=hard --prefix="${PREFIX_DIR}"

 { 'target_defaults': { 'cflags': [],
                       'default_configuration': 'Release',
                       'defines': [],
                       'include_dirs': [],
                       'libraries': []},
  'variables': { 'arm_fpu': 'vfpv2',
                 'arm_neon': 0,
                 'armv7': 0,
                 'clang': 0,
                 'gcc_version': 45,
                 'Host_Arch': 'arm',
                 'node_install_npm': 'true',
                 'node_prefix': '/usr/arm-linux-gnueabi',
                 'node_shared_cares': 'false',
                 'node_shared_http_parser': 'false',
                 'node_shared_libuv': 'false',
                 'node_shared_openssl': 'false',
                 'node_shared_v8': 'false',
                 'node_shared_zlib': 'false',
                 'node_tag': '',
                 'node_unsafe_optimizations': 0,
                 'node_use_dtrace': 'false',
                 'node_use_etw': 'false',
                 'node_use_openssl': 'false',
                 'node_use_perfctr': 'false',
                 'node_use_systemtap': 'false',
                 'openssl_no_asm': 0,
                 'python': '/usr/bin/python',
                 'target_Arch': 'arm',
                 'v8_enable_gdbjit': 0,
                 'v8_no_strict_aliasing': 1,
                 'v8_use_arm_eabi_hardfloat': 'true',
                 'v8_use_snapshot': 'false',
                 'want_separate_Host_toolset': 0}}
creating  ./config.gypi
creating  ./config.mk

問題

makeを実行した後、次のメッセージが表示されます。

お使いのGCCのバージョンは、FP ABI用にコンパイルされたものを報告しません。

vagrant@vagrant:~/node-v0.10.35$ make -j 2
make -C out BUILDTYPE=Release V=1
make[1]: Entering directory `/home/vagrant/node-v0.10.35/out'
  /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g++ '-DENABLE_DEBUGGER_SUPPORT' '-DENABLE_EXTRA_CHECKS' '-DV8_TARGET_Arch_ARM' '-DUSE_EABI_HARDFLOAT=1' '-DCAN_USE_VFP2_INSTRUCTIONS' -I../deps/v8/src  -Wall -Wextra -Wno-unused-parameter -pthread -fno-strict-aliasing -mfloat-abi=hard -O2 -fno-strict-aliasing -fno-tree-vrp -fno-omit-frame-pointer -fno-rtti -fno-exceptions -MMD -MF /home/vagrant/node-v0.10.35/out/Release/.deps//home/vagrant/node-v0.10.35/out/Release/obj.target/v8_base/deps/v8/src/platform-linux.o.d.raw -march=armv7-a -mtune=cortex-a8 -mfpu=vfp -mfloat-abi=hard -DUSE_EABI_HARDFLOAT -c -o /home/vagrant/node-v0.10.35/out/Release/obj.target/v8_base/deps/v8/src/platform-linux.o ../deps/v8/src/platform-linux.cc
  /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g++ '-DENABLE_DEBUGGER_SUPPORT' '-DENABLE_EXTRA_CHECKS' '-DV8_TARGET_Arch_ARM' '-DUSE_EABI_HARDFLOAT=1' '-DCAN_USE_VFP2_INSTRUCTIONS' -I../deps/v8/src  -Wall -Wextra -Wno-unused-parameter -pthread -fno-strict-aliasing -mfloat-abi=hard -O2 -fno-strict-aliasing -fno-tree-vrp -fno-omit-frame-pointer -fno-rtti -fno-exceptions -MMD -MF /home/vagrant/node-v0.10.35/out/Release/.deps//home/vagrant/node-v0.10.35/out/Release/obj.target/v8_base/deps/v8/src/platform-posix.o.d.raw -march=armv7-a -mtune=cortex-a8 -mfpu=vfp -mfloat-abi=hard -DUSE_EABI_HARDFLOAT -c -o /home/vagrant/node-v0.10.35/out/Release/obj.target/v8_base/deps/v8/src/platform-posix.o ../deps/v8/src/platform-posix.cc
../deps/v8/src/platform-linux.cc:223:2: error: #error "Your version of GCC does not report the FP ABI compiled for." "Please report it on this issue" "http://code.google.com/p/v8/issues/detail?id=2140"
../deps/v8/src/platform-linux.cc: In static member function 'static bool v8::internal::OS::ArmUsingHardFloat()':
../deps/v8/src/platform-linux.cc:230:1: warning: no return statement in function returning non-void
make[1]: *** [/home/vagrant/node-v0.10.35/out/Release/obj.target/v8_base/deps/v8/src/platform-linux.o] Error 1
make[1]: *** Waiting for unfinished jobs....
../deps/v8/src/platform-posix.cc: In static member function 'static int v8::internal::OS::VSNPrintF(v8::internal::Vector<char>, const char*, va_list)':
../deps/v8/src/platform-posix.cc:338:5: note: the mangling of 'va_list' has changed in GCC 4.4
make[1]: Leaving directory `/home/vagrant/node-v0.10.35/out'
make: *** [node] Error 2

この問題はhard abisoft abi ...に関連しているようですが、どのような違いがあるのか​​わかりません。

hard abiとは何ですか? node.jsクロスコンパイルに必要ですか?

UPDATE GCC4.6.3とのクロスコンパイル

  • arm-linux-gnueabihf-g++(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3

環境

export CC=/usr/bin/arm-linux-gnueabihf-gcc
export CXX=/usr/bin/arm-linux-gnueabihf-g++
export AR=/usr/bin/arm-linux-gnueabihf-ar
export RANLIB=/usr/bin/arm-linux-gnueabihf-ranlib

同じconfigureコマンドを実行してからmakeを実行すると、今回は別のエラーが発生します。

/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/bin/ld: warning: ld-linux.so.3, needed by /usr/lib/gcc/arm-linux-gnueabihf/4.6/libstdc++.so, not found (try using -rpath or -rpath-link)
/home/vagrant/node-v0.10.35/out/Release/obj.target/node/src/node.o: In function `node::Init(int, char**)':
node.cc:(.text+0x2be0): undefined reference to `node::SSL2_ENABLE'
node.cc:(.text+0x2c00): undefined reference to `node::SSL3_ENABLE'
collect2: ld returned 1 exit status
make[1]: *** [/home/vagrant/node-v0.10.35/out/Release/node] Error 1
make[1]: Leaving directory `/home/vagrant/node-v0.10.35/out'
make: *** [node] Error 2
3
zabumba

GCC4.5.1の使用-失敗

arm-none-linux-gnueabi-gcc(ctng-1.8.1-FA)4.5.1は、エラーメッセージに記載されているように、コンパイルされたFP ABI)を報告しません。 詳細については、問題

RobertまたはThiagoの提案に従って、./configure --with-arm-float-abi=softpfsoftを使用しようとしました。私はこの道をずっとたどりませんでした。

環境

export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin
export PKG_CONFIG_PATH=/usr/arm-linux-gnueabi/lib/pkgconfig 
export CC=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-gcc
export CXX=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g++
export AR=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-ar
export RANLIB=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-ranlib
export LINK="${CXX}"
export CCFLAGS="-march=armv7-a -mtune=cortex-a8 -mfpu=vfp -mfloat-abi=soft "
export CXXFLAGS="-march=armv7-a -mtune=cortex-a8 -mfpu=vfp -mfloat-abi=soft "
export OPENSSL_armcap=7
export GYPFLAGS="-Darmeabi=soft -Dv8_use_arm_eabi_hardfloat=false -Dv8_can_use_vfp3_instructions=true -Dv8_can_use_vfp2_instructions=true -Darm7=1"
export VFP3=on
export VFP2=on
export PREFIX_DIR=/usr

構成、設定

  ./configure --without-snapshot --dest-cpu=arm --dest-os=linux --with-arm-float-abi=soft --prefix="${PREFIX_DIR}" 

「お使いのバージョンのGCCはFP ABIコンパイル済み」エラーを報告しません

vagrant@vagrant:~/node-v0.10.35$ make
make -C out BUILDTYPE=Release V=1
make[1]: Entering directory `/home/vagrant/node-v0.10.35/out'
  /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g++ '-DENABLE_DEBUGGER_SUPPORT' '-DENABLE_EXTRA_CHECKS' '-DV8_TARGET_Arch_ARM' '-DUSE_EABI_HARDFLOAT=0' -I../deps/v8/src  -Wall -Wextra -Wno-unused-parameter -pthread -fno-strict-aliasing -O2 -fno-strict-aliasing -fno-tree-vrp -fno-omit-frame-pointer -fno-rtti -fno-exceptions -MMD -MF /home/vagrant/node-v0.10.35/out/Release/.deps//home/vagrant/node-v0.10.35/out/Release/obj.target/v8_base/deps/v8/src/platform-linux.o.d.raw -march=armv7-a -mtune=cortex-a8 -mfpu=vfp -mfloat-abi=soft  -c -o /home/vagrant/node-v0.10.35/out/Release/obj.target/v8_base/deps/v8/src/platform-linux.o ../deps/v8/src/platform-linux.cc
../deps/v8/src/platform-linux.cc:223:2: error: #error "Your version of GCC does not report the FP ABI compiled for." "Please report it on this issue" "http://code.google.com/p/v8/issues/detail?id=2140"
../deps/v8/src/platform-linux.cc: In static member function 'static bool v8::internal::OS::ArmUsingHardFloat()':
../deps/v8/src/platform-linux.cc:230:1: warning: no return statement in function returning non-void
make[1]: *** [/home/vagrant/node-v0.10.35/out/Release/obj.target/v8_base/deps/v8/src/platform-linux.o] Error 1
make[1]: Leaving directory `/home/vagrant/node-v0.10.35/out'
make: *** [node] Error 2

GCC4.6.3の使用-クロスコンパイルパス

Configureコマンドの--without-sslを削除し、arm-linux-gnueabihf-g++(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3で正常にコンパイルされました(エラーなし)。

vagrant@vagrant:~/node-v0.10.35$ ./configure --without-snapshot --dest-cpu=arm --dest-os=linux --with-arm-float-abi=hard --prefix="${PREFIX_DIR}"

それはコンパイルされ、ターゲット上でうまく実行されます!

ただし、npmは質問の投稿エラーを示します ここ

2
zabumba

ベクトル浮動小数点ユニットが必要だと言っているようです(-mfpu=vfp)、ただしGCCはハード浮動小数点命令(-mfloat-abi=hard -DUSE_EABI_HARDFLOAT)。

から GCC ARM options

VFPコプロセッサーでの-mfloat-abi = hardの使用はサポートされていません。 -mfloat-abi = softfpを適切な-mfpuオプションとともに使用して、コンパイラーがこれらのCPUのハードウェア浮動小数点機能を利用するコードを生成できるようにします。

TI AM3505(Cortex A8 + FPU)で次のオプションを使用すると、正常にコンパイルされます(GCC 4.8.2)。

-march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8

1
Robert Calhoun