diff --git a/src/ext.rs b/src/ext.rs index a8a592b..c38aebf 100644 --- a/src/ext.rs +++ b/src/ext.rs @@ -8,7 +8,7 @@ pub fn update_call_index(opcodes: &mut elements::Opcodes, original_imports: usiz match opcode { &mut Call(ref mut call_index) => { if let Some(pos) = inserts.iter().position(|x| x.1 == *call_index) { - *call_index = (original_imports + pos) as u32; + *call_index = (original_imports + pos) as u32; } else if *call_index as usize > original_imports { *call_index += inserts.len() as u32; } @@ -86,9 +86,17 @@ pub fn externalize( if *func_index >= import_funcs_total as u32 { *func_index += replaces.len() as u32; } }, _ => {} - } + } } - }, + }, + &mut elements::Section::Element(ref mut elements_section) => { + for ref mut segment in elements_section.entries_mut() { + // update all indirect call addresses initial values + for func_index in segment.members_mut() { + if *func_index >= import_funcs_total as u32 { *func_index += replaces.len() as u32; } + } + } + }, _ => { } } } diff --git a/src/rules.rs b/src/rules.rs index d7a1bfe..f77eadc 100644 --- a/src/rules.rs +++ b/src/rules.rs @@ -256,11 +256,11 @@ pub struct Set { } impl Set { - fn new(entries: HashMap) -> Self { + pub fn new(entries: HashMap) -> Self { Set { entries: entries } } - fn process(&self, opcode: &elements::Opcode) -> u32 { + pub fn process(&self, opcode: &elements::Opcode) -> u32 { self.entries.get(&InstructionType::op(opcode)).map(|x| *x).unwrap_or(1) } } \ No newline at end of file