Skip to content

Commit

Permalink
Rollup merge of #82534 - nikic:musl-crtend, r=nagisa
Browse files Browse the repository at this point in the history
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.

r? ``@nagisa``
  • Loading branch information
Dylan-DPC authored Feb 27, 2021
2 parents 13ea3fa + c7091f5 commit a7f9aca
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 7 deletions.
21 changes: 14 additions & 7 deletions compiler/rustc_target/src/spec/crt_objects.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
6 changes: 6 additions & 0 deletions src/bootstrap/compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"] {
Expand Down

0 comments on commit a7f9aca

Please sign in to comment.