Skip to content

Compiling std for UEFI with panic=abort fails #98133

Closed
@Ayush1325

Description

@Ayush1325

I am trying to implement std for the UEFI targets as a part of my GSoC project. I am currently trying to build std using the #![feature(restricted_std)]. When I try to compile std along with panic_abort, I get the following error:

error: linking with `rust-lld` failed: exit status: 1
  |
  = note: "rust-lld" "-flavor" "link" "/NOLOGO" "/entry:efi_main" "/subsystem:efi_application" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/hello_world-86b7bdb62ca4e356.1wmkhau9wf5mggc4.rcgu.o" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/hello_world-86b7bdb62ca4e356.2dbrudlb642mvcxh.rcgu.o" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/hello_world-86b7bdb62ca4e356.390rrbcz9df7m17.rcgu.o" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/hello_world-86b7bdb62ca4e356.3yl41t6ohz1j19lz.rcgu.o" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/hello_world-86b7bdb62ca4e356.4ndg5iuai60vb1e.rcgu.o" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/hello_world-86b7bdb62ca4e356.4z4woxftcrn577kv.rcgu.o" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/hello_world-86b7bdb62ca4e356.29upyblqtj4qjy9c.rcgu.o" "/LIBPATH:/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps" "/LIBPATH:/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/debug/deps" "/LIBPATH:/var/home/ayush/Documents/Programming/Rust/rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-uefi/lib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/libr_efi-9860c65d670ddb26.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/libstd-818bb3edb226311d.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/libpanic_abort-b537655868a6eb10.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/librustc_demangle-fbd85641d8aabb11.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/libstd_detect-fab2f0e1b867d822.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/libhashbrown-25dd1101220abe44.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/librustc_std_workspace_alloc-e0f3f68f61f3a7ec.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/libunwind-67271849d17a208b.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/libcfg_if-6c94eec96134b1f2.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/liblibc-04c66ae9b882fddc.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/liballoc-31f22b8597517001.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/librustc_std_workspace_core-28288f540a1df2c0.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/libcore-a891fd5a4b0f6ffd.rlib" "/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/libcompiler_builtins-e1dc617638fd0a75.rlib" "/NXCOMPAT" "/LIBPATH:/var/home/ayush/Documents/Programming/Rust/rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-uefi/lib" "/OUT:/var/home/ayush/Documents/Programming/Rust/uefi/hello_world/target/x86_64-unknown-uefi/debug/deps/hello_world-86b7bdb62ca4e356.efi" "/OPT:REF,NOICF" "/DEBUG" "/NODEFAULTLIB"
  = note: rust-lld: error: undefined symbol: __CxxFrameHandler3
          >>> referenced by libstd-818bb3edb226311d.rlib(std-818bb3edb226311d.std.d4a9d80c-cgu.2.rcgu.o):(.xdata)
          >>> referenced by libstd-818bb3edb226311d.rlib(std-818bb3edb226311d.std.d4a9d80c-cgu.2.rcgu.o):(.xdata)

This error of course is caused due to the UEFI target having "is-like-msvc": true in the target.json.

I know it can be fixed by adding a blank implementation for __CxxFrameHandler3:

#[no_mangle]
pub extern "C" fn __CxxFrameHandler3() {}

I wanted to ask if this is expected behavior or a bug? I thought setting panic=abort should mean that I don't need unwinding.

Here is my .cargo/config.toml:

[unstable]
build-std = ["compiler_builtins", "panic_abort", "std"]
build-std-features = ["compiler-builtins-mem"]

[build]
target = "x86_64-unknown-uefi"

Cargo.toml

[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
r-efi = "4.0"

[profile.dev]
panic = "abort"

[profile.release]
panic = "abort"

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-runtimeArea: std's runtime and "pre-main" init for handling backtraces, unwinds, stack overflowsC-bugCategory: This is a bug.T-libsRelevant to the library team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions