Skip to content

[-Zbuild-std] Duplicate lang item with panic=abort #7359

@phil-opp

Description

@phil-opp

Combining a no-harness test with a panic=abort key in the Cargo.toml leads to duplicate lang item errors if compiled with cargo test -Zbuild-std=core.

Steps to Reproduce

MRE by @hoodmane from #15058

Make a folder with the following two files:

Cargo.toml

[package]
name = "test"
edition = "2024"

[profile.dev]
panic = "abort"

[[bin]]
name = "test"
path = "main.rs"

main.rs

pub fn main() { }

Bash

  1. rustup install nightly-2025-01-13
  2. cargo +nightly-2025-01-13 build -Zbuild-std

Result

   Compiling tmp v0.0.0 (/home/rchatham/Documents/programming/rust-wasm-eh-test-2)
error[E0152]: duplicate lang item in crate `core`: `sized`
  |
  = note: the lang item is first defined in crate `core` (which `std` depends on)
  = note: first definition in `core` loaded from /home/rchatham/Documents/programming/rust-wasm-eh-test-2/target/wasm32-unknown-emscripten/debug/deps/libcore-05cdacbb5559ef58.rlib, /home/rchatham/Documents/programming/rust-wasm-eh-test-2/target/wasm32-unknown-emscripten/debug/deps/libcore-05cdacbb5559ef58.rmeta
  = note: second definition in `core` loaded from /home/rchatham/.rustup/toolchains/nightly-2025-01-13-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/libcore-9c3bca22b80bc54a.rlib

For more information about this error, try `rustc --explain E0152`.
error: could not compile `test` (bin "test") due to 1 previous error

