summaryrefslogtreecommitdiff
path: root/ao-tools/lib
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-04-09 12:48:54 -0700
committerKeith Packard <keithp@keithp.com>2017-04-09 12:48:54 -0700
commit04d4b17635fc9395c70aa0840971c00082f509ba (patch)
treeef9cfaf1cac508ecf925384c6da9e57c667b18b3 /ao-tools/lib
parent86d5119f19b5f3131d224982e011fd233b48aa22 (diff)
ao-elftohex: Add conditions for skipping ELF sections
Skip sections with size 0, or which are of type SHT_NOBITS or which don't have the SHF_ALLOC flag set. This avoids crashing on sections which don't have any data to copy. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao-tools/lib')
-rw-r--r--ao-tools/lib/ao-elf.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/ao-tools/lib/ao-elf.c b/ao-tools/lib/ao-elf.c
index c44102f8..cc127b62 100644
--- a/ao-tools/lib/ao-elf.c
+++ b/ao-tools/lib/ao-elf.c
@@ -186,6 +186,7 @@ load_write(struct ao_hex_image *from, uint32_t address, uint32_t length, void *d
return new;
}
+#define DBG 0
/*
* Construct a large in-memory block for all
* of the loaded sections of the program
@@ -202,7 +203,7 @@ get_load(Elf *e)
GElf_Phdr phdr;
GElf_Addr sh_paddr;
struct ao_hex_image *load = NULL;
-#if 0
+#if DBG
char *section_name;
#endif
size_t nshdr;
@@ -231,7 +232,7 @@ get_load(Elf *e)
/* Get the associated file section */
-#if 0
+#if DBG
fprintf (stderr, "offset %08x vaddr %08x paddr %08x filesz %08x memsz %08x\n",
(uint32_t) phdr.p_offset,
(uint32_t) phdr.p_vaddr,
@@ -252,18 +253,16 @@ get_load(Elf *e)
abort();
}
-#if 0
+#if DBG
section_name = elf_strptr(e, shstrndx, shdr.sh_name);
#endif
- if (phdr.p_offset <= shdr.sh_offset && shdr.sh_offset < phdr.p_offset + phdr.p_filesz) {
-
- if (shdr.sh_size == 0)
- continue;
-
+ if (shdr.sh_size != 0 && shdr.sh_type != SHT_NOBITS && (shdr.sh_flags & SHF_ALLOC) &&
+ phdr.p_offset <= shdr.sh_offset && shdr.sh_offset < phdr.p_offset + phdr.p_filesz)
+ {
sh_paddr = phdr.p_paddr + shdr.sh_offset - phdr.p_offset;
-#if 0
+#if DBG
fprintf (stderr, "\tsize %08x rom %08x exec %08x %s\n",
(uint32_t) shdr.sh_size,
(uint32_t) sh_paddr,