Browse Source

Use the same Stack struct for ld_so start as for relibc start

Jeremy Soller 5 years ago
parent
commit
2a68c68dc6
2 changed files with 17 additions and 16 deletions
  1. 2 7
      src/ld_so/start.rs
  2. 15 9
      src/start.rs

+ 2 - 7
src/ld_so/start.rs

@@ -4,14 +4,9 @@ use c_str::CStr;
 use header::unistd;
 use platform::types::c_char;
 
+use crate::start::Stack;
 use super::linker::Linker;
 
-#[repr(C)]
-pub struct Stack {
-    argc: isize,
-    argv0: *const c_char,
-}
-
 #[no_mangle]
 pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize {
     if sp.argc < 2 {
@@ -26,7 +21,7 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize {
 
     // Pop the first argument (path to ld_so), and get the path of the program
     let path_c = unsafe {
-        let mut argv = &mut sp.argv0 as *mut *const c_char as *mut usize;
+        let mut argv = sp.argv() as *mut usize;
 
         // Move arguments
         loop {

+ 15 - 9
src/start.rs

@@ -8,21 +8,27 @@ use platform::{Pal, Sys};
 
 #[repr(C)]
 pub struct Stack {
-    argc: isize,
-    argv0: *const c_char,
+    pub argc: isize,
+    pub argv0: *const c_char,
 }
 
 impl Stack {
-    fn argc(&self) -> isize {
-        self.argc
+    pub fn argv(&self) -> *const *const c_char {
+        &self.argv0 as *const _
     }
 
-    fn argv(&self) -> *const *const c_char {
-        &self.argv0 as *const _
+    pub fn envp(&self) -> *const *const c_char {
+        unsafe { self.argv().offset(self.argc + 1) }
     }
 
-    fn envp(&self) -> *const *const c_char {
-        unsafe { self.argv().offset(self.argc() + 1) }
+    pub fn auxv(&self) -> *const (usize, usize) {
+        unsafe {
+            let mut envp = self.envp();
+            while !(*envp).is_null() {
+                envp = envp.add(1);
+            }
+            envp.add(1) as *const (usize, usize)
+        }
     }
 }
 
@@ -72,7 +78,7 @@ pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! {
     relibc_verify_host();
 
     // Set up argc and argv
-    let argc = sp.argc();
+    let argc = sp.argc;
     let argv = sp.argv();
     platform::inner_argv = copy_string_array(argv, argc as usize);
     platform::argv = platform::inner_argv.as_mut_ptr();