aya: uprobe attach: use mmap instead of reading whole binaries to memory

reviewable/pr1261/r3
Omri Steiner 4 weeks ago
parent 195ad53e1f
commit 239c907357

@ -24,6 +24,7 @@ use crate::{
probe::{OsStringExt as _, ProbeKind, attach},
},
sys::bpf_link_get_info_by_fd,
util::mmap::MMap,
};
const LD_SO_CACHE_FILE: &str = "/etc/ld.so.cache";
@ -712,15 +713,15 @@ fn symbol_translated_address(
}
fn resolve_symbol(path: &Path, symbol: &str) -> Result<u64, ResolveSymbolError> {
let data = fs::read(path)?;
let obj = object::read::File::parse(&*data)?;
let data = MMap::mmap_whole_file(path)?;
let obj = object::read::File::parse(data.as_ref())?;
if let Some(sym) = find_symbol_in_object(&obj, symbol) {
symbol_translated_address(&obj, sym, symbol)
} else {
// Only search in the debug object if the symbol was not found in the main object
let debug_path = find_debug_path_in_object(&obj, path, symbol)?;
let debug_data = fs::read(&debug_path).map_err(|e| {
let debug_data = MMap::mmap_whole_file(&debug_path).map_err(|e| {
ResolveSymbolError::DebuglinkAccessError(
debug_path
.to_str()
@ -729,7 +730,7 @@ fn resolve_symbol(path: &Path, symbol: &str) -> Result<u64, ResolveSymbolError>
e,
)
})?;
let debug_obj = object::read::File::parse(&*debug_data)?;
let debug_obj = object::read::File::parse(debug_data.as_ref())?;
verify_build_ids(&obj, &debug_obj, symbol)?;

@ -1,7 +1,12 @@
//! Safe wrapper around memory-mapped files.
use libc::{MAP_FAILED, c_int, c_void, off_t};
use std::{io, os::fd::BorrowedFd, ptr};
use libc::{MAP_FAILED, MAP_PRIVATE, PROT_READ, c_int, c_void, off_t};
use std::{
fs, io,
os::fd::{AsFd, BorrowedFd},
path::Path,
ptr,
};
use crate::sys::{SyscallError, mmap, munmap};
@ -45,6 +50,19 @@ impl MMap {
}
}
}
/// Maps the file at `path` for reading, using `mmap` with `MAP_PRIVATE`.
pub(crate) fn mmap_whole_file(path: &Path) -> Result<Self, io::Error> {
let file = fs::File::open(path)?;
MMap::new(
file.as_fd(),
file.metadata()?.len() as usize,
PROT_READ,
MAP_PRIVATE,
0,
)
.map_err(|e| e.io_error)
}
}
impl AsRef<[u8]> for MMap {

Loading…
Cancel
Save