summaryrefslogtreecommitdiff
path: root/cpukit/libdl/rtl-obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libdl/rtl-obj.c')
-rw-r--r--cpukit/libdl/rtl-obj.c77
1 files changed, 55 insertions, 22 deletions
diff --git a/cpukit/libdl/rtl-obj.c b/cpukit/libdl/rtl-obj.c
index 0a7763b3b2..15e5bf1137 100644
--- a/cpukit/libdl/rtl-obj.c
+++ b/cpukit/libdl/rtl-obj.c
@@ -300,11 +300,14 @@ typedef struct
static bool
rtems_rtl_obj_sect_summer (rtems_chain_node* node, void* data)
{
- rtems_rtl_obj_sect* sect = (rtems_rtl_obj_sect*) node;
- rtems_rtl_obj_sect_summer_data* summer = data;
- if ((sect->flags & summer->mask) == summer->mask)
- summer->size =
- rtems_rtl_obj_align (summer->size, sect->alignment) + sect->size;
+ rtems_rtl_obj_sect* sect = (rtems_rtl_obj_sect*) node;
+ if ((sect->flags & RTEMS_RTL_OBJ_SECT_ARCH_ALLOC) == 0)
+ {
+ rtems_rtl_obj_sect_summer_data* summer = data;
+ if ((sect->flags & summer->mask) == summer->mask)
+ summer->size =
+ rtems_rtl_obj_align (summer->size, sect->alignment) + sect->size;
+ }
return true;
}
@@ -821,7 +824,9 @@ rtems_rtl_obj_relocate (rtems_rtl_obj* obj,
const uint32_t flags = (RTEMS_RTL_OBJ_SECT_LOAD |
RTEMS_RTL_OBJ_SECT_REL |
RTEMS_RTL_OBJ_SECT_RELA);
- return rtems_rtl_obj_section_handler (flags, obj, fd, handler, data);
+ bool r = rtems_rtl_obj_section_handler (flags, obj, fd, handler, data);
+ rtems_rtl_obj_update_flags (RTEMS_RTL_OBJ_RELOC_TAG, 0);
+ return r;
}
/**
@@ -993,7 +998,7 @@ rtems_rtl_obj_sections_link_order (uint32_t mask, rtems_rtl_obj* obj)
}
}
-static size_t
+static bool
rtems_rtl_obj_sections_loader (uint32_t mask,
rtems_rtl_obj* obj,
int fd,
@@ -1004,26 +1009,27 @@ rtems_rtl_obj_sections_loader (uint32_t mask,
rtems_chain_control* sections = &obj->sections;
rtems_chain_node* node = rtems_chain_first (sections);
size_t base_offset = 0;
- bool first = true;
int order = 0;
+ if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD_SECT))
+ printf ("rtl: loading section: mask:%08" PRIx32 " base:%p\n", mask, base);
+
while (!rtems_chain_is_tail (sections, node))
{
rtems_rtl_obj_sect* sect = (rtems_rtl_obj_sect*) node;
- if ((sect->size != 0) && ((sect->flags & mask) != 0))
+ if ((sect->size != 0) && ((sect->flags & mask) == mask))
{
if (sect->load_order == order)
{
- if (!first)
+ if ((sect->flags & RTEMS_RTL_OBJ_SECT_ARCH_ALLOC) == 0)
+ {
base_offset = rtems_rtl_obj_align (base_offset, sect->alignment);
-
- first = false;
-
- sect->base = base + base_offset;
+ sect->base = base + base_offset;
+ }
if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD_SECT))
- printf ("rtl: loading:%2d: %s -> %8p (s:%zi f:%04" PRIx32
+ printf ("rtl: loading:%2d: %s -> %p (s:%zi f:%04" PRIx32
" a:%" PRIu32 " l:%02d)\n",
order, sect->name, sect->base, sect->size,
sect->flags, sect->alignment, sect->link);
@@ -1038,7 +1044,7 @@ rtems_rtl_obj_sections_loader (uint32_t mask,
}
else if ((sect->flags & RTEMS_RTL_OBJ_SECT_ZERO) == RTEMS_RTL_OBJ_SECT_ZERO)
{
- memset (base + base_offset, 0, sect->size);
+ memset (sect->base, 0, sect->size);
}
else
{
@@ -1065,10 +1071,10 @@ rtems_rtl_obj_sections_loader (uint32_t mask,
}
bool
-rtems_rtl_obj_load_sections (rtems_rtl_obj* obj,
- int fd,
- rtems_rtl_obj_sect_handler handler,
- void* data)
+rtems_rtl_obj_alloc_sections (rtems_rtl_obj* obj,
+ int fd,
+ rtems_rtl_obj_sect_handler handler,
+ void* data)
{
size_t text_size;
size_t const_size;
@@ -1092,6 +1098,22 @@ rtems_rtl_obj_load_sections (rtems_rtl_obj* obj,
obj->bss_size = bss_size;
/*
+ * Perform any specific allocations for sections.
+ */
+ if (handler != NULL)
+ {
+ if (!rtems_rtl_obj_section_handler (RTEMS_RTL_OBJ_SECT_TYPES,
+ obj,
+ fd,
+ handler,
+ data))
+ {
+ obj->exec_size = 0;
+ return false;
+ }
+ }
+
+ /*
* Let the allocator manage the actual allocation. The user can use the
* standard heap or provide a specific allocator with memory protection.
*/
@@ -1129,10 +1151,21 @@ rtems_rtl_obj_load_sections (rtems_rtl_obj* obj,
rtems_rtl_obj_sections_link_order (RTEMS_RTL_OBJ_SECT_CONST, obj);
rtems_rtl_obj_sections_link_order (RTEMS_RTL_OBJ_SECT_EH, obj);
rtems_rtl_obj_sections_link_order (RTEMS_RTL_OBJ_SECT_DATA, obj);
+ rtems_rtl_obj_sections_link_order (RTEMS_RTL_OBJ_SECT_BSS, obj);
+ return true;
+}
+
+bool
+rtems_rtl_obj_load_sections (rtems_rtl_obj* obj,
+ int fd,
+ rtems_rtl_obj_sect_handler handler,
+ void* data)
+{
/*
- * Load all text then data then bss sections in seperate operations so each
- * type of section is grouped together.
+ * Load all text, data and bsssections in seperate operations so each type of
+ * section is grouped together. Finish by loading any architecure specific
+ * sections.
*/
if (!rtems_rtl_obj_sections_loader (RTEMS_RTL_OBJ_SECT_TEXT,
obj, fd, obj->text_base, handler, data) ||