summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/sbtools/elf.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/utils/sbtools/elf.c b/utils/sbtools/elf.c
index 4b95025d8f..0590a24692 100644
--- a/utils/sbtools/elf.c
+++ b/utils/sbtools/elf.c
@@ -198,7 +198,6 @@ void elf_write_file(struct elf_params_t *params, elf_write_fn_t write, void *use
198 uint32_t text_strtbl = bss_strtbl + strlen(".bss") + 1; 198 uint32_t text_strtbl = bss_strtbl + strlen(".bss") + 1;
199 uint32_t shstrtab_strtbl = text_strtbl + strlen(".text") + 1; 199 uint32_t shstrtab_strtbl = text_strtbl + strlen(".text") + 1;
200 uint32_t strtbl_size = shstrtab_strtbl + strlen(".shstrtab") + 1; 200 uint32_t strtbl_size = shstrtab_strtbl + strlen(".shstrtab") + 1;
201
202 201
203 while(sec) 202 while(sec)
204 { 203 {
@@ -368,14 +367,15 @@ bool elf_read_file(struct elf_params_t *params, elf_read_fn_t read,
368 error_printf("invalid elf file: must target an arm machine\n"); 367 error_printf("invalid elf file: must target an arm machine\n");
369 if(ehdr.e_ehsize != sizeof(ehdr)) 368 if(ehdr.e_ehsize != sizeof(ehdr))
370 error_printf("invalid elf file: size header mismatch\n"); 369 error_printf("invalid elf file: size header mismatch\n");
371 if(ehdr.e_phentsize != sizeof(Elf32_Phdr)) 370 if(ehdr.e_phnum > 0 && ehdr.e_phentsize != sizeof(Elf32_Phdr))
372 error_printf("invalid elf file: program header size mismatch\n"); 371 error_printf("invalid elf file: program header size mismatch\n");
373 if(ehdr.e_shentsize != sizeof(Elf32_Shdr)) 372 if(ehdr.e_shnum > 0 && ehdr.e_shentsize != sizeof(Elf32_Shdr))
374 error_printf("invalid elf file: section header size mismatch\n"); 373 error_printf("invalid elf file: section header size mismatch\n");
375 if(ehdr.e_flags & EF_ARM_HASENTRY) 374 if(ehdr.e_flags & EF_ARM_HASENTRY)
376 elf_set_start_addr(params, ehdr.e_entry); 375 elf_set_start_addr(params, ehdr.e_entry);
377 376
378 char *strtab = NULL; 377 char *strtab = NULL;
378 if(ehdr.e_shstrndx != SHN_UNDEF)
379 { 379 {
380 Elf32_Shdr shstrtab; 380 Elf32_Shdr shstrtab;
381 if(read(user, ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize, 381 if(read(user, ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize,
@@ -406,15 +406,20 @@ bool elf_read_file(struct elf_params_t *params, elf_read_fn_t read,
406 error_printf("error read self section data"); 406 error_printf("error read self section data");
407 elf_add_load_section(params, shdr.sh_addr, shdr.sh_size, data); 407 elf_add_load_section(params, shdr.sh_addr, shdr.sh_size, data);
408 408
409 printf(user, false, "create load segment for %s\n", &strtab[shdr.sh_name]); 409 if(strtab)
410 printf(user, false, "create load segment for %s\n", &strtab[shdr.sh_name]);
410 } 411 }
411 else if(shdr.sh_type == SHT_NOBITS && shdr.sh_flags & SHF_ALLOC) 412 else if(shdr.sh_type == SHT_NOBITS && shdr.sh_flags & SHF_ALLOC)
412 { 413 {
413 elf_add_fill_section(params, shdr.sh_addr, shdr.sh_size, 0); 414 elf_add_fill_section(params, shdr.sh_addr, shdr.sh_size, 0);
414 printf(user, false, "create fill segment for %s\n", &strtab[shdr.sh_name]); 415 if(strtab)
416 printf(user, false, "create fill segment for %s\n", &strtab[shdr.sh_name]);
415 } 417 }
416 else 418 else
417 printf(user, false, "filter out %s\n", &strtab[shdr.sh_name], shdr.sh_type); 419 {
420 if(strtab)
421 printf(user, false, "filter out %s\n", &strtab[shdr.sh_name], shdr.sh_type);
422 }
418 423
419 } 424 }
420 return true; 425 return true;