Skip to content
Snippets Groups Projects
Verified Commit 63cb2f34 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

ld.so: Add auxv support, get ld_library_path from env

parent 084b69b3
No related branches found
No related tags found
No related merge requests found
...@@ -20,19 +20,77 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize { ...@@ -20,19 +20,77 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize {
loop {} loop {}
} }
// Some variables that will be overridden by environment and auxiliary vectors
let mut library_path = "/lib";
let mut page_size = 4096;
// Pop the first argument (path to ld_so), and get the path of the program // Pop the first argument (path to ld_so), and get the path of the program
// TODO: Also retrieve LD_LIBRARY_PATH this way
let path_c = unsafe { let path_c = unsafe {
let mut argv = &mut sp.argv0 as *mut *const c_char; let mut argv = &mut sp.argv0 as *mut *const c_char as *mut usize;
// Move arguments
loop { loop {
let next_argv = argv.add(1); let next_argv = argv.add(1);
let arg = *next_argv; let arg = *next_argv;
*argv = arg; *argv = arg;
argv = next_argv; argv = next_argv;
if arg.is_null() { if arg == 0 {
break;
}
if let Ok(arg_str) = CStr::from_ptr(arg as *const c_char).to_str() {
println!(" arg: '{}'", arg_str);
}
}
// Move environment
loop {
let next_argv = argv.add(1);
let arg = *next_argv;
*argv = arg;
argv = next_argv;
if arg == 0 {
break;
}
if let Ok(arg_str) = CStr::from_ptr(arg as *const c_char).to_str() {
println!(" env: '{}'", arg_str);
let mut parts = arg_str.splitn(2, '=');
if let Some(key) = parts.next() {
if let Some(value) = parts.next() {
match key {
"LD_LIBRARY_PATH" => library_path = value,
_ => ()
}
}
}
}
}
// Move auxiliary vectors
loop {
let next_argv = argv.add(1);
let kind = *next_argv;
*argv = kind;
argv = next_argv;
let next_argv = argv.add(1);
let value = *next_argv;
*argv = value;
argv = next_argv;
if kind == 0 {
break; break;
} }
println!(" aux: {}={:#x}", kind, value);
match kind {
6 => page_size = value,
_ => (),
}
} }
sp.argc -= 1; sp.argc -= 1;
CStr::from_ptr(sp.argv0) CStr::from_ptr(sp.argv0)
...@@ -47,7 +105,7 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize { ...@@ -47,7 +105,7 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize {
} }
}; };
let mut linker = Linker::new("/usr/local/lib:/lib/x86_64-linux-gnu"); let mut linker = Linker::new(library_path);
match linker.load(&path, &path) { match linker.load(&path, &path) {
Ok(()) => (), Ok(()) => (),
Err(err) => { Err(err) => {
...@@ -58,7 +116,11 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize { ...@@ -58,7 +116,11 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize {
} }
match linker.link(&path) { match linker.link(&path) {
Ok(entry) => entry, Ok(entry) => {
eprintln!("ld.so: entry '{}': {:#x}", path, entry);
//unistd::_exit(0);
entry
},
Err(err) => { Err(err) => {
eprintln!("ld.so: failed to link '{}': {}", path, err); eprintln!("ld.so: failed to link '{}': {}", path, err);
unistd::_exit(1); unistd::_exit(1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment