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