std: Fix thread_local! in non-PIE binaries

One of the parameters to the magical "register a thread-local destructor"
function is called `__dso_handle` and largely just passed along (this seems to
be what other implementations do). Currently we pass the *value* of this symbol,
but apparently the correct piece of information to pass is the *address* of the
symbol.

In a PIE binary the symbol actually contains an address to itself which is why
we've gotten away with what we're doing as long as we have. In a non-PIE binary
the symbol contains the address `NULL`, causing a segfault in the runtime
library if it keeps going.

Closes #24445
This commit is contained in:
Alex Crichton
2015-04-14 23:26:42 -07:00
parent 16e1fcead1
commit 3e57c6c3ba
4 changed files with 54 additions and 1 deletions

View File

@@ -373,7 +373,7 @@ mod imp {
arg: *mut u8,
dso_handle: *mut u8) -> libc::c_int;
mem::transmute::<*const (), F>(__cxa_thread_atexit_impl)
(dtor, t, __dso_handle);
(dtor, t, &__dso_handle as *const _ as *mut _);
return
}