summaryrefslogtreecommitdiffstats
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.c88
1 files changed, 61 insertions, 27 deletions
diff --git a/cpukit/libdl/rtl-obj.c b/cpukit/libdl/rtl-obj.c
index 6f1f2e4916..0a7763b3b2 100644
--- a/cpukit/libdl/rtl-obj.c
+++ b/cpukit/libdl/rtl-obj.c
@@ -158,6 +158,16 @@ rtems_rtl_obj_unresolved_dependent (rtems_rtl_obj* obj,
return ud->has_unresolved;
}
+static bool
+rtems_rtl_obj_unresolved_object (rtems_chain_node* node, void* data)
+{
+ rtems_rtl_obj* obj = (rtems_rtl_obj*) node;
+ rtems_rtl_obj_unresolved_data* ud;
+ ud = (rtems_rtl_obj_unresolved_data*) data;
+ ud->has_unresolved = (obj->flags & RTEMS_RTL_OBJ_UNRESOLVED) != 0;
+ return !ud->has_unresolved;
+}
+
bool
rtems_rtl_obj_unresolved (rtems_rtl_obj* obj)
{
@@ -169,12 +179,22 @@ rtems_rtl_obj_unresolved (rtems_rtl_obj* obj)
obj->oname, ud.has_unresolved ? "unresolved" : "resolved");
if (!ud.has_unresolved)
{
- rtems_rtl_obj_update_flags (RTEMS_RTL_OBJ_DEP_VISITED, 0);
- obj->flags |= RTEMS_RTL_OBJ_DEP_VISITED;
- rtems_rtl_obj_iterate_dependents (obj,
- rtems_rtl_obj_unresolved_dependent,
- &ud);
- rtems_rtl_obj_update_flags (RTEMS_RTL_OBJ_DEP_VISITED, 0);
+ if ((obj->flags & RTEMS_RTL_OBJ_BASE) != 0)
+ {
+ rtems_rtl_data* rtl = rtems_rtl_data_unprotected ();
+ rtems_rtl_chain_iterate (&rtl->objects,
+ rtems_rtl_obj_unresolved_object,
+ &ud);
+ }
+ else
+ {
+ rtems_rtl_obj_update_flags (RTEMS_RTL_OBJ_DEP_VISITED, 0);
+ obj->flags |= RTEMS_RTL_OBJ_DEP_VISITED;
+ rtems_rtl_obj_iterate_dependents (obj,
+ rtems_rtl_obj_unresolved_dependent,
+ &ud);
+ rtems_rtl_obj_update_flags (RTEMS_RTL_OBJ_DEP_VISITED, 0);
+ }
}
return ud.has_unresolved;
}
@@ -727,49 +747,57 @@ rtems_rtl_obj_iterate_dependents (rtems_rtl_obj* obj,
size_t
rtems_rtl_obj_text_size (const rtems_rtl_obj* obj)
{
- return rtems_rtl_obj_section_size (obj, RTEMS_RTL_OBJ_SECT_TEXT);
+ const uint32_t flags = RTEMS_RTL_OBJ_SECT_LOAD | RTEMS_RTL_OBJ_SECT_TEXT;
+ return rtems_rtl_obj_section_size (obj, flags);
}
uint32_t
rtems_rtl_obj_text_alignment (const rtems_rtl_obj* obj)
{
- return rtems_rtl_obj_section_alignment (obj, RTEMS_RTL_OBJ_SECT_TEXT);
+ const uint32_t flags = RTEMS_RTL_OBJ_SECT_LOAD | RTEMS_RTL_OBJ_SECT_TEXT;
+ return rtems_rtl_obj_section_alignment (obj, flags);
}
size_t
rtems_rtl_obj_const_size (const rtems_rtl_obj* obj)
{
- return rtems_rtl_obj_section_size (obj, RTEMS_RTL_OBJ_SECT_CONST);
+ const uint32_t flags = RTEMS_RTL_OBJ_SECT_LOAD | RTEMS_RTL_OBJ_SECT_CONST;
+ return rtems_rtl_obj_section_size (obj, flags);
}
uint32_t
-rtems_rtl_obj_eh_alignment (const rtems_rtl_obj* obj)
+rtems_rtl_obj_const_alignment (const rtems_rtl_obj* obj)
{
- return rtems_rtl_obj_section_alignment (obj, RTEMS_RTL_OBJ_SECT_EH);
+ const uint32_t flags = RTEMS_RTL_OBJ_SECT_LOAD | RTEMS_RTL_OBJ_SECT_CONST;
+ return rtems_rtl_obj_section_alignment (obj, flags);
}
-size_t
-rtems_rtl_obj_eh_size (const rtems_rtl_obj* obj)
+uint32_t
+rtems_rtl_obj_eh_alignment (const rtems_rtl_obj* obj)
{
- return rtems_rtl_obj_section_size (obj, RTEMS_RTL_OBJ_SECT_EH);
+ const uint32_t flags = RTEMS_RTL_OBJ_SECT_LOAD | RTEMS_RTL_OBJ_SECT_EH;
+ return rtems_rtl_obj_section_alignment (obj, flags);
}
-uint32_t
-rtems_rtl_obj_const_alignment (const rtems_rtl_obj* obj)
+size_t
+rtems_rtl_obj_eh_size (const rtems_rtl_obj* obj)
{
- return rtems_rtl_obj_section_alignment (obj, RTEMS_RTL_OBJ_SECT_CONST);
+ const uint32_t flags = RTEMS_RTL_OBJ_SECT_LOAD | RTEMS_RTL_OBJ_SECT_EH;
+ return rtems_rtl_obj_section_size (obj, flags);
}
size_t
rtems_rtl_obj_data_size (const rtems_rtl_obj* obj)
{
- return rtems_rtl_obj_section_size (obj, RTEMS_RTL_OBJ_SECT_DATA);
+ const uint32_t flags = RTEMS_RTL_OBJ_SECT_LOAD | RTEMS_RTL_OBJ_SECT_DATA;
+ return rtems_rtl_obj_section_size (obj, flags);
}
uint32_t
rtems_rtl_obj_data_alignment (const rtems_rtl_obj* obj)
{
- return rtems_rtl_obj_section_alignment (obj, RTEMS_RTL_OBJ_SECT_DATA);
+ const uint32_t flags = RTEMS_RTL_OBJ_SECT_LOAD | RTEMS_RTL_OBJ_SECT_DATA;
+ return rtems_rtl_obj_section_alignment (obj, flags);
}
size_t
@@ -790,8 +818,10 @@ rtems_rtl_obj_relocate (rtems_rtl_obj* obj,
rtems_rtl_obj_sect_handler handler,
void* data)
{
- uint32_t mask = RTEMS_RTL_OBJ_SECT_REL | RTEMS_RTL_OBJ_SECT_RELA;
- return rtems_rtl_obj_section_handler (mask, obj, fd, handler, data);
+ 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);
}
/**
@@ -1012,12 +1042,14 @@ rtems_rtl_obj_sections_loader (uint32_t mask,
}
else
{
+ /*
+ * This section is not to be loaded, clear the base.
+ */
sect->base = 0;
- rtems_rtl_set_error (errno, "section has no load/clear op");
- return false;
}
- base_offset += sect->size;
+ if (sect->base)
+ base_offset += sect->size;
++order;
@@ -1053,9 +1085,11 @@ rtems_rtl_obj_load_sections (rtems_rtl_obj* obj,
/*
* Set the sizes held in the object data. We need this for a fast reference.
*/
- obj->text_size = text_size;
- obj->eh_size = eh_size;
- obj->bss_size = bss_size;
+ obj->text_size = text_size;
+ obj->const_size = const_size;
+ obj->data_size = data_size;
+ obj->eh_size = eh_size;
+ obj->bss_size = bss_size;
/*
* Let the allocator manage the actual allocation. The user can use the