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 /// 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 { for program_header in &self.program_headers {
let type_ = program_header.get_type().map_err(|_| { let type_ = program_header.get_type().map_err(|_| {
Error::with_message(Errno::ENOEXEC, "parse program header type fails") Error::with_message(Errno::ENOEXEC, "parse program header type fails")
@ -102,13 +102,10 @@ impl Elf {
let ldso = CStr::from_bytes_with_nul( let ldso = CStr::from_bytes_with_nul(
&file_header_buf[file_offset..file_offset + file_size], &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!( Ok(None)
Errno::ENOEXEC,
"cannot find interpreter section in dyn-link program"
)
} }
// An offset to be subtracted from ELF vaddr for PIE // An offset to be subtracted from ELF vaddr for PIE

View File

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