c - passing - open mpi
Compatibildad de bibliotecas por nodo de compilaciĆ³n cruzada para armv5 (1)
Finalmente, en lugar de intentar cambiar las bibliotecas, decidí tener un mejor compilador cruzado que coincida perfectamente con mi objetivo.
Usé Crosstools-NG para eso, pero también pude usar el QNAP Maxwell-ARM Toolchain (lo vi demasiado tarde ...)
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)
Pero siempre había un problema aquí, hay una dependencia del nodo ( libuv ) que usa una biblioteca llamada linux-atomic , y esa biblioteca se introdujo en GCC desde la versión 4.4.X. Así que aquí está la solución que hice para solucionarlo:
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
Con esa configuración, también pude compilar el nodo con GCC 4.1.3 para procesadores x86. E hice QPKG para usuarios de QNAP que no quieren compilar por sí mismos: https://github.com/jbltx/nodejs-QPKG/tree/master/node-v0.10.35
Intento el nodo de compilación cruzada para mi máquina QNAP armv5te, en mi Ubuntu 14.04 Desktop x64.
Existe un nodo QPKG en el App-center de QNAP, pero su versión es antigua (0.8.22).
Aquí hay información sobre el servidor:
Linux SERVERNAME 3.4.6 # 1 lun 29 de diciembre 06:00:47 CST 2014 armv5tel unknown
Nombre del procesador : Feroceon 88F6281 rev 1 (v5l) @ 1.2 GHz
BogoMIPS : 1196.85
Características : swp half thumb fastmult edsp
Implementador de CPU : 0x56
Arquitectura de CPU : 5TE
Variante de CPU : 0x2
Parte de la CPU : 0x131
Revisión de la CPU : 1
Hardware : Feroceon-KW
Revisión ARM : 0000
Serie : 0000000000000000
Aquí está el comando que utilicé en mi escritorio:
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
La compilación no muestra ningún error con estos parámetros. Luego de eso envío el archivo tar a mi servidor QNAP:
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
Todas mis variables env ya están configuradas en mi servidor. Ahora puedo probar el nodo binario ...
# 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)
Finalmente tengo un error porque las bibliotecas de C no son las mismas en Ubuntu y Qnap, para el escritorio de Ubuntu tengo ldd (Ubuntu EGLIBC 2.19-0ubuntu6.5) 2.19
y en QNAP ldd (GNU libc) 2.5
.
libc-dev y libstdc ++ son paquetes manejados por Optware ipkg en Qnap, (versiones antiguas también).
Mi pregunta es ¿cuál es la mejor manera de solucionar este problema? ¿Forzar la actualización de libs en el servidor? (¿y cómo hacer eso?) ¿O tal vez usar libs estáticas durante la compilación? (¿y cómo hacer eso también?) u otras opciones?
EDITAR:
Después de mi conversación con el ruido ingenuo, entendí que tenía varias formas de arreglar las dependencias de la biblioteca ...
Dependencias en cuestión:
# 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)
Copie las bibliotecas de Ubuntu GCC en la máquina de destino y anule las predeterminadas:
Podría ser realmente peligroso y puede dañar el sistema. Para más, mi objetivo es crear un QPKG para la comunidad QNAP, así que pedir a las personas que anulen sus bibliotecas no es un método realmente agradable.Copie bibliotecas y cohabit con las originales:
Un buen método, solo necesita establecerLD_LIBRARY_PATH
en un directorio que contenga las últimas librerías para la aplicación. Pero encontré un error al usar este método, nuevamente con c ++ lib.
El error:
node: symbol lookup error: /opt/node/lib/c/libstdc++.so.6: undefined symbol: _ZNSt11__timepunctIcE2idE, version GLIBCXX_3.4
- Crea una aplicación estática:
Finalmente, encontré la manera de hacerlo sin ningún error durante la compilación y durante la ejecución en la máquina de destino. Solo necesito agregar algunas banderas.
Nuevas banderas:
export CCFLAGS="-march=armv5te -mfpu=softfp -marm -static-libgcc"
export CXXFLAGS="-march=armv5te -mno-unaligned-access -static-libstdc++"
export LDFLAGS="-static"
Comprobando enlaces de biblioteca dinámicos:
# 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'' }
EDITAR: Finalmente, nuevamente hay un problema aquí, la mayoría de las funciones del nodo funcionan, pero no http
...
Probé un script simple (de NodeJS API) para obtener información sobre una página web:
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);
});
Y obtuve el Got error: getaddrinfo ENOTFOUND
, ¿es posible porque el nodo es estático algunas características no pueden funcionar?