From e7298bb27667b9daf8a0d15671aca7236e587391 Mon Sep 17 00:00:00 2001 From: YanWQ-monad Date: Thu, 6 Jun 2024 16:23:23 +0800 Subject: [PATCH] Fix the loading of dynamic linking program --- .../src/process/program_loader/elf/elf_file.rs | 9 +++------ .../src/process/program_loader/elf/load_elf.rs | 18 ++++++------------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/kernel/aster-nix/src/process/program_loader/elf/elf_file.rs b/kernel/aster-nix/src/process/program_loader/elf/elf_file.rs index af1e43e63..24e923d95 100644 --- a/kernel/aster-nix/src/process/program_loader/elf/elf_file.rs +++ b/kernel/aster-nix/src/process/program_loader/elf/elf_file.rs @@ -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 { + pub fn ldso_path(&self, file_header_buf: &[u8]) -> Result> { 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 diff --git a/kernel/aster-nix/src/process/program_loader/elf/load_elf.rs b/kernel/aster-nix/src/process/program_loader/elf/load_elf.rs index 0df1749fc..d6797a129 100644 --- a/kernel/aster-nix/src/process/program_loader/elf/load_elf.rs +++ b/kernel/aster-nix/src/process/program_loader/elf/load_elf.rs @@ -45,15 +45,7 @@ pub fn load_elf_to_vm( ) -> Result { 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, Elf)> { +) -> Result, 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, ldso_file: &Dentry, ldso_elf: &Elf) -> Result {