|
|
|
@ -360,24 +360,30 @@ impl<'a> FunctionLinker<'a> {
|
|
|
|
|
fun: &Function,
|
|
|
|
|
start: usize,
|
|
|
|
|
) -> Result<(), RelocationError> {
|
|
|
|
|
let off_adj = start - (fun.section_offset as usize / INS_SIZE);
|
|
|
|
|
let func_info = &fun.func_info.func_info;
|
|
|
|
|
let func_info = func_info.iter().map(|f| {
|
|
|
|
|
let mut new = *f;
|
|
|
|
|
new.insn_off = f.insn_off + off_adj as u32;
|
|
|
|
|
new
|
|
|
|
|
let func_info = func_info.iter().cloned().map(|mut info| {
|
|
|
|
|
// `start` is the new instruction offset of `fun` within `program`
|
|
|
|
|
info.insn_off = start as u32;
|
|
|
|
|
info
|
|
|
|
|
});
|
|
|
|
|
program.func_info.func_info.extend(func_info);
|
|
|
|
|
program.func_info.num_info = program.func_info.func_info.len() as u32;
|
|
|
|
|
|
|
|
|
|
let line_info = &fun.line_info.line_info;
|
|
|
|
|
let line_info = line_info.iter().map(|l| {
|
|
|
|
|
let mut new = *l;
|
|
|
|
|
new.insn_off = start as u32 + l.insn_off;
|
|
|
|
|
new
|
|
|
|
|
if !line_info.is_empty() {
|
|
|
|
|
// this is the original offset
|
|
|
|
|
let original_start_off = line_info[0].insn_off;
|
|
|
|
|
|
|
|
|
|
let line_info = line_info.iter().cloned().map(|mut info| {
|
|
|
|
|
// rebase offsets on top of start, which is the offset of the
|
|
|
|
|
// function in the program being linked
|
|
|
|
|
info.insn_off = start as u32 + (info.insn_off - original_start_off);
|
|
|
|
|
info
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
program.line_info.line_info.extend(line_info);
|
|
|
|
|
program.line_info.num_info = program.func_info.func_info.len() as u32;
|
|
|
|
|
}
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|