File tree Expand file tree Collapse file tree 3 files changed +18
-7
lines changed
espflash/src/image_format Expand file tree Collapse file tree 3 files changed +18
-7
lines changed Original file line number Diff line number Diff line change @@ -47,6 +47,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
47
47
- Fixed typos in error variant names (#782 )
48
48
- Fix ` read-flash ` which didn't work with some lengths (#804 )
49
49
- espflash can now flash an ESP32-S2 in download mode over USB (#813 )
50
+ - Fixed a case where esplash transformed the firmware elf in a way that made it unbootable (#831 )
50
51
51
52
### Removed
52
53
Original file line number Diff line number Diff line change @@ -213,8 +213,14 @@ impl<'a> IdfBootloaderFormat<'a> {
213
213
214
214
let mut data = bytes_of ( & header) . to_vec ( ) ;
215
215
216
- let flash_segments: Vec < _ > = merge_adjacent_segments ( rom_segments ( chip, & elf) . collect ( ) ) ;
217
- let mut ram_segments: Vec < _ > = merge_adjacent_segments ( ram_segments ( chip, & elf) . collect ( ) ) ;
216
+ // The bootloader needs segments to be 4-byte aligned, but ensuring that
217
+ // alignment by padding segments might result in overlapping segments. We
218
+ // need to merge adjacent segments first to avoid the possibility of them
219
+ // overlapping, and then do the padding.
220
+ let flash_segments: Vec < _ > =
221
+ pad_align_segments ( merge_adjacent_segments ( rom_segments ( chip, & elf) . collect ( ) ) ) ;
222
+ let mut ram_segments: Vec < _ > =
223
+ pad_align_segments ( merge_adjacent_segments ( ram_segments ( chip, & elf) . collect ( ) ) ) ;
218
224
219
225
let mut checksum = ESP_CHECKSUM_MAGIC ;
220
226
let mut segment_count = 0 ;
@@ -446,6 +452,11 @@ fn merge_adjacent_segments(mut segments: Vec<Segment<'_>>) -> Vec<Segment<'_>> {
446
452
merged
447
453
}
448
454
455
+ fn pad_align_segments ( mut segments : Vec < Segment < ' _ > > ) -> Vec < Segment < ' _ > > {
456
+ segments. iter_mut ( ) . for_each ( |segment| segment. pad_align ( 4 ) ) ;
457
+ segments
458
+ }
459
+
449
460
/// Save a segment to the data buffer.
450
461
fn save_flash_segment (
451
462
data : & mut Vec < u8 > ,
Original file line number Diff line number Diff line change @@ -33,13 +33,12 @@ pub struct Segment<'a> {
33
33
34
34
impl < ' a > Segment < ' a > {
35
35
pub fn new ( addr : u32 , data : & ' a [ u8 ] ) -> Self {
36
- let mut segment = Segment {
36
+ // Do not pad the data here, as it might result in overlapping segments
37
+ // in the ELF file. The padding should be done after merging adjacent segments.
38
+ Segment {
37
39
addr,
38
40
data : Cow :: Borrowed ( data) ,
39
- } ;
40
- segment. pad_align ( 4 ) ;
41
-
42
- segment
41
+ }
43
42
}
44
43
45
44
/// Split of the first `count` bytes into a new segment, adjusting the
You can’t perform that action at this time.
0 commit comments