Overriding get_stack_start() in lang_start

So I was tracing my app's system calls with dtruss on OS X:

sudo dtruss -s -f 'target/debug/app'

My app is using mmap() and then I noticed that the runtime uses mmap() as well. Indeed one call allocates the stack:

3028/0x46e81: mmap(0x7FFF52DDD000, 0x1000, 0x0, 0x1012, 0xFFFFFFFF, 0x0) = 0x7FFF52DDD000 0

          libsystem_kernel.dylib`__mmap+0xa
          app`std::rt::lang_start::h3242da5422f8b0a3+0x9e
          app`main+0x2a
          libdyld.dylib`start+0x1
          app`0x5

This is mmap() allocating a mapping at a particular address, moreover this is a high address. mmap() is getting called from sys::init in lang_start. It's getting this address from get_stack_start() which for OS X looks like:

unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
    current().map(|s| s as *mut libc::c_void)
}

My question is, and it's kind of a Rust language question, is there any way to override get_stack_start() and control stack allocation myself? Of course there is, but is there a Rust preferred way of doing this overriding?

FWIW, thread stacks are probably allocated by allocatestack in glibc. I'm pretty sure they're mmap()'ing pages without specified addresses (mmap(0, ...) and no get_stack_start()).

1 Like