programacion passing open c node.js arm cross-compiling

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

Referencia de solución

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 establecer LD_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?