1- use std:: { borrow:: Cow , collections:: HashMap } ;
1+ use std:: {
2+ borrow:: Cow ,
3+ collections:: { BTreeMap , HashMap } ,
4+ } ;
25
3- use anyhow:: { anyhow , bail, Result } ;
6+ use anyhow:: { bail, Result } ;
47use object:: {
58 elf, File , Object , ObjectSection , ObjectSymbol , Relocation , RelocationFlags , SectionIndex ,
69 SectionKind , Symbol ,
@@ -14,7 +17,7 @@ use unarm::{
1417use crate :: {
1518 arch:: { ObjArch , ProcessCodeResult } ,
1619 diff:: DiffObjConfig ,
17- obj:: { ObjInfo , ObjIns , ObjInsArg , ObjInsArgValue , ObjSection , SymbolRef } ,
20+ obj:: { ObjIns , ObjInsArg , ObjInsArgValue , ObjReloc , ObjSection } ,
1821} ;
1922
2023pub struct ObjArchArm {
@@ -50,28 +53,25 @@ impl ObjArchArm {
5053impl ObjArch for ObjArchArm {
5154 fn process_code (
5255 & self ,
53- obj : & ObjInfo ,
54- symbol_ref : SymbolRef ,
56+ address : u64 ,
57+ code : & [ u8 ] ,
58+ section_index : usize ,
59+ relocations : & [ ObjReloc ] ,
60+ line_info : & BTreeMap < u64 , u64 > ,
5561 config : & DiffObjConfig ,
5662 ) -> Result < ProcessCodeResult > {
57- let ( section, symbol) = obj. section_symbol ( symbol_ref) ;
58- let section = section. ok_or_else ( || anyhow ! ( "Code symbol section not found" ) ) ?;
59- let code = & section. data
60- [ symbol. section_address as usize ..( symbol. section_address + symbol. size ) as usize ] ;
61-
62- let start_addr = symbol. address as u32 ;
63- let end_addr = start_addr + symbol. size as u32 ;
63+ let start_addr = address as u32 ;
64+ let end_addr = start_addr + code. len ( ) as u32 ;
6465
6566 // Mapping symbols decide what kind of data comes after it. $a for ARM code, $t for Thumb code and $d for data.
66- let fallback_mappings =
67- [ DisasmMode { address : symbol. address as u32 , mapping : ParseMode :: Arm } ] ;
67+ let fallback_mappings = [ DisasmMode { address : start_addr, mapping : ParseMode :: Arm } ] ;
6868 let mapping_symbols = self
6969 . disasm_modes
70- . get ( & SectionIndex ( section . orig_index ) )
70+ . get ( & SectionIndex ( section_index ) )
7171 . map ( |x| x. as_slice ( ) )
7272 . unwrap_or ( & fallback_mappings) ;
7373 let first_mapping_idx =
74- match mapping_symbols. binary_search_by_key ( & ( symbol . address as u32 ) , |x| x. address ) {
74+ match mapping_symbols. binary_search_by_key ( & start_addr , |x| x. address ) {
7575 Ok ( idx) => idx,
7676 Err ( idx) => idx - 1 ,
7777 } ;
@@ -96,10 +96,9 @@ impl ObjArch for ObjArchArm {
9696 }
9797 }
9898
99- let line = section . line_info . range ( ..=address as u64 ) . last ( ) . map ( |( _, & b) | b) ;
99+ let line = line_info. range ( ..=address as u64 ) . last ( ) . map ( |( _, & b) | b) ;
100100
101- let reloc =
102- section. relocations . iter ( ) . find ( |r| ( r. address as u32 & !1 ) == address) . cloned ( ) ;
101+ let reloc = relocations. iter ( ) . find ( |r| ( r. address as u32 & !1 ) == address) . cloned ( ) ;
103102
104103 let mut reloc_arg = None ;
105104 if let Some ( reloc) = & reloc {
0 commit comments