diff options
| author | Keith Packard <keithp@keithp.com> | 2017-04-09 12:48:54 -0700 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2017-04-22 11:52:34 -0600 | 
| commit | f036b35a6fe1e187b2faea5c4ddf72359b33a44f (patch) | |
| tree | b92c0efe9e495805489310c3e162b138b357cb01 | |
| parent | 1db7169b193808c733852054e9a4713cdbd76cea (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>
| -rw-r--r-- | ao-tools/ao-elftohex/ao-elftohex.c | 1 | ||||
| -rw-r--r-- | ao-tools/lib/ao-elf.c | 17 | 
2 files changed, 9 insertions, 9 deletions
| diff --git a/ao-tools/ao-elftohex/ao-elftohex.c b/ao-tools/ao-elftohex/ao-elftohex.c index 265908c5..f3ab0c38 100644 --- a/ao-tools/ao-elftohex/ao-elftohex.c +++ b/ao-tools/ao-elftohex/ao-elftohex.c @@ -19,6 +19,7 @@  #include <getopt.h>  #include <stdlib.h>  #include <string.h> +#include <unistd.h>  #include "ao-hex.h"  #include "ao-elf.h"  #include "ao-verbose.h" 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, | 
