@@ -28,6 +28,13 @@ pub struct Builder<'data> {
28
28
/// Use to set the file class when writing the ELF file.
29
29
pub is_64 : bool ,
30
30
/// The alignment of [`elf::PT_LOAD`] segments.
31
+ ///
32
+ /// This is an informational field and is not used when writing the ELF file.
33
+ /// It can be optionally be used when calling [`Segments::add_load_segment`].
34
+ ///
35
+ /// It is determined heuristically when reading the ELF file. Currently,
36
+ /// if all load segments have the same alignment, that alignment is used,
37
+ /// otherwise it is set to 1.
31
38
pub load_align : u64 ,
32
39
/// The file header.
33
40
pub header : Header ,
@@ -145,10 +152,11 @@ impl<'data> Builder<'data> {
145
152
for segment in segments {
146
153
if segment. p_type ( endian) == elf:: PT_LOAD {
147
154
let p_align = segment. p_align ( endian) . into ( ) ;
148
- if builder. load_align != 0 && builder. load_align != p_align {
149
- return Err ( Error :: new ( "Unsupported alignments for PT_LOAD segments" ) ) ;
155
+ if builder. load_align == 0 {
156
+ builder. load_align = p_align;
157
+ } else if builder. load_align != p_align {
158
+ builder. load_align = 1 ;
150
159
}
151
- builder. load_align = p_align;
152
160
}
153
161
154
162
let id = builder. segments . next_id ( ) ;
@@ -167,9 +175,8 @@ impl<'data> Builder<'data> {
167
175
marker : PhantomData ,
168
176
} ) ;
169
177
}
170
- if !builder. segments . is_empty ( ) && builder. load_align == 0 {
171
- // There should be at least one PT_LOAD segment.
172
- return Err ( Error :: new ( "Unsupported segments without a PT_LOAD segment" ) ) ;
178
+ if builder. load_align == 0 {
179
+ builder. load_align = 1 ;
173
180
}
174
181
175
182
for ( index, section) in sections. iter ( ) . enumerate ( ) . skip ( 1 ) {
@@ -2365,6 +2372,8 @@ impl<'data> Segments<'data> {
2365
2372
/// Add a new `PT_LOAD` segment to the table.
2366
2373
///
2367
2374
/// The file offset and address will be derived from the current maximum for any segment.
2375
+ /// The address will be chosen so that `p_paddr % align == p_offset % align`.
2376
+ /// You may wish to use [`Builder::load_align`] for the alignment.
2368
2377
pub fn add_load_segment ( & mut self , flags : u32 , align : u64 ) -> & mut Segment < ' data > {
2369
2378
let mut max_offset = 0 ;
2370
2379
let mut max_addr = 0 ;
0 commit comments