Skip to content

Commit 61c1155

Browse files
committed
Build crtbengin.o/crtend.o from source code
1 parent 9f75dbf commit 61c1155

File tree

6 files changed

+107
-3
lines changed

6 files changed

+107
-3
lines changed

src/bootstrap/builder.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,8 @@ impl<'a> Builder<'a> {
369369
tool::Rustfmt,
370370
tool::Miri,
371371
tool::CargoMiri,
372-
native::Lld
372+
native::Lld,
373+
native::CrtBeginEnd
373374
),
374375
Kind::Check | Kind::Clippy { .. } | Kind::Fix | Kind::Format => describe!(
375376
check::Std,

src/bootstrap/compile.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,9 @@ fn copy_self_contained_objects(
199199
DependencyType::TargetSelfContained,
200200
);
201201
}
202+
let crt_path = builder.ensure(native::CrtBeginEnd { target });
202203
for &obj in &["crtbegin.o", "crtbeginS.o", "crtend.o", "crtendS.o"] {
203-
let src = compiler_file(builder, builder.cc(target), target, obj);
204+
let src = crt_path.join(obj);
204205
let target = libdir_self_contained.join(obj);
205206
builder.copy(&src, &target);
206207
target_deps.push((target, DependencyType::TargetSelfContained));

src/bootstrap/native.rs

+66
Original file line numberDiff line numberDiff line change
@@ -858,3 +858,69 @@ impl HashStamp {
858858
fs::write(&self.path, self.hash.as_deref().unwrap_or(b""))
859859
}
860860
}
861+
862+
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
863+
pub struct CrtBeginEnd {
864+
pub target: TargetSelection,
865+
}
866+
867+
impl Step for CrtBeginEnd {
868+
type Output = PathBuf;
869+
870+
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
871+
run.path("src/llvm-project/compiler-rt/lib/crt")
872+
}
873+
874+
fn make_run(run: RunConfig<'_>) {
875+
run.builder.ensure(CrtBeginEnd { target: run.target });
876+
}
877+
878+
/// Build crtbegin.o/crtend.o for musl target.
879+
fn run(self, builder: &Builder<'_>) -> Self::Output {
880+
let out_dir = builder.native_dir(self.target).join("crt");
881+
882+
if builder.config.dry_run {
883+
return out_dir;
884+
}
885+
886+
let crtbegin_src = builder.src.join("src/llvm-project/compiler-rt/lib/crt/crtbegin.c");
887+
let crtend_src = builder.src.join("src/llvm-project/compiler-rt/lib/crt/crtend.c");
888+
if up_to_date(&crtbegin_src, &out_dir.join("crtbegin.o"))
889+
&& up_to_date(&crtend_src, &out_dir.join("crtendS.o"))
890+
{
891+
return out_dir;
892+
}
893+
894+
builder.info("Building crtbegin.o and crtend.o");
895+
t!(fs::create_dir_all(&out_dir));
896+
897+
let mut cfg = cc::Build::new();
898+
899+
if let Some(ar) = builder.ar(self.target) {
900+
cfg.archiver(ar);
901+
}
902+
cfg.compiler(builder.cc(self.target));
903+
cfg.cargo_metadata(false)
904+
.out_dir(&out_dir)
905+
.target(&self.target.triple)
906+
.host(&builder.config.build.triple)
907+
.warnings(false)
908+
.debug(false)
909+
.opt_level(3)
910+
.file(crtbegin_src)
911+
.file(crtend_src);
912+
913+
// Those flags are defined in src/llvm-project/compiler-rt/lib/crt/CMakeLists.txt
914+
// Currently only consumer of those objects is musl, which use .init_array/.fini_array
915+
// instead of .ctors/.dtors
916+
cfg.flag("-std=c11")
917+
.define("CRT_HAS_INITFINI_ARRAY", None)
918+
.define("EH_USE_FRAME_REGISTRY", None);
919+
920+
cfg.compile("crt");
921+
922+
t!(fs::copy(out_dir.join("crtbegin.o"), out_dir.join("crtbeginS.o")));
923+
t!(fs::copy(out_dir.join("crtend.o"), out_dir.join("crtendS.o")));
924+
out_dir
925+
}
926+
}

src/ci/docker/host-x86_64/dist-various-1/Dockerfile

+5-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,11 @@ ENV TARGETS=$TARGETS,armv7a-none-eabi
144144
# riscv targets currently do not need a C compiler, as compiler_builtins
145145
# doesn't currently have it enabled, and the riscv gcc compiler is not
146146
# installed.
147-
ENV CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \
147+
ENV CFLAGS_armv5te_unknown_linux_musleabi="-march=armv5te -marm -mfloat-abi=soft" \
148+
CFLAGS_arm_unknown_linux_musleabi="-march=armv6 -marm" \
149+
CFLAGS_arm_unknown_linux_musleabihf="-march=armv6 -marm -mfpu=vfp" \
150+
CFLAGS_armv7_unknown_linux_musleabihf="-march=armv7-a" \
151+
CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \
148152
CC_mips_unknown_linux_musl=mips-openwrt-linux-gcc \
149153
CC_mips64el_unknown_linux_muslabi64=mips64el-linux-gnuabi64-gcc \
150154
CC_mips64_unknown_linux_muslabi64=mips64-linux-gnuabi64-gcc \
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# only-linux
2+
# ignore-32bit
3+
4+
-include ../tools.mk
5+
6+
all:
7+
$(RUSTC) eh_frame-terminator.rs
8+
$(call RUN,eh_frame-terminator) | $(CGREP) '1122334455667788'
9+
objdump --dwarf=frames $(TMPDIR)/eh_frame-terminator | $(CGREP) 'ZERO terminator'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// run-pass
2+
3+
#![feature(backtrace)]
4+
#[derive(Clone, Copy)]
5+
struct Foo {
6+
array: [u64; 10240],
7+
}
8+
9+
impl Foo {
10+
const fn new() -> Self {
11+
Self {
12+
array: [0x1122_3344_5566_7788; 10240]
13+
}
14+
}
15+
}
16+
17+
static BAR: [Foo; 10240] = [Foo::new(); 10240];
18+
19+
fn main() {
20+
let bt = std::backtrace::Backtrace::force_capture();
21+
println!("Hello, world! {:?}", bt);
22+
println!("{:x}", BAR[0].array[0]);
23+
}

0 commit comments

Comments
 (0)