+ else if (image->type == IMAGE_BUILDER)
+ {
+ memcpy(buffer, (u8*)image->sections[section].private + offset, size);
+ *size_read = size;
+ image->error_str[0] = '\0';
+
+ return ERROR_OK;
+ }
+
+ return ERROR_OK;
+}
+
+int image_add_section(image_t *image, u32 base, u32 size, int flags, u8 *data)
+{
+ /* only image builder supports adding sections */
+ if (image->type != IMAGE_BUILDER)
+ return ERROR_INVALID_ARGUMENTS;
+
+ /* see if it's enough to extend an existing section */
+ if (((image->sections[image->num_sections - 1].base_address + image->sections[image->num_sections - 1].size) == base)
+ && (image->sections[image->num_sections - 1].flags == flags))
+ {
+ u32 old_size = image->sections[image->num_sections - 1].size;
+ image->sections[image->num_sections - 1].size += size;
+ image->sections[image->num_sections - 1].private = realloc(image->sections[image->num_sections - 1].private, image->sections[image->num_sections - 1].size);
+ memcpy((u8*)image->sections[image->num_sections - 1].private + old_size, data, size);
+
+ return ERROR_OK;
+ }
+
+ /* allocate new section */
+ image->num_sections++;
+ image->sections = realloc(image->sections, sizeof(image_section_t) * image->num_sections);
+ image->sections[image->num_sections - 1].base_address = base;
+ image->sections[image->num_sections - 1].size = size;
+ image->sections[image->num_sections - 1].flags = flags;
+ image->sections[image->num_sections - 1].private = malloc(sizeof(u8) * size);
+ memcpy((u8*)image->sections[image->num_sections - 1].private, data, size);