From c5994dd390cb9b61259301c64b9e0f3469975a0d Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Sun, 9 Mar 2025 14:42:38 +0200 Subject: [PATCH] libc: implement program_invocation_[short_]name --- userspace/dyn-loader/src/env.rs | 6 +++++- userspace/dyn-loader/src/main.rs | 3 ++- userspace/lib/ygglibc/src/env.rs | 19 +++++++++++++++++++ .../lib/ygglibc/src/headers/langinfo/mod.rs | 2 +- userspace/lib/ygglibc/src/process.rs | 8 -------- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/userspace/dyn-loader/src/env.rs b/userspace/dyn-loader/src/env.rs index d67e53c1..2fd2bdbe 100644 --- a/userspace/dyn-loader/src/env.rs +++ b/userspace/dyn-loader/src/env.rs @@ -73,7 +73,7 @@ impl<'a> ArgPlacer<'a> { } } -pub fn build_argument(args: &[String], auxv: &[AuxValue]) -> Result { +pub fn build_argument(args: &[String], binary: &str, auxv: &[AuxValue]) -> Result { let mut buffer = Mapping::new(0x1000, MappingFlags::WRITE)?; let arg_base = buffer.as_ptr().addr(); let mut placer = ArgPlacer::new(&mut buffer[..]); @@ -93,12 +93,16 @@ pub fn build_argument(args: &[String], auxv: &[AuxValue]) -> Result())?; let argument = placer.position + arg_base; placer.put(&argv)?; placer.put(&envp)?; placer.put(&auxv)?; + placer.put(&real_program)?; buffer.leak(); diff --git a/userspace/dyn-loader/src/main.rs b/userspace/dyn-loader/src/main.rs index c72eaa20..9a964374 100644 --- a/userspace/dyn-loader/src/main.rs +++ b/userspace/dyn-loader/src/main.rs @@ -38,6 +38,7 @@ pub struct Args { static mut OBJECTS: MaybeUninit = MaybeUninit::uninit(); fn run(binary: &Path, args: &Args) -> Result { + let binary_str = binary.to_str().unwrap(); let mut config = Config::load_or_default()?; config.extend_from_env(); @@ -128,7 +129,7 @@ fn run(binary: &Path, args: &Args) -> Result { OBJECTS.write(objects) }; - let argument = env::build_argument(&args.args, &auxv)?; + let argument = env::build_argument(&args.args, binary_str, &auxv)?; unsafe { enter(entry, argument) }; } diff --git a/userspace/lib/ygglibc/src/env.rs b/userspace/lib/ygglibc/src/env.rs index ab6514d8..62e6f47f 100644 --- a/userspace/lib/ygglibc/src/env.rs +++ b/userspace/lib/ygglibc/src/env.rs @@ -22,6 +22,11 @@ use crate::{ #[no_mangle] pub static mut environ: *mut *mut c_char = null_mut(); +#[no_mangle] +pub static mut program_invocation_short_name: *mut c_char = null_mut(); +#[no_mangle] +pub static mut program_invocation_name: *mut c_char = null_mut(); + static mut shadow: Vec<*mut c_char> = Vec::new(); unsafe fn get_key(var: NonNull) -> Option<&'static [u8]> { @@ -224,6 +229,20 @@ pub fn handle_kernel_argument(arg: usize) -> Vec { args.push(c_arg); } + if let Some(arg0) = args.get(0) { + let invocation_name_str = arg0.to_str().unwrap(); + let invocation_name = arg0.clone(); + let invocation_name_short_str = + if let Some((_, basename)) = invocation_name_str.rsplit_once('/') { + basename.trim() + } else { + invocation_name_str + }; + let invocation_name_short = CString::new(invocation_name_short_str).unwrap(); + unsafe { program_invocation_name = invocation_name.into_raw() }; + unsafe { program_invocation_short_name = invocation_name_short.into_raw() }; + } + unsafe { setup_env(arg.envs()) }; // Setup TLS from argument diff --git a/userspace/lib/ygglibc/src/headers/langinfo/mod.rs b/userspace/lib/ygglibc/src/headers/langinfo/mod.rs index cbb1cd32..2b66d8ac 100644 --- a/userspace/lib/ygglibc/src/headers/langinfo/mod.rs +++ b/userspace/lib/ygglibc/src/headers/langinfo/mod.rs @@ -1,4 +1,4 @@ -use core::{ffi::c_char, ptr::null_mut}; +use core::ffi::c_char; use super::{locale::locale_t, nl_types::nl_item}; diff --git a/userspace/lib/ygglibc/src/process.rs b/userspace/lib/ygglibc/src/process.rs index bae932db..da105559 100644 --- a/userspace/lib/ygglibc/src/process.rs +++ b/userspace/lib/ygglibc/src/process.rs @@ -1,7 +1,6 @@ use core::{ ffi::{c_char, c_int, c_void, CStr}, mem::MaybeUninit, - ptr::null_mut, time::Duration, }; @@ -30,13 +29,6 @@ impl DsoDestructor { } } -#[allow(non_upper_case_globals)] -#[no_mangle] -static mut program_invocation_short_name: *mut c_char = null_mut(); -#[allow(non_upper_case_globals)] -#[no_mangle] -static mut program_invocation_name: *mut c_char = null_mut(); - static AT_EXIT: Mutex> = Mutex::new(Vec::new()); // TODO this will be in the linker instead static AT_DSO_EXIT: Mutex> = Mutex::new(Vec::new());