diff options
author | mifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2007-12-17 20:52:37 +0000 |
---|---|---|
committer | mifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2007-12-17 20:52:37 +0000 |
commit | 9491aa15cd6d07fb12132b4b4160d10cdfc013e6 (patch) | |
tree | 660bb2c0fbe318902a853106240d9d18693c7598 /src/target | |
parent | 835e0436e8e982ab218b8ad6a68aee2f9507252d (diff) | |
download | openocd_libswd-9491aa15cd6d07fb12132b4b4160d10cdfc013e6.tar.gz openocd_libswd-9491aa15cd6d07fb12132b4b4160d10cdfc013e6.tar.bz2 openocd_libswd-9491aa15cd6d07fb12132b4b4160d10cdfc013e6.tar.xz openocd_libswd-9491aa15cd6d07fb12132b4b4160d10cdfc013e6.zip |
- fixed relocation problems with image loading. Relocation is handled
in a single centralized place, and it now works for binaries.
(thanks to oyvind Harboe)
git-svn-id: svn://svn.berlios.de/openocd/trunk@238 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/target')
-rw-r--r-- | src/target/image.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/target/image.c b/src/target/image.c index d20f9df2..5ecbb81d 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; }; |