首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >armv5交叉编译节点对库的兼容性

armv5交叉编译节点对库的兼容性
EN

Stack Overflow用户
提问于 2015-01-22 14:43:28
回答 1查看 2.8K关注 0票数 3

我试着在我的Ubuntu14.04桌面节点上为我的QNAP armv5te机器交叉编译armv5te。

QNAP应用中心中存在一个节点QPKG,但是它的版本是旧的(0.8.22)。

以下是有关服务器的信息:

3.4.6 #1 Mon 12月29日06:00:47 CST 2014 armv5tel未知 处理器名称::Ferassion88F6281 rev 1 (v5l) @ 1.2 GHz BogoMIPS:1196.85 特性:swp半拇指紧固edsp CPU实现者:0x56 CPU体系结构:5TE CPU变体:0x2 CPU部件:0x131 CPU修订版:1 硬件:费诺森-千瓦 ARM修订版:0000 系列:0000000000000000

下面是我在桌面上使用的命令:

代码语言:javascript
复制
apt-get update
apt-get upgrade
apt-get install emdebian-archive-keyring
apt-get install libc6-armel-cross libc6-dev-armel-cross
apt-get install binutils-arm-linux-gnueabi
apt-get install gcc-4.7-arm-linux-gnueabi
apt-get install g++-4.7-arm-linux-gnueabi
apt-get install u-boot-tools
apt-get install libncurses5-dev
ln -s /user/bin/arm-linux-gnueabi-gcc-4.7 /usr/bin/arm-linux-gnueabi-gcc
ln -s /user/bin/arm-linux-gnueabi-g++-4.7 /usr/bin/arm-linux-gnueabi-g++

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

export TOOL_PREFIX="arm-linux-gnueabi"
export CC="${TOOL_PREFIX}-gcc"
export CXX="${TOOL_PREFIX}-g++"
export AR="${TOOL_PREFIX}-ar"
export RANLIB="${TOOL_PREFIX}-ranlib"
export LINK="${CXX}"
export CCFLAGS="-march=armv5te -mfpu=softfp -marm"
export CXXFLAGS="-march=armv5te -mno-unaligned-access"
export OPENSSL_armcap=5
export GYPFLAGS="-Darmeabi=soft -Dv8_can_use_vfp_instructions=false -Dv8_can_use_unaligned_accesses=false -Darmv7=0"
export VFP3=off
export VFP2=off

./configure --without-snapshot --dest-cpu=arm --dest-os=linux --prefix="/root/.nvm/v0.10.35"
make -j 4
make install
tar -zcf node-v0.10.35-linux-armv5.tar.gz v0.10.35

编译不会显示带有这些参数的任何失败。在此之后,我将tarball发送到我的QNAP服务器:

代码语言:javascript
复制
scp /root/.nvm/node-v0.10.35-linux-armv5.tar.gz admin@SERVERNAME:/share/HDA_DATA/.qpkg/nodejs
ssh SERVERNAME -l admin
cd /share/HDA_DATA/.qpkg/nodejs
tar -zxf node-v0.10.35-linux-armv5.tar.gz
ln -s v0.10.35 node

我的所有env变量都已经设置在我的服务器上了。现在我可以测试节点二进制..。

代码语言:javascript
复制
# node -v
node: /usr/lib/libstdc++.so.6: version `CXXABI_ARM_1.3.3' not found (required by node)
node: /lib/libc.so.6: version `GLIBC_2.15' not found (required by node)
node: /lib/libc.so.6: version `GLIBC_2.11' not found (required by node)
node: /lib/libc.so.6: version `GLIBC_2.7' not found (required by node)

最后,我有一个错误,因为C库在Ubuntu和Qnap上不一样,对于Ubuntu桌面,我有ldd (Ubuntu EGLIBC 2.19-0ubuntu6.5) 2.19和QNAP ldd (GNU libc) 2.5

libclibstdc++是Optware在Qnap上处理的包(也是旧版本)。

我的问题是,有什么更好的方法来解决这个问题?在服务器上强制更新库?(如何做到这一点?)或者在编译过程中使用静态库?(以及如何做到这一点?)还是其他选择?

编辑:

在我和无艺术的噪音交谈之后,我明白我有几种方法来修复库依赖关系.

所涉依赖关系:

