Browse Source

Merge branch 'master' of https://gitlab.redox-os.org/redox-os/relibc

Jeremy Soller 4 years ago
parent
commit
5aa74fd2f3
3 changed files with 18 additions and 6 deletions
  1. 4 1
      src/ld_so/linker.rs
  2. 11 2
      src/ld_so/mod.rs
  3. 3 3
      src/ld_so/start.rs

+ 4 - 1
src/ld_so/linker.rs

@@ -29,6 +29,7 @@ use super::{
     debug::{RTLDDebug, RTLDState, _dl_debug_state, _r_debug},
     tcb::{Master, Tcb},
     PAGE_SIZE,
+    access,
 };
 
 #[cfg(target_os = "redox")]
@@ -169,7 +170,9 @@ impl Linker {
                     })?;
 
                     // TODO: Use R_OK | X_OK
-                    unistd::access(path_c.as_ptr(), unistd::F_OK) == 0
+                    // We cannot use unix stdlib because errno is thead local variable
+                    // and fs:[0] is not set yet.
+                    access(path_c.as_ptr(), unistd::F_OK) == 0
                 };
 
                 if access {

+ 11 - 2
src/ld_so/mod.rs

@@ -1,8 +1,11 @@
 use goblin::elf::program_header::{self, program_header32, program_header64, ProgramHeader};
 
 use self::tcb::{Master, Tcb};
-use crate::start::Stack;
-
+use crate::{
+start::Stack,
+c_str::CStr,
+platform::types::*
+};
 pub const PAGE_SIZE: usize = 4096;
 
 pub mod debug;
@@ -80,6 +83,12 @@ pub fn static_init(sp: &'static Stack) {
     }
 }
 
+// Wrapper over the systemcall, Do not use outside of ld_so
+pub unsafe fn access(path: *const c_char, mode: c_int) -> c_int {
+        let path = CStr::from_ptr(path);
+        syscall!(ACCESS, (path).as_ptr(), mode) as c_int
+}
+
 #[cfg(target_os = "linux")]
 pub unsafe fn init(sp: &'static Stack) {
     let mut tp = 0usize;

+ 3 - 3
src/ld_so/start.rs

@@ -138,8 +138,8 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack, ld_entry: usize) ->
 
     // Some variables that will be overridden by environment and auxiliary vectors
     let library_path = match envs.get("LD_LIBRARY_PATH") {
-        Some(lib_path) => lib_path,
-        None => "/lib",
+        Some(lib_path) => lib_path.to_owned() + ":/lib",
+        None => "/lib".to_owned(),
     };
 
     let path = if is_manual {
@@ -178,7 +178,7 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack, ld_entry: usize) ->
         }
         pr
     };
-    let mut linker = Linker::new(library_path, false);
+    let mut linker = Linker::new(&library_path, false);
     match linker.load(&path, &path) {
         Ok(()) => (),
         Err(err) => {