summaryrefslogtreecommitdiff
path: root/ao-tools/lib/ao-elf.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-04-09 12:48:54 -0700
committerBdale Garbee <bdale@gag.com>2017-04-22 11:52:34 -0600
commitf036b35a6fe1e187b2faea5c4ddf72359b33a44f (patch)
treeb92c0efe9e495805489310c3e162b138b357cb01 /ao-tools/lib/ao-elf.c
parent1db7169b193808c733852054e9a4713cdbd76cea (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/ao-elf.c')
-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,