From 462514ed4c4c06e9618d029a57708c7fa14ab748 Mon Sep 17 00:00:00 2001 From: swananan Date: Thu, 9 May 2024 00:23:08 +0800 Subject: [PATCH] aya: adjust symbol lookup tests for object crate alignment requirements The object::File::parse API requires parameter to be aligned with 8 bytes. Adjusted the Vec in the tests with miri to meet this requirement. --- aya/src/programs/uprobe.rs | 53 +++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/aya/src/programs/uprobe.rs b/aya/src/programs/uprobe.rs index cce96c90..63164119 100644 --- a/aya/src/programs/uprobe.rs +++ b/aya/src/programs/uprobe.rs @@ -648,12 +648,41 @@ mod tests { obj.write() } + fn aligned_slice<'a>(vec: &'a mut Vec) -> &'a mut [u8] { + let alignment = 8; + + let original_size = vec.len(); + let total_size = original_size + alignment - 1; + + if vec.capacity() < total_size { + vec.reserve(total_size - vec.capacity()); + } + + if vec.len() < total_size { + vec.resize(total_size, 0); + } + + let ptr = vec.as_ptr() as usize; + + let aligned_ptr = (ptr + alignment - 1) & !(alignment - 1); + + let offset = aligned_ptr - ptr; + + if offset > 0 { + let tmp = vec.len(); + vec.copy_within(0..tmp - offset, offset); + } + + &mut vec[offset..offset + original_size] + } + #[test] fn test_find_debug_path_success() { let debug_filepath = b"main.debug"; - let main_bytes = create_elf_with_debuglink(debug_filepath, 0x123 /* fake CRC */) + let mut main_bytes = create_elf_with_debuglink(debug_filepath, 0x123 /* fake CRC */) .expect("got main_bytes"); - let main_obj = object::File::parse(&*main_bytes).expect("got main obj"); + let align_bytes = aligned_slice(&mut main_bytes); + let main_obj = object::File::parse(&*align_bytes).expect("got main obj"); let main_path = Path::new("/path/to/main"); let result = find_debug_path_in_object(&main_obj, main_path, "symbol"); @@ -664,11 +693,13 @@ mod tests { #[test] fn test_verify_build_ids_same() { let build_id = b"test_build_id"; - let main_bytes = create_elf_with_build_id(build_id).expect("got main_bytes"); - let main_obj = object::File::parse(&*main_bytes).expect("got main obj"); + let mut main_bytes = create_elf_with_build_id(build_id).expect("got main_bytes"); + let align_bytes = aligned_slice(&mut main_bytes); + let main_obj = object::File::parse(&*align_bytes).expect("got main obj"); let debug_build_id = b"test_build_id"; - let debug_bytes = create_elf_with_build_id(debug_build_id).expect("got debug bytes"); - let debug_obj = object::File::parse(&*debug_bytes).expect("got debug obj"); + let mut debug_bytes = create_elf_with_build_id(debug_build_id).expect("got debug bytes"); + let align_bytes = aligned_slice(&mut debug_bytes); + let debug_obj = object::File::parse(&*align_bytes).expect("got debug obj"); assert!(verify_build_ids(&main_obj, &debug_obj, "symbol_name").is_ok()); } @@ -676,11 +707,13 @@ mod tests { #[test] fn test_verify_build_ids_different() { let build_id = b"main_build_id"; - let main_bytes = create_elf_with_build_id(build_id).expect("got main_bytes"); - let main_obj = object::File::parse(&*main_bytes).expect("got main obj"); + let mut main_bytes = create_elf_with_build_id(build_id).expect("got main_bytes"); + let align_bytes = aligned_slice(&mut main_bytes); + let main_obj = object::File::parse(&*align_bytes).expect("got main obj"); let debug_build_id = b"debug_build_id"; - let debug_bytes = create_elf_with_build_id(debug_build_id).expect("got debug bytes"); - let debug_obj = object::File::parse(&*debug_bytes).expect("got debug obj"); + let mut debug_bytes = create_elf_with_build_id(debug_build_id).expect("got debug bytes"); + let align_bytes = aligned_slice(&mut debug_bytes); + let debug_obj = object::File::parse(&*align_bytes).expect("got debug obj"); assert!(matches!( verify_build_ids(&main_obj, &debug_obj, "symbol_name"),