From d7e7ecea6c3f8360a6b1f9d817682049ee7a5bcd Mon Sep 17 00:00:00 2001 From: Omri Steiner Date: Fri, 2 May 2025 18:24:30 +0200 Subject: [PATCH] aya: uprobe attach: use mmap instead of reading whole binaries to memory --- aya/src/programs/uprobe.rs | 10 +++++----- aya/src/sys/mmap.rs | 22 ++++++++++++++++++++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/aya/src/programs/uprobe.rs b/aya/src/programs/uprobe.rs index 116ca3d8..2ec94859 100644 --- a/aya/src/programs/uprobe.rs +++ b/aya/src/programs/uprobe.rs @@ -23,7 +23,7 @@ use crate::{ perf_attach::{PerfLinkIdInner, PerfLinkInner}, probe::{OsStringExt as _, ProbeKind, attach}, }, - sys::bpf_link_get_info_by_fd, + sys::{MMap, bpf_link_get_info_by_fd}, }; const LD_SO_CACHE_FILE: &str = "/etc/ld.so.cache"; @@ -712,15 +712,15 @@ fn symbol_translated_address( } fn resolve_symbol(path: &Path, symbol: &str) -> Result { - 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 +729,7 @@ fn resolve_symbol(path: &Path, symbol: &str) -> Result 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)?; diff --git a/aya/src/sys/mmap.rs b/aya/src/sys/mmap.rs index 30ff0911..a576ab88 100644 --- a/aya/src/sys/mmap.rs +++ b/aya/src/sys/mmap.rs @@ -1,8 +1,13 @@ //! Safe wrapper around memory-mapped files. -use std::{io, os::fd::BorrowedFd, ptr}; +use std::{ + fs, io, + os::fd::{AsFd as _, BorrowedFd}, + path::Path, + ptr, +}; -use libc::{MAP_FAILED, c_int, c_void, off_t}; +use libc::{MAP_FAILED, MAP_PRIVATE, PROT_READ, c_int, c_void, off_t}; use super::{SyscallError, mmap, munmap}; @@ -46,6 +51,19 @@ impl MMap { } } } + + /// Maps the file at `path` for reading, using `mmap` with `MAP_PRIVATE`. + pub(crate) fn mmap_whole_file(path: &Path) -> Result { + let file = fs::File::open(path)?; + Self::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 {