diff options
author | Chris Johns <chrisj@rtems.org> | 2012-11-30 20:54:07 +1100 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2012-11-30 20:54:07 +1100 |
commit | 9856d096995e701ce68c6e0107146c7be3518502 (patch) | |
tree | ac1bbf4272a23e54b16eb09f28128cea5398e091 /rtl-elf.c | |
parent | abb3dd4f73727756efd4856156acdbbbb271c26d (diff) |
Add a section handler to load sections.
Diffstat (limited to 'rtl-elf.c')
-rw-r--r-- | rtl-elf.c | 35 |
1 files changed, 34 insertions, 1 deletions
@@ -493,6 +493,39 @@ rtems_rtl_elf_symbols (rtems_rtl_obj_t* obj, } static bool +rtems_rtl_elf_loader (rtems_rtl_obj_t* obj, + int fd, + rtems_rtl_obj_sect_t* sect, + void* data) +{ + uint8_t* base_offset; + size_t len; + + if (lseek (fd, obj->ooffset + sect->offset, SEEK_SET) < 0) + { + rtems_rtl_set_error (errno, "section load seek failed"); + return false; + } + + base_offset = sect->base; + len = sect->size; + + while (len) + { + ssize_t r = read (fd, base_offset, len); + if (r <= 0) + { + rtems_rtl_set_error (errno, "section load read failed"); + return false; + } + base_offset += r; + len -= r; + } + + return true; +} + +static bool rtems_rtl_elf_parse_sections (rtems_rtl_obj_t* obj, int fd, Elf_Ehdr* ehdr) { rtems_rtl_obj_cache_t* sects; @@ -716,7 +749,7 @@ rtems_rtl_elf_file_load (rtems_rtl_obj_t* obj, int fd) obj->entry = (void*)(uintptr_t) ehdr.e_entry; - if (!rtems_rtl_obj_load_sections (obj, fd)) + if (!rtems_rtl_obj_load_sections (obj, fd, rtems_rtl_elf_loader, &ehdr)) return false; if (!rtems_rtl_obj_load_symbols (obj, fd, rtems_rtl_elf_symbols, &ehdr)) |