@@ -47,7 +47,7 @@ impl<'a> Loader<'a> {
47
47
}
48
48
}
49
49
50
- pub fn load ( & mut self , address : u64 ) -> Result < ( u64 , u64 ) , Error > {
50
+ pub fn load ( & mut self , load_addr : u64 ) -> Result < ( u64 , u64 , u64 ) , Error > {
51
51
let mut data: [ u8 ; 1024 ] = [ 0 ; 1024 ] ;
52
52
53
53
match self . file . read ( & mut data[ 0 ..512 ] ) {
@@ -102,6 +102,12 @@ impl<'a> Loader<'a> {
102
102
let entry_point = optional_region. read_u32 ( 16 ) ;
103
103
104
104
self . image_base = optional_region. read_u64 ( 24 ) ;
105
+ let address = if self . image_base != 0 {
106
+ // The image has desired load address
107
+ self . image_base
108
+ } else {
109
+ load_addr
110
+ } ;
105
111
self . image_size = optional_region. read_u32 ( 56 ) ;
106
112
let size_of_headers = optional_region. read_u32 ( 60 ) ;
107
113
@@ -210,7 +216,11 @@ impl<'a> Loader<'a> {
210
216
}
211
217
}
212
218
213
- Ok ( ( address + u64:: from ( entry_point) , u64:: from ( self . image_size ) ) )
219
+ Ok ( (
220
+ address + u64:: from ( entry_point) ,
221
+ address,
222
+ u64:: from ( self . image_size ) ,
223
+ ) )
214
224
}
215
225
}
216
226
@@ -235,8 +245,9 @@ mod tests {
235
245
alloc:: alloc ( layout)
236
246
} ;
237
247
238
- let ( a, size) = l. load ( fake_mem as u64 ) . expect ( "expect loading success" ) ;
239
- assert_eq ! ( a, fake_mem as u64 + 0x4000 ) ;
248
+ let ( entry, addr, size) = l. load ( fake_mem as u64 ) . expect ( "expect loading success" ) ;
249
+ assert_eq ! ( entry, fake_mem as u64 + 0x4000 ) ;
250
+ assert_eq ! ( addr, fake_mem as u64 ) ;
240
251
assert_eq ! ( size, 110_592 ) ;
241
252
}
242
253
}
0 commit comments