about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan MacKenzie <ecstaticmorse@gmail.com>2020-08-25 12:11:30 -0700
committerDylan MacKenzie <ecstaticmorse@gmail.com>2020-08-25 12:11:30 -0700
commitaae6c0fbfe3051e5539f47d0e9d84ddee53f72bd (patch)
treeab33fa72f88c5a9ceec75f62e75abbe469c613b3
parentf07011bad8a4ca3bd65ce1ed236f017f55108816 (diff)
downloadrust-aae6c0fbfe3051e5539f47d0e9d84ddee53f72bd.tar.gz
rust-aae6c0fbfe3051e5539f47d0e9d84ddee53f72bd.zip
Explicitly pass `RTLD_LOCAL` to `dlopen`
This happens to be the default on Linux, but the default is unspecified
in the POSIX standard. Also switches to `cast` to keep line lengths in
check.
-rw-r--r--src/librustc_metadata/dynamic_lib.rs8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/librustc_metadata/dynamic_lib.rs b/src/librustc_metadata/dynamic_lib.rs
index 8c3c7b70f6c..bdb53e3f75a 100644
--- a/src/librustc_metadata/dynamic_lib.rs
+++ b/src/librustc_metadata/dynamic_lib.rs
@@ -99,10 +99,10 @@ mod dl {
         let s = CString::new(filename.as_bytes()).unwrap();
 
         let mut dlerror = error::lock();
-        let ret = unsafe { libc::dlopen(s.as_ptr(), libc::RTLD_LAZY) } as *mut u8;
+        let ret = unsafe { libc::dlopen(s.as_ptr(), libc::RTLD_LAZY | libc::RTLD_LOCAL) };
 
         if !ret.is_null() {
-            return Ok(ret);
+            return Ok(ret.cast());
         }
 
         // A NULL return from `dlopen` indicates that an error has definitely occurred, so if
@@ -122,10 +122,10 @@ mod dl {
         // error message by accident.
         dlerror.clear();
 
-        let ret = libc::dlsym(handle as *mut libc::c_void, symbol) as *mut u8;
+        let ret = libc::dlsym(handle as *mut libc::c_void, symbol);
 
         if !ret.is_null() {
-            return Ok(ret);
+            return Ok(ret.cast());
         }
 
         // If `dlsym` returns NULL but there is nothing in `dlerror` it means one of two things: