图书馆相容性由ARMv5的交叉编译节点 [英] Libraries compatibilty by cross-compiling node for armv5
问题描述
我尝试交叉编译节点我QNAP的ARMv5TE机器,在我的Ubuntu 14.04桌面64位。
I try to cross-compile node for my QNAP armv5te machine, on my Ubuntu 14.04 Desktop x64.
的节点QPKG存在于QNAP应用中心,但其版本是旧的(0.8.22)。的结果
下面是有关服务器的信息:
A node QPKG exists in QNAP App-center, but its version is old (0.8.22).
Here are informations about the server :
Linux的服务器名称3.4.6#1星期一12月29日6时00分47秒CST 2014年armv5tel未知结果
处理器名称:Feroceon 88F6281 REV 1(V5L)@ 1.2 GHz的结果
BogoMIPS :1196.85结果
功能:SWP一半拇指fastmult EDSP结果
CPU实施者:0x56结果
CPU架构:5TE结果
CPU变种:0X2结果
CPU部分:0x131结果
CPU修订:1结果
硬件:Feroceon-KW结果
ARM修订:0000结果
串行:0000000000000000
Linux SERVERNAME 3.4.6 #1 Mon Dec 29 06:00:47 CST 2014 armv5tel unknown
Processor name : Feroceon 88F6281 rev 1 (v5l) @ 1.2 GHz
BogoMIPS : 1196.85
Features : swp half thumb fastmult edsp
CPU implementer : 0x56
CPU architecture: 5TE
CPU variant : 0x2
CPU part : 0x131
CPU revision : 1
Hardware : Feroceon-KW
ARM Revision : 0000
Serial : 0000000000000000
下面是我在我的桌面上使用的命令:
Here's the command I used on my desktop :
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
编译不显示与这些参数的任何故障。所以之后,我压缩包发送到我的服务器QNAP:
The compilation doesn't show any failures with these parameters. So after that I send the tarball to my QNAP server:
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变量已经设置我的服务器上。现在,我可以测试节点的二进制...
All my env variables are already set on my server. Now I can test node binary...
# 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和威联通一样的,Ubuntu桌面我有 LDD(Ubuntu的EGLIBC 2.19-0ubuntu6.5)2.19
和在QNAP LDD(GNU libc中)2.5
。
的libc-dev的和的libstdc ++ 是由在QNAP Optware公司的ipkg处理包,(旧版本太)。
libc-dev and libstdc++ are packages handled by Optware ipkg on Qnap, (old versions too).
我的问题是什么是更好的方式来解决这个问题?强制更新服务器库? (以及如何做到这一点?)或编译过程中可能会使用静态库? (以及如何做到这一点?)还是其他选择?
My question is what is the better way to fix this problem ? Force updating libs on server ? (and how to do that ?) Or maybe use static libs during compilation ? ( and how to do that too ?) Or other options ?
编辑:
我与烂漫噪声谈话之后,我知道我有几个方法可以解决库的依赖...
After my conversation with artless-noise, I understood I had several ways to fix library dependencies...
问题依赖:
# 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的GCC 复制库到目标机器,并覆盖默认的:结果
这可能是非常危险的,并且可能砖系统。为了多了,我的目标是创建QNAP社区QPKG,所以要求人们超越C语言的库不是一个非常好的方法。Copy libraries from Ubuntu GCC to the target machine, and override default ones :
It could be really dangerous, and may brick the system. To more, my goal is to create a QPKG for QNAP community, so ask people to override their C libs is not a really nice method.复制库,并与原有的同居:结果
一个很好的方法,只需要LD_LIBRARY_PATH
设置为包含应用程序最新的库一个目录。但是,我发现了一个错误使用这种方法,再次用C ++库。Copy libraries and cohabit with original ones :
A nice method, just need to setLD_LIBRARY_PATH
to a dir containing newest libs for the application. But I found an error using this method, again with c++ lib.错误:
node: symbol lookup error: /opt/node/lib/c/libstdc++.so.6: undefined symbol: _ZNSt11__timepunctIcE2idE, version GLIBCXX_3.4
- 创建静态应用程序:结果
最后,我发现在编译过程中做到这一点没有任何错误的方式,并在目标机器上执行期间。只需要添加一些标志。
新标志:
export CCFLAGS="-march=armv5te -mfpu=softfp -marm -static-libgcc" export CXXFLAGS="-march=armv5te -mno-unaligned-access -static-libstdc++" export LDFLAGS="-static"
检查动态库链接:
# 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
...
Finally a problem is again here, most of the node functions work, but not
http
...我测试了一个简单的脚本(来自API的NodeJS),以获取有关网页信息:
i tested a simple script (from NodeJS API) to get info about a web page:
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); });
和我得到了
遇到错误:的getaddrinfo ENOTFOUND
,它是可能的,因为节点是静态的某些功能无法正常工作And I got
Got error: getaddrinfo ENOTFOUND
, is it possible because node is static some features can't work ?推荐答案
最后,而不是试图改变图书馆,我决定有一个更好的交叉编译它与我的目标完全吻合。
Finally, instead of trying to change libraries, I decided to have a better cross-compiler which matches with my target perfectly.
我用 Crosstools-NG 作为,但我可以用官方的 QNAP麦克斯韦 - ARM工具链 太(我看到了它为时已晚......)
I used Crosstools-NG for that, but I could use the official QNAP Maxwell-ARM Toolchain too (I saw it too late...)
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)
但问题是总是在这里,有一个节点dependecy( libuv ),它使用一个名为库 Linux的原子,而库GCC从版本4.4.X.介绍因此,这里是我做了修复它的解决方法:
But a problem was always here, there's a node dependecy (libuv) which uses a library named linux-atomic, and that library was introduced in GCC since version 4.4.X. So here is the workaround I made to fix it :
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处理器节点。我让QPKG对谁不希望自己编译QNAP用户:的 https://github.com/jbltx/nodejs-QPKG/tree/master/node-v0.10.35
With that configuration, I also could compile node with GCC 4.1.3 for x86 processors. And I made QPKG for QNAP users who doesn't want to compile by themselves : https://github.com/jbltx/nodejs-QPKG/tree/master/node-v0.10.35
这篇关于图书馆相容性由ARMv5的交叉编译节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- 创建静态应用程序:结果