[英]Cross compile rust-openssl for Raspberry Pi 2
I am on a Debian machine and I want to cross compile a project for my Raspberry Pi 2. I've managed to do it for a simple hello world using rustup, but couldn't figure out how to cross compile the rust-openssl crate.我在一台 Debian 机器上,我想为我的 Raspberry Pi 2 交叉编译一个项目。我已经设法使用 rustup 为一个简单的 hello world 做了它,但无法弄清楚如何交叉编译 rust-openssl crate .
I have compiled openssl with arm-linux-gnueabihf-gcc and installed it in my home/opensslArm
directory.我已经用 arm-linux-gnueabihf-gcc 编译了 openssl 并将其安装在我的
home/opensslArm
目录中。
When I run当我跑
OPENSSL_LIB_DIR=/home/johann/opensslArm/lib OPENSSL_INCLUDE_DIR=/home/johann/opensslArm/include cargo build --target=armv7-unknown-linux-gnueabihf
I get this 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.
I get the same error if I export the variables in question.如果我导出有问题的变量,我会得到同样的错误。
I don't know exactly what I am supposed to do, I am not an expert in cross compiling.我不知道我应该做什么,我不是交叉编译的专家。 Has anyone managed to do this?
有没有人设法做到这一点?
EDIT: I was using rust-openssl 0.7.11.编辑:我使用的是 rust-openssl 0.7.11。 Upgrading to 0.7.13 fixed this issue (I can now see cargo compiling rust-openssl dependencies without an error) but I have now another one:
升级到 0.7.13 修复了这个问题(我现在可以看到货物编译 rust-openssl 依赖项没有错误)但我现在有另一个:
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
How can I add -fPIC
flag?如何添加
-fPIC
标志? Should I recompile opensslArm with specific flags?我应该使用特定标志重新编译 opensslArm 吗?
You must pass shared
option when configuring openssl compilation (this will make -fPIC
parameter be passed to the compiler).配置 openssl 编译时必须传递
shared
选项(这将使-fPIC
参数传递给编译器)。
Here is a sequence of commands that I used to test cross compiling a Rust program that prints the openssl version:这是我用来测试交叉编译打印 openssl 版本的 Rust 程序的一系列命令:
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
Testing the compiled program on the host computer在主机上测试编译的程序
Setting OPENSSL_STATIC
makes rust-openssl
be statically linked. 设置
OPENSSL_STATIC
使rust-openssl
被静态链接。 If you use the static linked version of rust-openssl
, install a libc for armhf ( crossbuild-essential-armhf
on Debian ) and qemu-static
, you can the run the compiled program with the command:如果您使用
rust-openssl
的静态链接版本,为 armhf( Debian 上的crossbuild-essential-armhf
)和qemu-static
安装 libc,您可以使用以下命令运行编译的程序:
qemu-arm-static target/armv7-unknown-linux-gnueabihf/debug/xx
This is an older question but it shows up highly on Google, so I wanted to call out that nowadays you don't need to manually compile OpenSSL (if you don't want to).这是一个较老的问题,但它在 Google 上的出现率很高,所以我想指出现在您不需要手动编译 OpenSSL(如果您不想的话)。 The
openssl
crate provides a vendored
feature that causes OpenSSL to be compiled from source when you build your project. openssl
crate 提供了一项vendored
功能,该功能会导致在您构建项目时从源代码编译 OpenSSL。
You can propagate the feature into your own project to optionally depend on vendored
by adding something like this to your Cargo.toml
:您可以将该功能传播到您自己的项目中,以通过在
vendored
添加以下内容来选择性地依赖Cargo.toml
:
[features]
...
# If compiling on a system without OpenSSL installed, or cross-compiling for a different
# architecture, enable this feature to compile OpenSSL as part of the build.
# See https://docs.rs/openssl/#vendored for more.
static_ssl = ['openssl/vendored']
[dependencies]
...
[dependencies.openssl]
optional = true
version = ...
Enabling the static_ssl
feature when building your project will then compile OpenSSL against the same target architecture as the rest of your build.在构建项目时启用
static_ssl
功能将针对与构建的其余部分相同的目标架构编译 OpenSSL。
This post goes into some more details about different ways of compiling with OpenSSL. 这篇文章详细介绍了使用 OpenSSL 进行编译的不同方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.