简体   繁体   English

为 Raspberry Pi 2 交叉编译 rust-openssl

[英]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.

相关问题 是否可以从 Rust-openssl 中的密码生成 RSA 密钥对? - Is it possible to generate a RSA key-pair from a password in Rust-openssl? 如何使用rust-openssl创建与`-starttls smtp`等效的连接? - How do I create a connection with the equivalent of `-starttls smtp` using rust-openssl? 在裸机上交叉编译 openssl - Cross compile openssl on bare metal rust如何在Mac OS上交叉编译openssL库? - How do I cross-compile openssL libraries on Mac OS by rust? Raspberry PI 2上使用OpenSSL AES / GCM的性能非常差 - Ridiculously poor performance with OpenSSL AES/GCM on Raspberry PI 2 在树莓派上使用 MariaDB 10.3 使用 OpenSSL 而不是 yaSSL - Make MariaDB 10.3 on raspberry pi use OpenSSL instead of yaSSL 无法用 OpenSSL 交叉编译 PostgreSQL,失败<openssl opensslconf.h>未找到 - 尽管指定了包含搜索路径</openssl> - Unable to cross compile PostgreSQL with OpenSSL, fails on <openssl/opensslconf.h> not found - despite specifying include search path 使用 armv7 上现有的 openssl 版本交叉编译 mosquitto - Cross compile mosquitto with existing openssl version on armv7 rust 非阻塞 openssl stream - rust non blocking openssl stream 使用Bazel编译OpenSSL for Android - Compile OpenSSL for Android with Bazel
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM