Compatibilidad de bibliotecas por nodos de comstackción cruzada para armv5

Intento comstackr de forma cruzada el nodo para mi máquina armv5te QNAP, en mi Ubuntu 14.04 Desktop x64.

Existe un nodo QPKG en QNAP App-center, 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 desconocido
Nombre del procesador : Feroceon 88F6281 rev 1 (v5l) a 1.2 GHz
BogoMIPS : 1196.85
Características : swp half thumb fastmult edsp
Implementador de CPU : 0x56
Arquitectura de la CPU : 5TE
Variante de CPU : 0x2
Pieza de CPU : 0x131
Revisión de la CPU : 1
Hardware : Feroceon-KW
ARM Revisión : 0000
Serie : 0000000000000000

Aquí está el comando que usé 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 comstackción no muestra ningún fallo con estos parámetros. Entonces, después de eso, envío el tarball 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 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 anteriores 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 hacerlo?) ¿O tal vez usar librerías estáticas durante la comstackción? (¿Y cómo hacerlo también?) ¿O otras opciones?


EDITAR:

Después de mi conversación con el ruido ingenioso, 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 a la máquina de destino y anule las predeterminadas:
    Podría ser realmente peligroso, y puede bloquear el sistema. Más aún, mi objective es crear un QPKG para la comunidad QNAP, por lo que pedir a las personas que anulen sus C libs no es un método realmente bueno.

  • Copiar bibliotecas y convivir con las originales:
    Un buen método, solo necesita establecer LD_LIBRARY_PATH en un directorio que contenga las librerías más nuevas 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 forma de hacerlo sin ningún error durante la comstackción y durante la ejecución en la máquina de destino. Sólo hay que añadir 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 los enlaces de la biblioteca dinámica:

 # 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, un problema está de nuevo aquí, la mayoría de las funciones de los nodos 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 y algunas características no pueden funcionar?

Finalmente, en lugar de intentar cambiar las bibliotecas, decidí tener un mejor comstackdor cruzado que coincida perfectamente con mi objective.

Utilicé Crosstools-NG para eso, pero también pude usar el QNAP Maxwell-ARM Toolchain oficial (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 un problema siempre estuvo aquí, hay una dependencia de 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 

Referencia de la solución

Con esa configuración, también podría comstackr un nodo con GCC 4.1.3 para procesadores x86. E hice QPKG para los usuarios de QNAP que no quieren comstackr por sí mismos: https://github.com/jbltx/nodejs-QPKG/tree/master/node-v0.10.35

    Intereting Posts