diff options
author | Chris Johns <chrisj@rtems.org> | 2019-02-14 14:00:05 +1100 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2019-02-15 09:55:16 +1100 |
commit | e309f7769fab9eed69079445a3f7f2354ea993c3 (patch) | |
tree | e35b359d70d487a5f6f2b2af624f9c49ac68c93b /cpukit/libdl/rtl-obj.c | |
parent | e214ff4b636011bd149e3683c89aa982e361fd1c (diff) |
libdl: Allocator does not unlock and lock memory on loading.
Close #3692
Diffstat (limited to 'cpukit/libdl/rtl-obj.c')
-rw-r--r-- | cpukit/libdl/rtl-obj.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/cpukit/libdl/rtl-obj.c b/cpukit/libdl/rtl-obj.c index 15e5bf1137..378678435d 100644 --- a/cpukit/libdl/rtl-obj.c +++ b/cpukit/libdl/rtl-obj.c @@ -1000,6 +1000,7 @@ rtems_rtl_obj_sections_link_order (uint32_t mask, rtems_rtl_obj* obj) static bool rtems_rtl_obj_sections_loader (uint32_t mask, + rtems_rtl_alloc_tag tag, rtems_rtl_obj* obj, int fd, uint8_t* base, @@ -1014,6 +1015,8 @@ rtems_rtl_obj_sections_loader (uint32_t mask, if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD_SECT)) printf ("rtl: loading section: mask:%08" PRIx32 " base:%p\n", mask, base); + rtems_rtl_alloc_wr_enable (tag, base); + while (!rtems_chain_is_tail (sections, node)) { rtems_rtl_obj_sect* sect = (rtems_rtl_obj_sect*) node; @@ -1039,6 +1042,7 @@ rtems_rtl_obj_sections_loader (uint32_t mask, if (!handler (obj, fd, sect, data)) { sect->base = 0; + rtems_rtl_alloc_wr_disable (tag, base); return false; } } @@ -1067,6 +1071,8 @@ rtems_rtl_obj_sections_loader (uint32_t mask, node = rtems_chain_next (node); } + rtems_rtl_alloc_wr_disable (tag, base); + return true; } @@ -1168,14 +1174,19 @@ rtems_rtl_obj_load_sections (rtems_rtl_obj* obj, * sections. */ if (!rtems_rtl_obj_sections_loader (RTEMS_RTL_OBJ_SECT_TEXT, + rtems_rtl_alloc_text_tag (), obj, fd, obj->text_base, handler, data) || !rtems_rtl_obj_sections_loader (RTEMS_RTL_OBJ_SECT_CONST, + rtems_rtl_alloc_const_tag (), obj, fd, obj->const_base, handler, data) || !rtems_rtl_obj_sections_loader (RTEMS_RTL_OBJ_SECT_EH, + rtems_rtl_alloc_eh_tag (), obj, fd, obj->eh_base, handler, data) || !rtems_rtl_obj_sections_loader (RTEMS_RTL_OBJ_SECT_DATA, + rtems_rtl_alloc_data_tag (), obj, fd, obj->data_base, handler, data) || !rtems_rtl_obj_sections_loader (RTEMS_RTL_OBJ_SECT_BSS, + rtems_rtl_alloc_bss_tag (), obj, fd, obj->bss_base, handler, data)) { rtems_rtl_alloc_module_del (&obj->text_base, &obj->const_base, &obj->eh_base, |