代码语言:javascript
复制
# ldd /opt/bin/node
/opt/node/bin/node: /usr/lib/libstdc++.so.6: version `CXXABI_ARM_1.3.3' not found (required by /opt/node/bin/node)
/opt/node/bin/node: /lib/libc.so.6: version `GLIBC_2.15' not found (required by /opt/node/bin/node)
/opt/node/bin/node: /lib/libc.so.6: version `GLIBC_2.11' not found (required by /opt/node/bin/node)
/opt/node/bin/node: /lib/libc.so.6: version `GLIBC_2.7' not found (required by /opt/node/bin/node)
        libdl.so.2 => /lib/libdl.so.2 (0xb6ed2000)
        librt.so.1 => /lib/librt.so.1 (0xb6ec3000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6de2000)
        libm.so.6 => /lib/libm.so.6 (0xb6d32000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6d1e000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb6cfe000)
        libc.so.6 => /lib/libc.so.6 (0xb6bca000)
        /lib/ld-linux.so.3 (0xb6ee4000)
  • 库从Ubuntu复制到目标计算机,并覆盖默认库: 这可能真的很危险,而且可能会使整个系统陷入泥潭。更多的是,我的目标是为QNAP社区创建一个QPKG,所以要求人们重写他们的C库并不是一个非常好的方法。
  • 复制库和与原始库的共存: 一个不错的方法,只需要将LD_LIBRARY_PATH设置为包含应用程序最新库的dir。但是我在使用这个方法时发现了一个错误,同样是在c++库中。

错误:

代码语言:javascript
复制
node: symbol lookup error: /opt/node/lib/c/libstdc++.so.6: undefined symbol: _ZNSt11__timepunctIcE2idE, version GLIBCXX_3.4
  • 创建静态应用程序: 最后,我找到了在编译期间和在目标机器上执行过程中没有任何错误的方法。只是需要添加一些标志。

新标志:

代码语言:javascript
复制
export CCFLAGS="-march=armv5te -mfpu=softfp -marm -static-libgcc"
export CXXFLAGS="-march=armv5te -mno-unaligned-access -static-libstdc++"
export LDFLAGS="-static"

检查动态库链接:

代码语言:javascript
复制
# ldd /opt/bin/node
    not a dynamic executable
# npm version
{ test: '1.0.0',
  npm: '2.3.0',
  ares: '1.9.0-DEV',
  http_parser: '1.0',
  modules: '11',
  node: '0.10.35',
  openssl: '1.0.1j',
  uv: '0.10.30',
  v8: '3.14.5.9',
  zlib: '1.2.8' }

编辑:终于出现了一个问题,大部分节点函数都能工作,但http却没有.

我测试了一个简单的脚本(来自NodeJS API)以获取有关网页的信息:

代码语言:javascript
复制
http.get("http://www.google.com/index.html", function(res) {
  console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

我得到了Got error: getaddrinfo ENOTFOUND,因为节点是静态的,有些特性不能工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-23 01:38:25

最后,我没有试图改变库,而是决定拥有一个与我的目标完全匹配的更好的交叉编译器。

我使用了克罗斯托-NG,但我也可以使用官方的QNAP Maxwell臂工具链 (我看到它太晚了.)

代码语言:javascript
复制
gcc (GCC) 4.2.4
g++ (GCC) 4.2.4
GNU ld (crosstool-NG 1.20.0) 2.19.1
ldd (crosstool-NG) 1.20.0
Python 2.7.6 (with gyp)

但是一直存在一个问题,一个节点依赖(利布夫)使用了一个名为linux原子的库,这个库是从4.4.X版本开始在GCC中引入的。

代码语言:javascript
复制
cd /src
wget -q https://ftp.gnu.org/gnu/gcc/gcc-4.6.3/gcc-core-4.6.3.tar.gz
tar -zxf gcc-core-4.6.3.tar.gz
sed -i -e 's/define HIDDEN.*/define HIDDEN/' /src/gcc-4.6.3/gcc/config/arm/linux-atomic.c
export CC=arm-none-linux-gnueabi-gcc
export AR=arm-none-linux-gnueabi-ar
export RANLIB=arm-none-linux-gnueabi-ranlib
cd /src/gcc-4.6.3/gcc/config/arm
libtool --tag=CC --mode=compile $CC -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c
$AR cru /src/gcc-4.6.3/gcc/config/arm/.libs/liblinux-atomic.a /src/gcc-4.6.3/gcc/config/arm/.libs/linux-atomic.o
$RANLIB /src/gcc-4.6.3/gcc/config/arm/.libs/liblinux-atomic.a

# IMPORTANT: Assign environment variables like I made in my question above.

# Go to node src dir and configure
./configure --without-snapshot --dest-cpu=arm --dest-os=linux --prefix="${PREFIX_DIR}"

# When configuration is done, edit out/node.target.mk
vi out/node.target.mk

# Find LD_INPUTS files list and add your new library as last one:
# -> /src/gcc-4.6.3/gcc/config/arm/.libs/liblinux-atomic.a

# Now you can build node !
make -j4   #-jX where X is the number of available cores
make install DESTDIR=$TEMPDIR # Use DESTDIR to avoid installation directly in $PREFIX_DIR path

变通参考

有了这种配置,我还可以用GCC 4.1.3为x86处理器编译节点。我为不想自己编译的QNAP用户创建了QPKG:https://github.com/jbltx/nodejs-QPKG/tree/master/node-v0.10.35

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28091510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档