Skip to content

Building no_std binary fails with link error "undefined reference to `__rust_probestack" #43264

Closed
@ranweiler

Description

@ranweiler

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-linkageArea: linking into static, shared libraries and binariesC-bugCategory: This is a bug.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions