Refactor weak symbols in std::sys::unix
This makes a few changes to the weak symbol macros in `sys::unix`: - `dlsym!` is added to keep the functionality for runtime `dlsym` lookups, like for `__pthread_get_minstack@GLIBC_PRIVATE` that we don't want to show up in ELF symbol tables. - `weak!` now uses `#[linkage = "extern_weak"]` symbols, so its runtime behavior is just a simple null check. This is also used by `syscall!`. - On non-ELF targets (macos/ios) where that linkage is not known to behave, `weak!` is just an alias to `dlsym!` for the old behavior. - `raw_syscall!` is added to always call `libc::syscall` on linux and android, for cases like `clone3` that have no known libc wrapper. The new `weak!` linkage does mean that you'll get versioned symbols if you build with a newer glibc, like `WEAK DEFAULT UND statx@GLIBC_2.28`. This might seem problematic, but old non-weak symbols can tie the build to new versions too, like `dlsym@GLIBC_2.34` from their recent library unification. If you build with an old glibc like `dist-x86_64-linux` does, you'll still get unversioned `WEAK DEFAULT UND statx`, which may be resolved based on the runtime glibc. I also found a few functions that don't need to be weak anymore: - Android can directly use `ftruncate64`, `pread64`, and `pwrite64`, as these were added in API 12, and our baseline is API 14. - Linux can directly use `splice`, added way back in glibc 2.5 and similarly old musl. Android only added it in API 21 though.
This commit is contained in:
parent
e90c5fbbc5
commit
5ff6ac4287
10 changed files with 136 additions and 193 deletions
|
@ -501,7 +501,7 @@ impl FromRawFd for Socket {
|
|||
// res_init unconditionally, we call it only when we detect we're linking
|
||||
// against glibc version < 2.26. (That is, when we both know its needed and
|
||||
// believe it's thread-safe).
|
||||
#[cfg(all(target_env = "gnu", not(target_os = "vxworks")))]
|
||||
#[cfg(all(target_os = "linux", target_env = "gnu"))]
|
||||
fn on_resolver_failure() {
|
||||
use crate::sys;
|
||||
|
||||
|
@ -513,5 +513,5 @@ fn on_resolver_failure() {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(any(not(target_env = "gnu"), target_os = "vxworks"))]
|
||||
#[cfg(not(all(target_os = "linux", target_env = "gnu")))]
|
||||
fn on_resolver_failure() {}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue