Rust编译AArch64架构PIE库及跨Crate使用问题解决
环境信息
- 系统:Ubuntu 20.04 x86_64
- Rust版本:rustc 1.69.0-nightly
- 目标平台:
aarch64-unknown-none-softfloat(已安装对应rust-std组件)
问题重现与分析
1. PIE库(libtest)编译问题
libtest的src/lib.rs代码:
#![feature(restricted_std)] pub fn add(left: usize, right: usize) -> usize { left + right } pub fn output(i: usize) { println!("i:{}", i); }
Cargo.toml配置:
[package] name = "libtest" version = "0.1.0" edition = "2021" [dependencies] [lib] crate-type = ["lib"] version = "0.1.0"
最初编译错误
执行命令:
cargo build --lib --target=aarch64-unknown-none-softfloat -Clink-args="-pie"
报错:
warning: unused manifest key: lib.version
Compiling libtest v0.1.0 (/home/user/libtest)
error[E0463]: can't find crate forstd
|
= note: theaarch64-unknown-none-softfloattarget may not support the standard library
= note:stdis required bylibtestbecause it does not declare#![no_std]
= help: consider building the standard library from source withcargo build -Zbuild-stderror: cannot find macro
printlnin this scope
--> src/lib.rs:8:5
|
8 | println!("i:{}", i);
| ^^^^^^^error[E0635]: unknown feature
restricted_std
--> src/lib.rs:1:12
|
1 | #![feature(restricted_std)]
| ^^^^^^^^^^^^^^
错误原因:
lib.version是无效字段,Cargo的[lib]段不支持version配置aarch64-unknown-none-softfloat属于无标准库目标,默认没有std,需通过-Zbuild-std编译stdrestricted_std特性在1.69.0-nightly中不存在,无需启用
修正后编译成功
执行命令:
cargo rustc --target aarch64-unknown-none-softfloat --release -Zbuild-std -- -Clink-args="-pie"
生成文件:libtest/target/aarch64-unknown-none-softfloat/release/liblibtest.rlib
2. 在pie_test项目中使用libtest的问题
pie_test的src/main.rs代码:
extern crate libtest; fn main() { println!("Hello, world!"); let a = libtest::add(1, 2); println!("finish test {}", a); }
Cargo.toml配置:
[package] name = "pie_test" version = "0.1.0" edition = "2021" [dependencies] libtest = { path = "./liblibtest.rlib" }
目录结构:
├── Cargo.lock ├── Cargo.toml ├── liblibtest.rlib ├── rust-toolchain.toml └── src └── main.rs
编译错误1(rustc命令)
执行命令:
rustc src/main.rs --target aarch64-unknown-none-softfloat --extern libtest=./liblibtest.rlib
报错:
error[E0463]: can't find crate for
std
|
= note: theaarch64-unknown-none-softfloattarget may not support the standard library
= note:stdis required by<unknown>because it does not declare#![no_std]
= help: consider building the standard library from source withcargo build -Zbuild-stderror[E0463]: can't find crate for
stdwhichlibtestdepends on
--> src/main.rs:1:1
|
extern crate libtest; ^^^^^^^^^^^^^^^^^^^^^ can't find crate = note: the
aarch64-unknown-none-softfloattarget may not support the standard library
= help: consider building the standard library from source withcargo build -Zbuild-stderror: cannot find macro
printlnin this scope
--> src/main.rs:5:5
|
5 | println!("finish test {}", a);
| ^^^^^^^error: cannot find macro
printlnin this scope
--> src/main.rs:3:5
|
3 | println!("Hello, world!");
| ^^^^^^^error:
#[panic_handler]function required, but not founderror: aborting due to 5 previous errors
错误原因:目标平台无默认std,rustc本身不支持-Zbuild-std,需通过Cargo调用编译std
编译错误2(cargo build命令)
执行命令:
cargo build --target aarch64-unknown-none-softfloat
报错:
error: failed to get
libtestas a dependency of packagepie_test v0.1.0 (/home/user/pie_test)Caused by:
failed to load source for dependencylibtestCaused by:
Unable to update /home/user/pie_test/liblibtest.rlibCaused by:
failed to read/home/user/pie_test/liblibtest.rlib/Cargo.tomlCaused by:
Not a directory (os error 20)
错误原因:Cargo的path依赖需指向包含Cargo.toml的源码目录,而非编译后的.rlib文件
正确解决方案
步骤1:修正libtest库的配置
修改libtest/Cargo.toml,移除[lib]段中的无效version字段:
[package] name = "libtest" version = "0.1.0" edition = "2021" [dependencies] [lib] crate-type = ["lib"]
移除src/lib.rs中的无效特性声明:
pub fn add(left: usize, right: usize) -> usize { left + right } pub fn output(i: usize) { println!("i:{}", i); }
步骤2:重新编译libtest库
执行命令:
cd libtest cargo rustc --target aarch64-unknown-none-softfloat --release -Zbuild-std -- -Clink-args="-pie"
步骤3:正确配置pie_test项目依赖
修改pie_test/Cargo.toml,将libtest的依赖指向其源码目录(假设libtest与pie_test同级):
[package] name = "pie_test" version = "0.1.0" edition = "2021" [dependencies] libtest = { path = "../libtest" }
步骤4:编译pie_test项目
执行命令:
cd pie_test cargo build --target aarch64-unknown-none-softfloat --release -Zbuild-std
可选:直接使用已编译的.rlib文件
若必须使用预编译的.rlib,需通过Cargo间接调用rustc并指定std依赖:
cd pie_test cargo rustc --target aarch64-unknown-none-softfloat --release -Zbuild-std --extern libtest=./liblibtest.rlib -- -Clink-args="-pie"
内容的提问来源于stack exchange,提问作者si yan

