Fix the loading of dynamic linking program

This commit is contained in:
YanWQ-monad
2024-06-06 16:23:23 +08:00
committed by Tate, Hongliang Tian
parent 7694c5a6b8
commit e7298bb276
2 changed files with 9 additions and 18 deletions

View File

@ -90,7 +90,7 @@ impl Elf {
}
/// read the ldso path from the elf interpret section
pub fn ldso_path(&self, file_header_buf: &[u8]) -> Result<String> {
pub fn ldso_path(&self, file_header_buf: &[u8]) -> Result<Option<String>> {
for program_header in &self.program_headers {
let type_ = program_header.get_type().map_err(|_| {
Error::with_message(Errno::ENOEXEC, "parse program header type fails")
@ -102,13 +102,10 @@ impl Elf {
let ldso = CStr::from_bytes_with_nul(
&file_header_buf[file_offset..file_offset + file_size],
)?;
return Ok(ldso.to_string_lossy().to_string());
return Ok(Some(ldso.to_string_lossy().to_string()));
}
}
return_errno_with_message!(
Errno::ENOEXEC,
"cannot find interpreter section in dyn-link program"
)
Ok(None)
}
// An offset to be subtracted from ELF vaddr for PIE

View File

@ -45,15 +45,7 @@ pub fn load_elf_to_vm(
) -> Result<ElfLoadInfo> {
let parsed_elf = Elf::parse_elf(file_header)?;
let ldso = if parsed_elf.is_shared_object() {
Some(lookup_and_parse_ldso(
&parsed_elf,
file_header,
fs_resolver,
)?)
} else {
None
};
let ldso = lookup_and_parse_ldso(&parsed_elf, file_header, fs_resolver)?;
match init_and_map_vmos(process_vm, ldso, &parsed_elf, &elf_file) {
Ok((entry_point, mut aux_vec)) => {
@ -98,9 +90,11 @@ fn lookup_and_parse_ldso(
elf: &Elf,
file_header: &[u8],
fs_resolver: &FsResolver,
) -> Result<(Arc<Dentry>, Elf)> {
) -> Result<Option<(Arc<Dentry>, Elf)>> {
let ldso_file = {
let ldso_path = elf.ldso_path(file_header)?;
let Some(ldso_path) = elf.ldso_path(file_header)? else {
return Ok(None);
};
let fs_path = FsPath::new(AT_FDCWD, &ldso_path)?;
fs_resolver.lookup(&fs_path)?
};
@ -110,7 +104,7 @@ fn lookup_and_parse_ldso(
inode.read_at(0, &mut *buf)?;
Elf::parse_elf(&*buf)?
};
Ok((ldso_file, ldso_elf))
Ok(Some((ldso_file, ldso_elf)))
}
fn load_ldso(root_vmar: &Vmar<Full>, ldso_file: &Dentry, ldso_elf: &Elf) -> Result<LdsoLoadInfo> {