Description
When linking crates which both export function with the same name with #[no_mangle]
, LTO fails to process it and emits a message that cannot be understood without looking into rustc sources. For simplicity, i put a minimal reproducible example into a repo https://github.com/ValeryAntopol/rust-lto-bug. The helper
crate builds to a library with default settings, rust-lto-bug
builds to a binary with default settings + LTO enabled, links with the helper
crate.
I tried this code:
helper/lib.rs:
#[no_mangle]
pub fn foo() {}
main.rs:
#[allow(unused)]
use helper;
#[no_mangle]
pub fn foo() {}
fn main() {}
I expected to see this happen:
One of the following:
- successful compilation where LTO somehow handles it (compilation without LTO works successfully, why should one with LTO enabled fail?)
- compilation/linking error saying that it failed because of a function exported twice
I also expect that the behavior will be the same for both enabled and disabled LTO, but i understand that it could be too difficult to achieve.
Instead, this happened:
cargo build
, LTO enabled:
Compiling helper v0.1.0 (/Users/valeryantopol/work/rust-lto-bug/helper)
Compiling rust-lto-bug v0.1.0 (/Users/valeryantopol/work/rust-lto-bug)
warning: Linking globals named 'foo': symbol multiply defined!
error: failed to load bitcode of module "sqkmfdx3qawf5f0":
warning: `rust-lto-bug` (bin "rust-lto-bug") generated 1 warning
error: could not compile `rust-lto-bug` due to previous error; 1 warning emitted
cargo build --release
, LTO enabled:
Compiling helper v0.1.0 (/Users/valeryantopol/work/rust-lto-bug/helper)
Compiling rust-lto-bug v0.1.0 (/Users/valeryantopol/work/rust-lto-bug)
warning: Linking globals named 'foo': symbol multiply defined!
error: failed to load bitcode of module "rust_lto_bug.db9ad83a-cgu.1":
warning: `rust-lto-bug` (bin "rust-lto-bug") generated 1 warning
error: could not compile `rust-lto-bug` due to previous error; 1 warning emitted
cargo build
, LTO disabled:
Compiling helper v0.1.0 (/Users/valeryantopol/work/rust-lto-bug/helper)
Compiling rust-lto-bug v0.1.0 (/Users/valeryantopol/work/rust-lto-bug)
Finished dev [unoptimized + debuginfo] target(s) in 0.70s
Meta
Versions checked:
rustc 1.61.0 (fe5b13d68 2022-05-18)
rustc 1.64.0-nightly (830880640 2022-06-28)
rustc 1.63.0-beta.2 (6c1f14289 2022-06-28)
On all of them behavior is the same, only the module hash changes. But it is the same on different compilations with the same version.
RUST_BACKTACE=1
adds nothing to the output.