mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-27 19:33:23 +00:00
Fix the loading of dynamic linking program
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
7694c5a6b8
commit
e7298bb276
@ -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
|
||||||
|
@ -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> {
|
||||||
|
Reference in New Issue
Block a user