@@ -218,6 +218,7 @@ int detect_file_format(void)
218
218
// ElfMem = (Elf*)ptr;
219
219
if (((((((Elf32_Ehdr*)ptrload)->e_machine ) & 0xFF ) == EM_68K) && ((((Elf32_Ehdr*)ptrload)->e_type ) == ET_EXEC)) || (!endianess && (((((Elf32_Ehdr*)ptrload)->e_machine ) & 0xFF00 ) == (EM_68K << 8 )) && ((((Elf32_Ehdr*)ptrload)->e_type ) == (ET_EXEC << 8 ))))
220
220
{
221
+ unsigned char * ptr = NULL ;
221
222
size_t NbrSect;
222
223
Elf* ElfMem = elf_memory ((char *)ptrload, linj);
223
224
if (!elf_getshdrnum (ElfMem, &NbrSect))
@@ -235,22 +236,42 @@ int detect_file_format(void)
235
236
PtrGElfShdr = gelf_getshdr (PtrElfScn, &GElfShdr);
236
237
switch (PtrGElfShdr->sh_type )
237
238
{
239
+ // Program data
238
240
case SHT_PROGBITS:
239
241
if ((PtrGElfShdr->sh_flags & (SHF_ALLOC | SHF_WRITE | SHF_EXECINSTR)))
240
242
{
241
243
if (PtrGElfShdr->sh_addr < loadadr)
242
244
{
243
245
loadadr = PtrGElfShdr->sh_addr ;
246
+ if (ptr < (ptrload + PtrGElfShdr->sh_offset ))
247
+ {
248
+ ptr = (ptrload + PtrGElfShdr->sh_offset );
249
+ }
244
250
}
245
251
}
252
+ else
253
+ {
254
+ linj -= PtrGElfShdr->sh_size ;
255
+ }
246
256
break ;
257
+ // Symbol table
258
+ case SHT_SYMTAB:
259
+ // String table
260
+ case SHT_STRTAB:
261
+ // Section header table entry unused
262
+ case SHT_NULL:
263
+ // Program space with no data (bss)
264
+ case SHT_NOBITS:
265
+ // reduce the size with the section's size
247
266
default :
267
+ linj -= PtrGElfShdr->sh_size ;
248
268
break ;
249
269
}
250
270
}
251
271
// get run address
252
272
// runadr = !endianess ? (uint32_t)PtrGElfEhdr->e_entry : ((((uint32_t)PtrGElfEhdr->e_entry & 0xff000000) >> 24) | (((uint32_t)PtrGElfEhdr->e_entry & 0x00ff0000) >> 8) | (((uint32_t)PtrGElfEhdr->e_entry & 0x0000ff00) << 8) | (((uint32_t)PtrGElfEhdr->e_entry & 0x000000ff) << 24));
253
273
runadr = (uint32_t )PtrGElfEhdr->e_entry ;
274
+ memcpy (imageadr, ptr, linj);
254
275
detected_format = format_ELF;
255
276
}
256
277
}
0 commit comments