diff options
-rw-r--r-- | utils/sbtools/elf.c | 17 |
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; |