Original MRE from the issue author

  1. Create a new cargo project with the following contents:

    Cargo.toml:

    [package]
    name = "playground"
    version = "0.1.0"
    authors = ["Philipp Oppermann <[email protected]>"]
    edition = "2018"
    
    [lib]
    harness = false
    
    [dependencies]
    
    [profile.dev]
    panic = "abort"     # it works if this line is removed

    src/lib.rs:

    #![no_std]
    #![cfg_attr(test, no_main)]
    
    #[cfg(test)]
    #[panic_handler]
    fn panic(_info: &core::panic::PanicInfo) -> ! {
        loop {}
    }

    target.json:

    {
        "llvm-target": "x86_64-unknown-none",
        "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
        "arch": "x86_64",
        "target-endian": "little",
        "target-pointer-width": "64",
        "target-c-int-width": "32",
        "os": "none",
        "executables": true,
        "linker-flavor": "ld.lld",
        "linker": "rust-lld",
        "panic-strategy": "abort",
        "disable-redzone": true,
        "features": "-mmx,-sse,+soft-float"
      }
  2. Run cargo test --target target.json -Z build-std=core --no-run

    The following error occurs:

    cargo test --target target.json -Z build-std=core
     Compiling playground v0.1.0 (…)
     error: duplicate lang item in crate `core`: `bool`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `char`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `str`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `slice`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `slice_u8`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `const_ptr`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `mut_ptr`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `i8`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `i16`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `i32`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `i64`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `i128`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `isize`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `u8`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `u16`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `u32`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `u64`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `u128`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `usize`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `f32`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `f64`.
     |
     error: duplicate lang item in crate `core`: `bool`.
     = note: first defined in crate `core`.
     |
    
     error: duplicate lang item in crate `core`: `sized`.
     = note: first defined in crate `core`.
    
     |
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `char`.
    
     |
     error: duplicate lang item in crate `core`: `unsize`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `str`.
     |
     error: duplicate lang item in crate `core`: `copy`.
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `slice`.
     |
     error: duplicate lang item in crate `core`: `clone`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `slice_u8`.
    
     |
     error: duplicate lang item in crate `core`: `sync`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `const_ptr`.
    
     |
     error: duplicate lang item in crate `core`: `freeze`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `mut_ptr`.
    
     |
     error: duplicate lang item in crate `core`: `drop`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `i8`.
    
     |
     error: duplicate lang item in crate `core`: `coerce_unsized`.
     = note: first defined in crate `core`.
    
     |
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `i16`.
    
     |
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `dispatch_from_dyn`.
    
     |
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `i32`.
    
     |
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `add`.
    
     |
     error: duplicate lang item in crate `core`: `i64`.
     = note: first defined in crate `core`.
    
     |
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `sub`.
    
     |
     error: duplicate lang item in crate `core`: `i128`.
     = note: first defined in crate `core`.
    
     |
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `mul`.
    
     |
     error: duplicate lang item in crate `core`: `isize`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `div`.
    
     |
     error: duplicate lang item in crate `core`: `u8`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `rem`.
    
     |
     error: duplicate lang item in crate `core`: `u16`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `neg`.
     |
     error: duplicate lang item in crate `core`: `u32`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `not`.
     |
     error: duplicate lang item in crate `core`: `u64`.
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `bitxor`.
     |
     error: duplicate lang item in crate `core`: `u128`.
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `bitand`.
     |
     error: duplicate lang item in crate `core`: `usize`.
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `bitor`.
     error: duplicate lang item in crate `core`: `f32`.
     |
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `shl`.
     error: duplicate lang item in crate `core`: `f64`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `shr`.
     error: duplicate lang item in crate `core`: `sized`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `add_assign`.
     error: duplicate lang item in crate `core`: `unsize`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `sub_assign`.
     error: duplicate lang item in crate `core`: `copy`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `mul_assign`.
     error: duplicate lang item in crate `core`: `clone`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `div_assign`.
     error: duplicate lang item in crate `core`: `sync`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `rem_assign`.
     error: duplicate lang item in crate `core`: `freeze`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `bitxor_assign`.
     error: duplicate lang item in crate `core`: `drop`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `bitand_assign`.
     error: duplicate lang item in crate `core`: `coerce_unsized`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `bitor_assign`.
     error: duplicate lang item in crate `core`: `dispatch_from_dyn`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `shl_assign`.
     error: duplicate lang item in crate `core`: `add`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `sub`.
     error: duplicate lang item in crate `core`: `shr_assign`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `index`.
     error: duplicate lang item in crate `core`: `mul`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `index_mut`.
     error: duplicate lang item in crate `core`: `div`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `rem`.
     error: duplicate lang item in crate `core`: `unsafe_cell`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `neg`.
     |
     error: duplicate lang item in crate `core`: `va_list`.
     = note: first defined in crate `core`.
    
     |
     error: duplicate lang item in crate `core`: `not`.
     = note: first defined in crate `core`.
     |
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `bitxor`.
     |
     error: duplicate lang item in crate `core`: `deref`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `bitand`.
    
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `deref_mut`.
     error: duplicate lang item in crate `core`: `bitor`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `receiver`.
     error: duplicate lang item in crate `core`: `shl`.
     |
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `fn`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `fn_mut`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `fn_once`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `future_trait`.
     error: duplicate lang item in crate `core`: `shr`.
     |
     = note: first defined in crate `core`.
    
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `add_assign`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `sub_assign`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `mul_assign`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `div_assign`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `rem_assign`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `bitxor_assign`.
     error: duplicate lang item in crate `core`: `generator_state`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `bitand_assign`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `bitor_assign`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `shl_assign`.
     |
     = note: first defined in crate `core`.
    
     |
     error: duplicate lang item in crate `core`: `shr_assign`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `index`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `index_mut`.
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `unsafe_cell`.
     |
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `generator`.
     error: duplicate lang item in crate `core`: `va_list`.
     |
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `deref`.
     |
     error: duplicate lang item in crate `core`: `unpin`.
     = note: first defined in crate `core`.
    
     |
     error: duplicate lang item in crate `core`: `deref_mut`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `receiver`.
     error: duplicate lang item in crate `core`: `pin`.
     |
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `fn`.
     |
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `eq`.
     error: duplicate lang item in crate `core`: `fn_mut`.
     |
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `fn_once`.
     |
     error: duplicate lang item in crate `core`: `partial_ord`.
     = note: first defined in crate `core`.
    
     |
     error: duplicate lang item in crate `core`: `future_trait`.
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `generator_state`.
     |
     error: duplicate lang item in crate `core`: `ord`.
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `generator`.
     |
     error: duplicate lang item in crate `core`: `panic`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `unpin`.
    
     |
     error: duplicate lang item in crate `core`: `panic_bounds_check`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `pin`.
    
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `eq`.
     error: duplicate lang item in crate `core`: `panic_info`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `partial_ord`.
     error: duplicate lang item in crate `core`: `drop_in_place`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `ord`.
     error: duplicate lang item in crate `core`: `alloc_layout`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `panic`.
     error: duplicate lang item in crate `core`: `phantom_data`.
     |
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `panic_bounds_check`.
     error: duplicate lang item in crate `core`: `manually_drop`.
     |
     |
     = note: first defined in crate `core`.
     = note: first defined in crate `core`.
    
    
     error: duplicate lang item in crate `core`: `panic_info`.
     error: duplicate lang item in crate `core`: `maybe_uninit`.
     |
     |
     = note: first defined in crate `core`.
    
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `drop_in_place`.
     |
     error: duplicate lang item in crate `core`: `align_offset`.
     = note: first defined in crate `core`.
     |
    
     = note: first defined in crate `core`.
     error: duplicate lang item in crate `core`: `alloc_layout`.
    
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `phantom_data`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `manually_drop`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `maybe_uninit`.
     |
     = note: first defined in crate `core`.
    
     error: duplicate lang item in crate `core`: `align_offset`.
     |
     = note: first defined in crate `core`.
    
     error: aborting due to 79 previous errors
    
     error: argument should be `&PanicInfo`
     --> src/lib.rs:6:17
     |
     6 | fn panic(_info: &core::panic::PanicInfo) -> ! {
     |                 ^^^^^^^^^^^^^^^^^^^^^^^
    
     error: Could not compile `playground`.
     warning: build failed, waiting for other jobs to finish...
     error: aborting due to 80 previous errors
    
     error: Could not compile `playground`.
    
     To learn more, run the command again with --verbose.
    
  3. Remove the panic=abort line from the Cargo.toml

  4. Rerun the command from step 2 (cargo test --target target.json -Z build-std=core --no-run). It works now.

My Guess

My guess is that the core library is somehow compiled twice when the panic=abort line is specified.

Version

cargo 1.39.0-nightly (fe0e5a4 2019-09-04)

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: bugS-triageStatus: This issue is waiting on initial triage.Z-build-stdNightly: build-std

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions