diff --git a/dynlst.txt b/dynlst.txt index 6fc04ee2af..d199c919fe 100644 --- a/dynlst.txt +++ b/dynlst.txt @@ -1,4 +1,6 @@ { +environ; + stdin; stdout; stderr; diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs index 7beca76567..26ea577e48 100644 --- a/src/ld_so/linker.rs +++ b/src/ld_so/linker.rs @@ -563,7 +563,9 @@ impl Linker { pub fn fini(&self) { for obj in self.objects.values() { - obj.run_fini(); + unsafe { + obj.run_fini(); + } } } diff --git a/src/ld_so/start.rs b/src/ld_so/start.rs index 53f2f532a6..a00f1d328f 100644 --- a/src/ld_so/start.rs +++ b/src/ld_so/start.rs @@ -1,6 +1,6 @@ // Start code adapted from https://gitlab.redox-os.org/redox-os/relibc/blob/master/src/start.rs -use core::slice; +use core::{slice, str::FromStr}; use alloc::{ borrow::ToOwned, @@ -9,6 +9,7 @@ use alloc::{ string::{String, ToString}, vec::Vec, }; +use log::LevelFilter; use object::{ NativeEndian, elf::{self, PT_DYNAMIC, PT_PHDR}, @@ -28,7 +29,7 @@ use crate::{ }, linker::{DebugFlags, Me}, }, - platform::{auxv_iter, get_auxvs, types::c_char}, + platform::{auxv_iter, get_auxvs, logger::RELIBC_LOG_ENV_VAR, types::c_char}, start::Stack, sync::mutex::Mutex, }; @@ -406,9 +407,10 @@ fn stage2( .collect::>(), ); - crate::platform::environ = crate::platform::OUR_ENVIRON.unsafe_mut().as_mut_ptr(); - - if let Err(_) = crate::platform::logger::init() { + if let Some(env) = envs.get(RELIBC_LOG_ENV_VAR.to_str().unwrap()) + && let Ok(level) = LevelFilter::from_str(env) + && let Err(_) = crate::platform::logger::init(level) + { log::error!("Logger has already been initialised"); } } diff --git a/src/platform/logger.rs b/src/platform/logger.rs index 6e6a4c5731..4ce7570895 100644 --- a/src/platform/logger.rs +++ b/src/platform/logger.rs @@ -1,28 +1,26 @@ -use core::{fmt, str::FromStr}; +use core::fmt; use crate::{c_str::CStr, io::prelude::*, sync::Mutex}; use alloc::string::{String, ToString}; -use log::{Metadata, Record, SetLoggerError}; +use log::{LevelFilter, Metadata, Record, SetLoggerError}; const DEFAULT_LOG_LEVEL: log::LevelFilter = log::LevelFilter::Info; -pub unsafe fn init() -> Result<(), SetLoggerError> { +pub const RELIBC_LOG_ENV_VAR: &'static core::ffi::CStr = c"RELIBC_LOG_LEVEL"; + +pub unsafe fn init(level: LevelFilter) -> Result<(), SetLoggerError> { let mut logger = RedoxLogger::new(); - let log_env = c"RELIBC_LOG_LEVEL".as_ptr(); #[cfg(feature = "no_trace")] let mut trace_warn = false; unsafe { - if let Some(env) = CStr::from_nullable_ptr(crate::header::stdlib::getenv(log_env)) - && let Ok(level) = log::LevelFilter::from_str(env.to_str().unwrap_or("")) - { - #[cfg(feature = "no_trace")] - if level == log::LevelFilter::Trace { - trace_warn = true; - } - - logger = logger.with_output(OutputBuilder::stderr().with_filter(level).build()); + #[cfg(feature = "no_trace")] + if level == log::LevelFilter::Trace { + trace_warn = true; } + + logger = logger.with_output(OutputBuilder::stderr().with_filter(level).build()); + if let Some(name) = CStr::from_nullable_ptr(crate::platform::program_invocation_short_name) { logger = logger.with_process_name(name.to_str().unwrap_or("").to_string()); diff --git a/src/start.rs b/src/start.rs index 1289cd39ff..acc258c0e5 100644 --- a/src/start.rs +++ b/src/start.rs @@ -1,12 +1,13 @@ //! Startup code. use alloc::vec::Vec; -use core::{intrinsics, ptr}; +use core::{intrinsics, ptr, str::FromStr}; use crate::{ + c_str::CStr, header::{libgen, stdio, stdlib}, ld_so::{self}, - platform::{self, Pal, Sys, get_auxvs, types::*}, + platform::{self, Pal, Sys, get_auxvs, logger::RELIBC_LOG_ENV_VAR, types::*}, }; #[repr(C)] @@ -221,8 +222,12 @@ pub unsafe extern "C" fn relibc_start_v1( unsafe { crate::platform::init(auxvs) }; init_array(); } - unsafe { - if let Err(_) = crate::platform::logger::init() + + if let Some(env) = unsafe { + CStr::from_nullable_ptr(crate::header::stdlib::getenv(RELIBC_LOG_ENV_VAR.as_ptr())) + } && let Ok(level) = log::LevelFilter::from_str(env.to_str().unwrap_or("")) + { + if let Err(_) = unsafe { crate::platform::logger::init(level) } && !is_dynamically_linked { log::error!("Logger has already been initialised");