From 97a3d78f92fa29d18647d8d3f5f0a4f0a21cb393 Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Mon, 14 Jul 2014 20:58:32 +0800 Subject: Fix rap/elf archive file load When loading an object file in an archive file for the first time, RTL complains that loader can not be found. It is because offset is bigger that cache->file_size the first time when file_size is still -1, while offset is positive because reading the archive file. This patch fixes ths problem. Flush the file_size to 0 but not -1, because file_size is unsigned type. --- rtl-obj-cache.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/rtl-obj-cache.c b/rtl-obj-cache.c index e71bbcb..9179b6a 100644 --- a/rtl-obj-cache.c +++ b/rtl-obj-cache.c @@ -56,7 +56,7 @@ void rtems_rtl_obj_cache_flush (rtems_rtl_obj_cache_t* cache) { cache->fd = -1; - cache->file_size = -1; + cache->file_size = 0; cache->level = 0; } @@ -75,15 +75,18 @@ rtems_rtl_obj_cache_read (rtems_rtl_obj_cache_t* cache, return false; } - if (offset > cache->file_size) + if (cache->fd == fd) { - rtems_rtl_set_error (EINVAL, "offset past end of file: offset=%i size=%i", - (int) offset, (int) cache->file_size); - return false; - } + if (offset > cache->file_size) + { + rtems_rtl_set_error (EINVAL, "offset past end of file: offset=%i size=%i", + (int) offset, (int) cache->file_size); + return false; + } - if ((offset + *length) > cache->file_size) - *length = cache->file_size - offset; + if ((offset + *length) > cache->file_size) + *length = cache->file_size - offset; + } while (true) { -- cgit v1.2.3