1- //! ELF (Executable and Linkable Format) file operations
1+ //! Binary application image formats
22
33use std:: {
44 borrow:: Cow ,
@@ -13,58 +13,10 @@ use xmas_elf::{
1313 ElfFile ,
1414} ;
1515
16+ pub use self :: esp_idf:: IdfBootloaderFormat ;
1617use crate :: targets:: Chip ;
1718
18- /// Operations for working with firmware images
19- pub trait FirmwareImage < ' a > {
20- /// Firmware image entry point
21- fn entry ( & self ) -> u32 ;
22-
23- /// Firmware image segments
24- fn segments ( & ' a self ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > ;
25-
26- /// Firmware image ROM segments
27- fn rom_segments ( & ' a self , chip : Chip ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > {
28- Box :: new (
29- self . segments ( )
30- . filter ( move |segment| chip. into_target ( ) . addr_is_flash ( segment. addr ) ) ,
31- )
32- }
33-
34- /// Firmware image RAM segments
35- fn ram_segments ( & ' a self , chip : Chip ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > {
36- Box :: new (
37- self . segments ( )
38- . filter ( move |segment| !chip. into_target ( ) . addr_is_flash ( segment. addr ) ) ,
39- )
40- }
41- }
42-
43- impl < ' a > FirmwareImage < ' a > for ElfFile < ' a > {
44- fn entry ( & self ) -> u32 {
45- self . header . pt2 . entry_point ( ) as u32
46- }
47-
48- fn segments ( & ' a self ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > {
49- Box :: new (
50- self . section_iter ( )
51- . filter ( |header| {
52- header. size ( ) > 0
53- && header. get_type ( ) == Ok ( ShType :: ProgBits )
54- && header. offset ( ) > 0
55- && header. address ( ) > 0
56- } )
57- . flat_map ( move |header| {
58- let addr = header. address ( ) as u32 ;
59- let data = match header. get_data ( self ) {
60- Ok ( SectionData :: Undefined ( data) ) => data,
61- _ => return None ,
62- } ;
63- Some ( Segment :: new ( addr, data) )
64- } ) ,
65- )
66- }
67- }
19+ mod esp_idf;
6820
6921/// A segment of code from the source ELF
7022#[ derive( Default , Clone , Eq ) ]
@@ -192,3 +144,38 @@ impl Ord for Segment<'_> {
192144 self . addr . cmp ( & other. addr )
193145 }
194146}
147+
148+ /// Returns an iterator over all RAM segments for a given chip and ELF file.
149+ pub ( crate ) fn ram_segments < ' a > (
150+ chip : Chip ,
151+ elf : & ' a ElfFile < ' a > ,
152+ ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > {
153+ Box :: new ( segments ( elf) . filter ( move |segment| !chip. into_target ( ) . addr_is_flash ( segment. addr ) ) )
154+ }
155+
156+ /// Returns an iterator over all ROM segments for a given chip and ELF file.
157+ pub ( crate ) fn rom_segments < ' a > (
158+ chip : Chip ,
159+ elf : & ' a ElfFile < ' a > ,
160+ ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > {
161+ Box :: new ( segments ( elf) . filter ( move |segment| chip. into_target ( ) . addr_is_flash ( segment. addr ) ) )
162+ }
163+
164+ fn segments < ' a > ( elf : & ' a ElfFile < ' a > ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > {
165+ Box :: new (
166+ elf. section_iter ( )
167+ . filter ( |header| {
168+ header. size ( ) > 0
169+ && header. get_type ( ) == Ok ( ShType :: ProgBits )
170+ && header. offset ( ) > 0
171+ && header. address ( ) > 0
172+ } )
173+ . flat_map ( move |header| {
174+ let addr = header. address ( ) as u32 ;
175+ match header. get_data ( elf) {
176+ Ok ( SectionData :: Undefined ( data) ) => Some ( Segment :: new ( addr, data) ) ,
177+ _ => None ,
178+ }
179+ } ) ,
180+ )
181+ }
0 commit comments