@@ -2900,7 +2900,7 @@ impl HubrisArchive {
29002900
29012901 loop {
29022902 let bases = gimli:: BaseAddresses :: default ( ) ;
2903- let mut ctx = gimli:: UninitializedUnwindContext :: new ( ) ;
2903+ let mut ctx = gimli:: UnwindContext :: new ( ) ;
29042904 let pc = * frameregs. get ( & ARMRegister :: PC ) . unwrap ( ) ;
29052905
29062906 //
@@ -3899,7 +3899,7 @@ impl HubrisObjectLoader {
38993899 }
39003900
39013901 let text = elf. section_headers . iter ( ) . find ( |sh| {
3902- if let Some ( Ok ( name) ) = elf. shdr_strtab . get ( sh. sh_name ) {
3902+ if let Some ( name) = elf. shdr_strtab . get_at ( sh. sh_name ) {
39033903 name == ".text"
39043904 } else {
39053905 false
@@ -3933,11 +3933,8 @@ impl HubrisObjectLoader {
39333933 continue ;
39343934 }
39353935
3936- let name = match elf. strtab . get ( sym. st_name ) {
3937- Some ( n) => n?,
3938- None => {
3939- bail ! ( "bad symbol in {}: {}" , object, sym. st_name) ;
3940- }
3936+ let Some ( name) = elf. strtab . get_at ( sym. st_name ) else {
3937+ bail ! ( "bad symbol in {}: {}" , object, sym. st_name) ;
39413938 } ;
39423939
39433940 //
@@ -4061,7 +4058,7 @@ impl HubrisObjectLoader {
40614058
40624059 if task == HubrisTask :: Kernel {
40634060 let apptable = elf. section_headers . iter ( ) . find ( |sh| {
4064- if let Some ( Ok ( name) ) = elf. shdr_strtab . get ( sh. sh_name ) {
4061+ if let Some ( name) = elf. shdr_strtab . get_at ( sh. sh_name ) {
40654062 name == ".hubris_app_table"
40664063 } else {
40674064 false
@@ -4211,32 +4208,28 @@ impl HubrisObjectLoader {
42114208 ) -> Result < ( ) > {
42124209 // Load all of the sections. This "load" operation just gets the data in
42134210 // RAM -- since we've already loaded the Elf file, this can't fail.
4214- let dwarf = gimli:: Dwarf :: < & [ u8 ] > :: load (
4211+ let loader = | id : gimli:: SectionId | {
42154212 // Load the normal DWARF section(s) from our Elf image.
4216- |id| {
4217- let sec_result = elf. section_headers . iter ( ) . find ( |sh| {
4218- if let Some ( Ok ( name) ) = elf. shdr_strtab . get ( sh. sh_name ) {
4219- name == id. name ( )
4220- } else {
4221- false
4222- }
4223- } ) ;
4224- if let Some ( sec) = sec_result {
4225- let offset = sec. sh_offset as usize ;
4226- let size = sec. sh_size as usize ;
4227- buffer. get ( offset..offset + size) . ok_or_else ( || {
4228- anyhow ! ( "bad offset/size for ELF section {}" , id. name( ) )
4229- } )
4213+ let sec_result = elf. section_headers . iter ( ) . find ( |sh| {
4214+ if let Some ( name) = elf. shdr_strtab . get_at ( sh. sh_name ) {
4215+ name == id. name ( )
42304216 } else {
4231- Ok ( & [ ] )
4217+ false
42324218 }
4233- } ,
4234- // We don't have a supplemental object file.
4235- |_| Ok ( & [ ] ) ,
4236- ) ?;
4219+ } ) ;
4220+ if let Some ( sec) = sec_result {
4221+ let offset = sec. sh_offset as usize ;
4222+ let size = sec. sh_size as usize ;
4223+ buffer. get ( offset..offset + size) . ok_or_else ( || {
4224+ anyhow ! ( "bad offset/size for ELF section {}" , id. name( ) )
4225+ } )
4226+ } else {
4227+ Ok ( [ ] . as_slice ( ) )
4228+ }
4229+ } ;
42374230
4238- // Borrow all sections wrapped in EndianSlices
4239- let dwarf = dwarf . borrow ( |section| {
4231+ let dwarf_sections = gimli :: DwarfSections :: load ( loader ) ? ;
4232+ let dwarf: gimli :: Dwarf < _ > = dwarf_sections . borrow ( |section| {
42404233 gimli:: EndianSlice :: new ( section, gimli:: LittleEndian )
42414234 } ) ;
42424235
@@ -4416,7 +4409,7 @@ impl HubrisObjectLoader {
44164409 . section_headers
44174410 . iter ( )
44184411 . find ( |sh| {
4419- if let Some ( Ok ( name) ) = elf. shdr_strtab . get ( sh. sh_name ) {
4412+ if let Some ( name) = elf. shdr_strtab . get_at ( sh. sh_name ) {
44204413 name == id
44214414 } else {
44224415 false
@@ -4445,7 +4438,7 @@ impl HubrisObjectLoader {
44454438 // If we have an idolatry definition, load that.
44464439 //
44474440 let idol = elf. section_headers . iter ( ) . find ( |sh| {
4448- if let Some ( Ok ( name) ) = elf. shdr_strtab . get ( sh. sh_name ) {
4441+ if let Some ( name) = elf. shdr_strtab . get_at ( sh. sh_name ) {
44494442 name == ".idolatry"
44504443 } else {
44514444 false
@@ -5326,7 +5319,10 @@ impl HubrisObjectLoader {
53265319 gimli:: AttributeValue :: RangeListsRef ( r) ,
53275320 ) = ( attr. name ( ) , attr. value ( ) )
53285321 {
5329- let raw_ranges = dwarf. ranges . raw_ranges ( r, unit. encoding ( ) ) ?;
5322+ let raw_ranges = dwarf. ranges . raw_ranges (
5323+ gimli:: RangeListsOffset ( r. 0 ) ,
5324+ unit. encoding ( ) ,
5325+ ) ?;
53305326 let raw_ranges: Vec < _ > = raw_ranges. collect ( ) ?;
53315327
53325328 for r in raw_ranges {
@@ -6333,7 +6329,7 @@ impl<'a> From<&'a HubrisUnion> for HubrisType<'a> {
63336329 }
63346330}
63356331
6336- impl < ' a > std:: fmt:: Display for HubrisType < ' a > {
6332+ impl std:: fmt:: Display for HubrisType < ' _ > {
63376333 fn fmt ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
63386334 match self {
63396335 HubrisType :: Struct ( ty) => write ! ( f, "struct {}" , ty. name) ,
@@ -6365,6 +6361,7 @@ pub struct HubrisStackSymbol<'a> {
63656361
63666362#[ derive( Clone , Debug ) ]
63676363pub struct HubrisStackFrame < ' a > {
6364+ /// Canonical frame address
63686365 pub cfa : u32 ,
63696366 pub sym : Option < HubrisStackSymbol < ' a > > ,
63706367 pub registers : BTreeMap < ARMRegister , u32 > ,
0 commit comments