Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't copy symbols from dylibs with -Zdylib-lto #105800

Merged
merged 2 commits into from
Dec 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/rustc_codegen_ssa/src/back/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ pub fn each_linked_rlib(
};
for &cnum in crates {
match fmts.get(cnum.as_usize() - 1) {
Some(&Linkage::NotLinked | &Linkage::IncludedFromDylib) => continue,
Some(&Linkage::NotLinked | &Linkage::Dynamic | &Linkage::IncludedFromDylib) => continue,
Some(_) => {}
None => return Err(errors::LinkRlibError::MissingFormat),
}
Expand Down
23 changes: 23 additions & 0 deletions src/test/ui/lto/auxiliary/thinlto-dylib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Auxiliary crate for test issue-105637: the LTOed dylib which had duplicate symbols from libstd,
// breaking the panic hook feature.
//
// This simulates the `rustc_driver` crate, and the main crate simulates rustc's main binary hooking
// into this driver.

// compile-flags: -Zdylib-lto -C lto=thin
lqd marked this conversation as resolved.
Show resolved Hide resolved

use std::panic;

pub fn main() {
// Install the hook we want to see executed
panic::set_hook(Box::new(|_| {
eprintln!("LTOed auxiliary crate panic hook");
}));

// Trigger the panic hook with an ICE
run_compiler();
}

fn run_compiler() {
panic!("ICEing");
}
28 changes: 28 additions & 0 deletions src/test/ui/lto/issue-105637.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Regression test for issue #105637: `-Zdylib-lto` with LTO duplicated symbols from other dylibs,
// in this case from libstd.
//
// That manifested as both `rustc_driver` and rustc's "main" (`compiler/rustc`) having their own
// `std::panicking::HOOK` static, and the hook in rustc's main (the default stdlib's) being executed
// when rustc ICEs, instead of the overriden hook from `rustc_driver` (which also displays the query
// stack and information on how to open a GH issue for the encountered ICE).
//
// In this test, we reproduce this setup by installing a panic hook in both the main and an LTOed
// dylib: the last hook set should be the one being executed, the dylib's.

// aux-build: thinlto-dylib.rs
// run-fail
// check-run-results

extern crate thinlto_dylib;

use std::panic;

fn main() {
// We don't want to see this panic hook executed
std::panic::set_hook(Box::new(|_| {
eprintln!("main crate panic hook");
}));

// Have the LTOed dylib install its own hook and panic, we want to see its hook executed.
thinlto_dylib::main();
}
1 change: 1 addition & 0 deletions src/test/ui/lto/issue-105637.run.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
LTOed auxiliary crate panic hook