Description
Platform
- Rust nightly, version:
rustc 1.20.0-nightly (086eaa78e 2017-07-15)
- OS:
Linux 4.9.0-3-amd64 #1 SMP Debian 4.9.30-2+deb9u2 (2017-06-26) x86_64 GNU/Linux
Summary
Compilation of a no_std
binary on nightly fails with a linking error about the new stack probe feature.
Expected: The binary builds successfully, and rustc
links to the new __rust_probestack
implementation for my platform.
Observed: Building fails with a link error: undefined reference to `__rust_probestack'
Comments
I poked around the Rust source and recent PRs around stack probes, and the feature didn't seem to be configurable. Things that would be nice: the ability to toggle stack probes with a -C
flag, or to have a configurable language item, like we do for eh_personality
and panic_fmt
. I have not yet tried to work around this with linker arguments, as it is more of a weird edge case I ran into in some throwaway example code.
Question
Is there a reason this behavior is expected, and linking shouldn't just work?
Test case
The issue can be reproduced using the following project:
Cargo.toml
:
[package]
name = "example"
version = "0.1.0"
[dependencies]
libc = { version = "0.2.11", default-features = false }
and src/main.rs
:
#![feature(lang_items)]
#![feature(start)]
#![no_std]
extern crate libc;
// const SIZE: usize = 2008; // This is a threshold. The project successfully builds.
const SIZE: usize = 2009; // This is the smallest array size which triggered a failure.
struct S { data: [u8; SIZE] }
#[start]
fn start(_argc: isize, _argv: *const *const u8) -> isize {
let s = S { data: [0; SIZE] };
0
}
#[lang = "eh_personality"] extern fn eh_personality() {}
#[lang = "panic_fmt"] extern fn panic_fmt() -> ! { loop {} }
Output
Full error from cargo build
:
$ cargo build --verbose
Fresh libc v0.2.26
Compiling example v0.1.0 (file:///home/joe/src/example)
Running `rustc --crate-name example src/main.rs --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=9cb543322668ed58 -C extra-filename=-9cb543322668ed58 --out-dir /home/joe/src/example/target/debug/deps -L dependency=/home/joe/src/example/target/debug/deps --extern libc=/home/joe/src/example/target/debug/deps/liblibc-d2ff9e092d4e994b.rlib`
warning: field is never used: `data`
--> src/main.rs:9:12
|
9 | struct S { data: [u8; SIZE] }
| ^^^^^^^^^^^^^^^^
|
= note: #[warn(dead_code)] on by default
warning: unused variable: `s`
--> src/main.rs:13:9
|
13 | let s = S { data: [0; SIZE] };
| ^
|
= note: #[warn(unused_variables)] on by default
error: linking with `cc` failed: exit code: 1
|
= note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/home/joe/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/joe/src/example/target/debug/deps/example-9cb543322668ed58.0.o" "-o" "/home/joe/src/example/target/debug/deps/example-9cb543322668ed58" "-Wl,--gc-sections" "-pie" "-nodefaultlibs" "-L" "/home/joe/src/example/target/debug/deps" "-L" "/home/joe/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/home/joe/src/example/target/debug/deps/liblibc-d2ff9e092d4e994b.rlib" "/home/joe/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-225cf0734ab321d6.rlib" "-Wl,-Bdynamic" "-l" "c" "-l" "m" "-l" "rt" "-l" "pthread" "-l" "util"
= note: /home/joe/src/example/target/debug/deps/example-9cb543322668ed58.0.o: In function `example::start':
/home/joe/src/example/src/main.rs:12: undefined reference to `__rust_probestack'
collect2: error: ld returned 1 exit status
error: aborting due to previous error
error: Could not compile `example`.
Caused by:
process didn't exit successfully: `rustc --crate-name example src/main.rs --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=9cb543322668ed58 -C extra-filename=-9cb543322668ed58 --out-dir /home/joe/src/example/target/debug/deps -L dependency=/home/joe/src/example/target/debug/deps --extern libc=/home/joe/src/example/target/debug/deps/liblibc-d2ff9e092d4e994b.rlib` (exit code: 101)