pub struct Env {
pub arg_c: u64,
pub arg_v: *const *const u8,
pub env_p: *const *const u8,
}
#[must_use]
#[inline(always)]
#[cfg(not(feature = "aux"))]
#[expect(clippy::cast_ptr_alignment, clippy::cast_possible_truncation)]
pub unsafe fn resolve(stack_ptr: *const u8, _dynv: *const usize) -> Env {
let argc = *stack_ptr.cast::<u64>();
let argv = stack_ptr.add(8).cast::<*const u8>();
let ptr_size = core::mem::size_of::<usize>();
let env_offset = 8 + argc as usize * ptr_size + ptr_size;
let envp = stack_ptr.add(env_offset).cast::<*const u8>();
Env {
arg_c: argc,
arg_v: argv,
env_p: envp,
}
}
#[must_use]
#[inline(always)]
#[cfg(feature = "aux")]
#[expect(
clippy::cast_ptr_alignment,
clippy::cast_possible_truncation,
clippy::used_underscore_binding
)]
pub unsafe fn resolve(
stack_ptr: *const u8,
_dynv: *const usize,
) -> (Env, crate::elf::aux::AuxValues) {
let argc = *stack_ptr.cast::<u64>();
let argv = stack_ptr.add(8).cast::<*const u8>();
let ptr_size = core::mem::size_of::<usize>();
let env_offset = 8 + argc as usize * ptr_size + ptr_size;
let envp = stack_ptr.add(env_offset).cast::<*const u8>();
let mut null_offset = 0;
loop {
let val = *(envp.add(null_offset));
if val as usize == 0 {
break;
}
null_offset += 1;
}
let addr = envp.add(null_offset).cast::<usize>();
let aux_v_ptr = addr.add(1);
let aux = crate::elf::aux::AuxValues::from_auxv(aux_v_ptr);
crate::elf::dynlink::relocate_symbols(_dynv, &aux);
(
Env {
arg_c: argc,
arg_v: argv,
env_p: envp,
},
aux,
)
}