openssl raspberry-pi rust cross-compiling

Cross compile herrumbre-openssl para Raspberry Pi 2



raspberry-pi rust (1)

Estoy en una máquina Debian y quiero realizar una compilación cruzada de un proyecto para mi Raspberry Pi 2. He logrado hacerlo para un mundo de hello simple utilizando rustup, pero no he podido encontrar la manera de cruzar la compilación de la caja de rust-openssl .

He compilado openssl con arm-linux-gnueabihf-gcc y lo he instalado en mi directorio home/opensslArm .

Cuando corro

OPENSSL_LIB_DIR=/home/johann/opensslArm/lib OPENSSL_INCLUDE_DIR=/home/johann/opensslArm/include cargo build --target=armv7-unknown-linux-gnueabihf

Me sale este error:

failed to run custom build command for `openssl-sys-extras v0.7.11` Process didn''t exit successfully: `/home/johann/projects/test/target/debug/build/openssl-sys-extras-e1c84960cd35bc93/build-script-build` (exit code: 101) --- stdout TARGET = Some("armv7-unknown-linux-gnueabihf") OPT_LEVEL = Some("0") PROFILE = Some("debug") TARGET = Some("armv7-unknown-linux-gnueabihf") debug=true opt-level=0 HOST = Some("x86_64-unknown-linux-gnu") TARGET = Some("armv7-unknown-linux-gnueabihf") TARGET = Some("armv7-unknown-linux-gnueabihf") HOST = Some("x86_64-unknown-linux-gnu") CC_armv7-unknown-linux-gnueabihf = None CC_armv7_unknown_linux_gnueabihf = None TARGET_CC = None CC = None HOST = Some("x86_64-unknown-linux-gnu") TARGET = Some("armv7-unknown-linux-gnueabihf") HOST = Some("x86_64-unknown-linux-gnu") CFLAGS_armv7-unknown-linux-gnueabihf = None CFLAGS_armv7_unknown_linux_gnueabihf = None TARGET_CFLAGS = None CFLAGS = None running: "arm-linux-gnueabihf-gcc" "-O0" "-ffunction-sections" "-fdata-sections" "-g" "-fPIC" "-march=armv7-a" "-o" "/home/johann/projects/test/target/armv7-unknown-linux-gnueabihf/debug/build/openssl-sys-extras-e1c84960cd35bc93/out/src/openssl_shim.o" "-c" "src/openssl_shim.c" ExitStatus(ExitStatus(256)) command did not execute successfully, got: exit code: 1 --- stderr In file included from src/openssl_shim.c:1:0: /usr/include/openssl/hmac.h:61:34: fatal error: openssl/opensslconf.h: No such file or directory compilation terminated. thread ''<main>'' panicked at ''explicit panic'', /home/johann/.cargo/registry/src/github.com-88ac128001ac3a9a/gcc-0.3.28/src/lib.rs:840 note: Run with `RUST_BACKTRACE=1` for a backtrace.

Me sale el mismo error si exporto las variables en cuestión.

No sé exactamente qué se supone que debo hacer, no soy un experto en la compilación cruzada. ¿Alguien ha logrado hacer esto?

EDITAR: Estaba usando rust-openssl 0.7.11. La actualización a 0.7.13 solucionó este problema (ahora puedo ver la carga compilando las dependencias de rust-openssl sin un error) pero ahora tengo otra:

error: linking with `arm-linux-gnueabihf-gcc` failed: exit code: 1 ... note: /usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/bin/ld: /home/johann/opensslArm/lib/libssl.a(s23_meth.o): relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol'' can not be used when making a shared object; recompile with -fPIC /home/johann/opensslArm/lib/libssl.a: error adding symbols: Bad value

¿Cómo puedo agregar la bandera -fPIC ? ¿Debería recompilar opensslArm con banderas específicas?


Debe pasar la opción shared al configurar la compilación de openssl (esto hará que se -fPIC parámetro -fPIC al compilador).

Aquí hay una secuencia de comandos que utilicé para probar la compilación cruzada de un programa de Rust que imprime la versión de openssl:

cd /tmp wget https://www.openssl.org/source/openssl-1.0.1t.tar.gz tar xzf openssl-1.0.1t.tar.gz export MACHINE=armv7 export ARCH=arm export CC=arm-linux-gnueabihf-gcc cd openssl-1.0.1t && ./config shared && make && cd - export OPENSSL_LIB_DIR=/tmp/openssl-1.0.1t/ export OPENSSL_INCLUDE_DIR=/tmp/openssl-1.0.1t/include cargo new xx --bin cd xx mkdir .cargo cat > .cargo/config << EOF [target.armv7-unknown-linux-gnueabihf] linker = "arm-linux-gnueabihf-gcc" EOF cat > src/main.rs << EOF extern crate openssl; fn main() { println!("{}", openssl::version::version()) } EOF cargo add openssl # requires cargo install cargo-add cargo build --target armv7-unknown-linux-gnueabihf

Prueba del programa compilado en la computadora host

El ajuste OPENSSL_STATIC hace que rust-openssl se OPENSSL_STATIC estáticamente. Si usa la versión enlazada estática de rust-openssl , instale una libc para armhf ( crossbuild-essential-armhf en Debian ) y qemu-static , puede ejecutar el programa compilado con el comando:

qemu-arm-static target/armv7-unknown-linux-gnueabihf/debug/xx