X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Fimage.c;h=a0962b1f4d71cbf3a984efc4a912199d86a9ede2;hp=d20f9df270fd96dc4e7ac4ce6c8f573802e46f85;hb=02f3765351c9e25185b745b84f1a2604fb2149c7;hpb=e27696f6b04459e935a0a5f65f7f668cb02970dd diff --git a/src/target/image.c b/src/target/image.c index d20f9df270..a0962b1f4d 100644 --- a/src/target/image.c +++ b/src/target/image.c @@ -231,8 +231,7 @@ int image_ihex_buffer_complete(image_t *image) for (i = 0; i < image->num_sections; i++) { image->sections[i].private = section[i].private; - image->sections[i].base_address = section[i].base_address + - ((image->base_address_set) ? image->base_address : 0); + image->sections[i].base_address = section[i].base_address; image->sections[i].size = section[i].size; image->sections[i].flags = section[i].flags; } @@ -589,8 +588,7 @@ int image_mot_buffer_complete(image_t *image) for (i = 0; i < image->num_sections; i++) { image->sections[i].private = section[i].private; - image->sections[i].base_address = section[i].base_address + - ((image->base_address_set) ? image->base_address : 0); + image->sections[i].base_address = section[i].base_address; image->sections[i].size = section[i].size; image->sections[i].flags = section[i].flags; } @@ -647,11 +645,6 @@ int image_open(image_t *image, char *url, char *type_string) image->sections[0].base_address = 0x0; image->sections[0].size = image_binary->fileio.size; image->sections[0].flags = 0; - - if (image->base_address_set == 1) - image->sections[0].base_address = image->base_address; - - return ERROR_OK; } else if (image->type == IMAGE_IHEX) { @@ -741,6 +734,21 @@ int image_open(image_t *image, char *url, char *type_string) image->sections = NULL; image->type_private = NULL; } + + if (image->base_address_set) + { + // relocate + int section; + for (section=0; section < image->num_sections; section++) + { + image->sections[section].base_address+=image->base_address; + } + // we're done relocating. The two statements below are mainly + // for documenation purposes: stop anyone from empirically + // thinking they should use these values henceforth. + image->base_address=0; + image->base_address_set=0; + } return retval; }; @@ -813,6 +821,7 @@ int image_read_section(image_t *image, int section, u32 offset, u32 size, u8 *bu IMAGE_MEMORY_CACHE_SIZE, image_memory->cache) != ERROR_OK) { free(image_memory->cache); + image_memory->cache = NULL; return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE; } image_memory->cache_address = address & ~(IMAGE_MEMORY_CACHE_SIZE - 1); @@ -901,7 +910,10 @@ int image_close(image_t *image) fileio_close(&image_ihex->fileio); if (image_ihex->buffer) + { free(image_ihex->buffer); + image_ihex->buffer = NULL; + } } else if (image->type == IMAGE_ELF) { @@ -910,17 +922,26 @@ int image_close(image_t *image) fileio_close(&image_elf->fileio); if (image_elf->header) + { free(image_elf->header); + image_elf->header = NULL; + } if (image_elf->segments) + { free(image_elf->segments); + image_elf->segments = NULL; + } } else if (image->type == IMAGE_MEMORY) { image_memory_t *image_memory = image->type_private; if (image_memory->cache) + { free(image_memory->cache); + image_memory->cache = NULL; + } } else if (image->type == IMAGE_SRECORD) { @@ -929,7 +950,10 @@ int image_close(image_t *image) fileio_close(&image_mot->fileio); if (image_mot->buffer) + { free(image_mot->buffer); + image_mot->buffer = NULL; + } } else if (image->type == IMAGE_BUILDER) { @@ -938,14 +962,21 @@ int image_close(image_t *image) for (i = 0; i < image->num_sections; i++) { free(image->sections[i].private); + image->sections[i].private = NULL; } } if (image->type_private) + { free(image->type_private); + image->type_private = NULL; + } if (image->sections) + { free(image->sections); + image->sections = NULL; + } return ERROR_OK; } @@ -980,3 +1011,4 @@ int image_calculate_checksum(u8* buffer, u32 nbytes, u32* checksum) return ERROR_OK; } +