proc-macro-srv: make usage of RTLD_DEEPBIND portable
authorFabian Grünbichler <f.gruenbichler@proxmox.com>
Thu, 16 Jan 2025 15:34:12 +0000 (16:34 +0100)
committerFabian Grünbichler <debian@fabian.gruenbichler.email>
Tue, 21 Jan 2025 10:38:15 +0000 (11:38 +0100)
the constant is wrong on some platforms (e.g., on mips64el it's 0x10, and 0x8
is RTLD_NOLOAD which makes all this functionality broken), the libc crate takes
care of those differences for us.

fallback to old hard-coded value for non-glibc environments (which might or
might not of DEEPBIND support).

Forwarded: https://github.com/rust-lang/rust/pull/135591

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Gbp-Pq: Topic behaviour
Gbp-Pq: Name proc-macro-srv-make-usage-of-RTLD_DEEPBIND-portable.patch

src/tools/rust-analyzer/Cargo.lock
src/tools/rust-analyzer/crates/proc-macro-srv/Cargo.toml
src/tools/rust-analyzer/crates/proc-macro-srv/src/dylib.rs

index 019609e6a5beb64566522a1f4b528e359388ed27..bf08430d49b8e0524565cb1e9b36d2291fdf9b6b 100644 (file)
@@ -1357,6 +1357,7 @@ dependencies = [
  "base-db",
  "expect-test",
  "intern",
+ "libc",
  "libloading",
  "memmap2",
  "object 0.33.0",
index 4fabcc900676e9b687a88a26b38ba4afa7e941ac..28ca44b682abe0177ebfcc5353eeabf9162f45f2 100644 (file)
@@ -14,6 +14,7 @@ doctest = false
 
 [dependencies]
 object.workspace = true
+libc.workspace = true
 libloading.workspace = true
 memmap2.workspace = true
 
index 78ae4574c409b9770b74cd4eb480c1cbe2b4cdf2..745bfc3f43b3499adaf6cf20a3597b1808f1fa37 100644 (file)
@@ -65,11 +65,16 @@ fn load_library(file: &Utf8Path) -> Result<Library, libloading::Error> {
 
 #[cfg(unix)]
 fn load_library(file: &Utf8Path) -> Result<Library, libloading::Error> {
+    // not defined by POSIX, different values on mips vs other targets
+    #[cfg(target_env = "gnu")]
+    use libc::RTLD_DEEPBIND;
     use libloading::os::unix::Library as UnixLibrary;
-    use std::os::raw::c_int;
+    // defined by POSIX
+    use libloading::os::unix::RTLD_NOW;
 
-    const RTLD_NOW: c_int = 0x00002;
-    const RTLD_DEEPBIND: c_int = 0x00008;
+    // MUSL and bionic don't have it..
+    #[cfg(not(target_env = "gnu"))]
+    const RTLD_DEEPBIND: std::os::raw::c_int = 0x0;
 
     unsafe { UnixLibrary::open(Some(file), RTLD_NOW | RTLD_DEEPBIND).map(|lib| lib.into()) }
 }