aya: fix bug with nested call relocations

Use the correct offset when looking up relocation entries while doing
nested call relocations.
perf-event
Alessandro Decina 3 years ago
parent e9bad0b61d
commit d9fc0f484f

@ -256,19 +256,20 @@ impl<'a> FunctionLinker<'a> {
continue; continue;
} }
let callee_address = if let Some(rel) = rel_info((ins_index * INS_SIZE) as u64) { let callee_address =
// We have a relocation entry for the instruction at `ins_index`, the address of if let Some(rel) = rel_info(((ins_index - start_ins) * INS_SIZE) as u64) {
// the callee is the address of the relocation's target symbol. // We have a relocation entry for the instruction at `ins_index`, the address of
rel_target_address(rel, self.symbol_table)? // the callee is the address of the relocation's target symbol.
} else { rel_target_address(rel, self.symbol_table)?
// The caller and the callee are in the same ELF section and this is a pc-relative } else {
// call. Resolve the pc-relative imm to an absolute address. // The caller and the callee are in the same ELF section and this is a pc-relative
let ins_size = INS_SIZE as i64; // call. Resolve the pc-relative imm to an absolute address.
(fun.section_offset as i64 let ins_size = INS_SIZE as i64;
+ ((ins_index - start_ins) as i64) * ins_size (fun.section_offset as i64
+ (program.instructions[ins_index].imm + 1) as i64 * ins_size) + ((ins_index - start_ins) as i64) * ins_size
as u64 + (program.instructions[ins_index].imm + 1) as i64 * ins_size)
}; as u64
};
// lookup and link the callee if it hasn't been linked already. `callee_ins_index` will // lookup and link the callee if it hasn't been linked already. `callee_ins_index` will
// contain the instruction index of the callee inside the program. // contain the instruction index of the callee inside the program.

Loading…
Cancel
Save