From 64d6e3e3b62523b7c33d7206413b2f7c892ce047 Mon Sep 17 00:00:00 2001 From: Dave Tucker Date: Wed, 2 Aug 2023 18:33:13 +0100 Subject: [PATCH] aya: Fix (func|line)_info multiple progs in section This commit fixes the (func|line)_info when we have multiple programs in the same section. The integration test reloc.bpf.c serves as our test case here. This required filtering down the (func|line)_info to only that in scope of the current symbol + then adjusting the offets to appease the kernel. Signed-off-by: Dave Tucker --- aya-obj/src/obj.rs | 20 ++++++++++++++++++-- test/integration-test/bpf/reloc.bpf.c | 26 +++++++------------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/aya-obj/src/obj.rs b/aya-obj/src/obj.rs index eb16ba47..1daaa09d 100644 --- a/aya-obj/src/obj.rs +++ b/aya-obj/src/obj.rs @@ -614,10 +614,26 @@ impl Object { name: String, symbol: &Symbol, ) -> Result<(Program, Function), ParseError> { + let offset = symbol.address as usize - section.address as usize; let (func_info, line_info, func_info_rec_size, line_info_rec_size) = if let Some(btf_ext) = &self.btf_ext { - let func_info = btf_ext.func_info.get(section.name); - let line_info = btf_ext.line_info.get(section.name); + let bytes_offset = offset as u32 / INS_SIZE as u32; + let section_size_bytes = symbol.size as u32 / INS_SIZE as u32; + + let mut func_info = btf_ext.func_info.get(section.name); + func_info.func_info.retain(|f| f.insn_off == bytes_offset); + func_info.func_info.iter_mut().for_each(|f| { + f.insn_off -= bytes_offset; + }); + + let mut line_info = btf_ext.line_info.get(section.name); + line_info.line_info.retain(|l| { + l.insn_off >= bytes_offset && l.insn_off < (bytes_offset + section_size_bytes) + }); + line_info.line_info.iter_mut().for_each(|f| { + f.insn_off -= bytes_offset; + }); + ( func_info, line_info, diff --git a/test/integration-test/bpf/reloc.bpf.c b/test/integration-test/bpf/reloc.bpf.c index 510406dd..dbc464a4 100644 --- a/test/integration-test/bpf/reloc.bpf.c +++ b/test/integration-test/bpf/reloc.bpf.c @@ -29,9 +29,7 @@ __attribute__((noinline)) int field_global() { return set_output(__builtin_preserve_access_index(s.b)); } -SEC("uprobe/field") int field(void *ctx) { - return field_global(); -} +SEC("uprobe") int field(void *ctx) { return field_global(); } struct relocated_struct_with_pointer { struct relocated_struct_with_pointer *first; @@ -46,9 +44,7 @@ __attribute__((noinline)) int pointer_global() { return set_output((__u64)__builtin_preserve_access_index(s.first)); } -SEC("uprobe/pointer") int pointer(void *ctx) { - return pointer_global(); -} +SEC("uprobe") int pointer(void *ctx) { return pointer_global(); } __attribute__((noinline)) int struct_flavors_global() { struct relocated_struct_with_scalars s = {1, 2, 3}; @@ -59,9 +55,7 @@ __attribute__((noinline)) int struct_flavors_global() { } } -SEC("uprobe/struct_flavors") int struct_flavors(void *ctx) { - return struct_flavors_global(); -} +SEC("uprobe") int struct_flavors(void *ctx) { return struct_flavors_global(); } enum relocated_enum_unsigned_32 { U32 = 0xAAAAAAAA }; @@ -69,8 +63,7 @@ __attribute__((noinline)) int enum_unsigned_32_global() { return set_output(bpf_core_enum_value(enum relocated_enum_unsigned_32, U32)); } -SEC("uprobe/enum_unsigned_32") -int enum_unsigned_32(void *ctx) { +SEC("uprobe") int enum_unsigned_32(void *ctx) { return enum_unsigned_32_global(); } @@ -80,9 +73,7 @@ __attribute__((noinline)) int enum_signed_32_global() { return set_output(bpf_core_enum_value(enum relocated_enum_signed_32, S32)); } -SEC("uprobe/enum_signed_32") int enum_signed_32(void *ctx) { - return enum_signed_32_global(); -} +SEC("uprobe") int enum_signed_32(void *ctx) { return enum_signed_32_global(); } enum relocated_enum_unsigned_64 { U64 = 0xAAAAAAAABBBBBBBB }; @@ -90,8 +81,7 @@ __attribute__((noinline)) int enum_unsigned_64_global() { return set_output(bpf_core_enum_value(enum relocated_enum_unsigned_64, U64)); } -SEC("uprobe/enum_unsigned_64") -int enum_unsigned_64(void *ctx) { +SEC("uprobe") int enum_unsigned_64(void *ctx) { return enum_unsigned_64_global(); } @@ -101,6 +91,4 @@ __attribute__((noinline)) int enum_signed_64_global() { return set_output(bpf_core_enum_value(enum relocated_enum_signed_64, u64)); } -SEC("uprobe/enum_signed_64") int enum_signed_64(void *ctx) { - return enum_signed_64_global(); -} +SEC("uprobe") int enum_signed_64(void *ctx) { return enum_signed_64_global(); }