diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2021-02-26 11:01:23 +0100 |
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2021-02-26 11:02:51 +0100 |
| commit | c7091f5a07fa665344d0ebafae5480f54337ef88 (patch) | |
| tree | bfd035549cc4904e6191e6be49a88365235ef10b | |
| parent | 98f8cce6db6c6c6660eeffee2b3903104e547ecf (diff) | |
| download | rust-c7091f5a07fa665344d0ebafae5480f54337ef88.tar.gz rust-c7091f5a07fa665344d0ebafae5480f54337ef88.zip | |
Link crtbegin/crtend on musl to terminate .eh_frame
For some targets, rustc uses a "CRT fallback", where it links CRT object files it ships instead of letting the host compiler link them. On musl, rustc currently links crt1, crti and crtn (provided by libc), but does not link crtbegin and crtend (provided by libgcc). In particular, crtend is responsible for terminating the .eh_frame section. Lack of terminator may result in segfaults during unwinding, as reported in #47551 and encountered by the LLVM 12 update in #81451. This patch links crtbegin and crtend for musl as well, following the table at the top of crt_objects.rs.
| -rw-r--r-- | compiler/rustc_target/src/spec/crt_objects.rs | 21 | ||||
| -rw-r--r-- | src/bootstrap/compile.rs | 6 |
2 files changed, 20 insertions, 7 deletions
diff --git a/compiler/rustc_target/src/spec/crt_objects.rs b/compiler/rustc_target/src/spec/crt_objects.rs index 32da16a2d8c..51a48147e6b 100644 --- a/compiler/rustc_target/src/spec/crt_objects.rs +++ b/compiler/rustc_target/src/spec/crt_objects.rs @@ -64,17 +64,24 @@ pub(super) fn all(obj: &str) -> CrtObjects { pub(super) fn pre_musl_fallback() -> CrtObjects { new(&[ - (LinkOutputKind::DynamicNoPicExe, &["crt1.o", "crti.o"]), - (LinkOutputKind::DynamicPicExe, &["Scrt1.o", "crti.o"]), - (LinkOutputKind::StaticNoPicExe, &["crt1.o", "crti.o"]), - (LinkOutputKind::StaticPicExe, &["rcrt1.o", "crti.o"]), - (LinkOutputKind::DynamicDylib, &["crti.o"]), - (LinkOutputKind::StaticDylib, &["crti.o"]), + (LinkOutputKind::DynamicNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]), + (LinkOutputKind::DynamicPicExe, &["Scrt1.o", "crti.o", "crtbeginS.o"]), + (LinkOutputKind::StaticNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]), + (LinkOutputKind::StaticPicExe, &["rcrt1.o", "crti.o", "crtbeginS.o"]), + (LinkOutputKind::DynamicDylib, &["crti.o", "crtbeginS.o"]), + (LinkOutputKind::StaticDylib, &["crti.o", "crtbeginS.o"]), ]) } pub(super) fn post_musl_fallback() -> CrtObjects { - all("crtn.o") + new(&[ + (LinkOutputKind::DynamicNoPicExe, &["crtend.o", "crtn.o"]), + (LinkOutputKind::DynamicPicExe, &["crtendS.o", "crtn.o"]), + (LinkOutputKind::StaticNoPicExe, &["crtend.o", "crtn.o"]), + (LinkOutputKind::StaticPicExe, &["crtendS.o", "crtn.o"]), + (LinkOutputKind::DynamicDylib, &["crtendS.o", "crtn.o"]), + (LinkOutputKind::StaticDylib, &["crtendS.o", "crtn.o"]), + ]) } pub(super) fn pre_mingw_fallback() -> CrtObjects { diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 7d5e3d05b11..859e38dc346 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -189,6 +189,12 @@ fn copy_self_contained_objects( DependencyType::TargetSelfContained, ); } + for &obj in &["crtbegin.o", "crtbeginS.o", "crtend.o", "crtendS.o"] { + let src = compiler_file(builder, builder.cc(target), target, obj); + let target = libdir_self_contained.join(obj); + builder.copy(&src, &target); + target_deps.push((target, DependencyType::TargetSelfContained)); + } } else if target.ends_with("-wasi") { let srcdir = builder.wasi_root(target).unwrap().join("lib/wasm32-wasi"); for &obj in &["crt1.o", "crt1-reactor.o"] { |
