首页 > 解决方案 > Rust 无法构建 64 位 RISC-V 二进制文件

问题描述

我正在尝试在我的台式计算机上构建一个 riscv64gc 二进制文件。我使用 rustup 添加了工具链,它似乎正在编译但没有链接。我没有看到目标三重通过,也没有使用 llvm 链接器?这是怎么回事?

$ cargo build
   Compiling rusty v0.1.0 (/home/gonzo/github/vmscript/programs/rusty)
error: linking with `cc` failed: exit code: 1
  |
  = note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-Wl,--eh-frame-hdr" "-L" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.2nds3en7x7harbuk.rcgu.o" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.2v63m1b4etm8s6nh.rcgu.o" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.303kqsurg5oh0riy.rcgu.o" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.3elkuabnsvy95hq7.rcgu.o" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.3r64kd80pqjv10ju.rcgu.o" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.3wgrjsqhbin1mctj.rcgu.o" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.48r3jc0pf6ft3du4.rcgu.o" "-o" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.2t6innn061qnfecr.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-nodefaultlibs" "-L" "/home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps" "-L" "/home/gonzo/github/vmscript/programs/rusty/target/debug/deps" "-L" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib" "-Wl,--start-group" "-Wl,-Bstatic" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libstd-4d23caece3cfb404.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libpanic_unwind-bd0597832b931a8d.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libminiz_oxide-c69f5df8e3069335.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libadler-d00e403322625f86.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libobject-894038d69e57102f.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libaddr2line-75fbaf228f48ce8f.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libgimli-bff05ee40dca0583.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_demangle-409277b88ad09194.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libhashbrown-b2b20bb543a774ac.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_std_workspace_alloc-1487b67180a724ba.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libunwind-44237576dfb581e1.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libcfg_if-e990ad0df181d5f9.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/liblibc-9ba7c5b4ecd18d15.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/liballoc-b00339818adfcc5f.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/librustc_std_workspace_core-033865d9c78f3d80.rlib" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libcore-6c4981fd8fe7c5df.rlib" "-Wl,--end-group" "/home/gonzo/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/riscv64gc-unknown-linux-gnu/lib/libcompiler_builtins-55f6cd5bd09b4c18.rlib" "-Wl,-Bdynamic" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-ldl"
  = note: /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: Relocations in generic ELF (EM: 243)
          /usr/bin/ld: /home/gonzo/github/vmscript/programs/rusty/target/riscv64gc-unknown-linux-gnu/debug/deps/rusty-91e5c79e8b10a398.1icj07kgp6riy6ou.rcgu.o: error adding symbols: file in wrong format
          collect2: error: ld returned 1 exit status
          

error: aborting due to previous error

error: could not compile `rusty`.

To learn more, run the command again with --verbose.

我假设应该使用 lld 。这是我的货物配置:

[build]
target = "riscv64gc-unknown-linux-gnu"

更新:我现在有一个自定义链接器脚本,这使得 ld 停止抱怨,除了它不能构建 riscv64 二进制文件,因为它是系统链接器。只是我还是 riscv64-unknown-linux-gnu 工具链完全坏了?我对 Rust 中的其他 riscv 工具链没有任何此类问题。

它只是实际支持 std 的单个工具链,它几乎感染了 Rust 中的每个包,使得它不可能走 no_std 路线,所以我们来了。

标签: rustrust-cargo

解决方案


定制了哪个链接器?我认为我们有一些问题。实际上,也许使用 update-to-date risc-v-toolchain。

[build]
target = "riscv64gc-unknown-linux-gnu"
rustflags = ["-C", "target-feature=+crt-static"]

[test]
target = "riscv64gc-unknown-linux-gnu"
rustflags = ["-C", "target-feature=+crt-static"]


[target.riscv64gc-unknown-linux-gnu]
runner = "qemu-riscv64"
linker = "riscv64-unknown-linux-gnu-gcc"
ar = "riscv64-unknown-linux-ar"

它运作良好。静态功能适用于在qemu.


推荐阅读