cpukit/libdl: Correctly account for section alignments

- Add the section alignment to the size as the allocator may not
  provide correctly aligned memory

- Only include symbols in the section when locating symbols. The
  powerpc was incorrectly adding SDATA BSS symbols to the BSS offset
  overrunning the section

Closes #4950
This commit is contained in:
Chris Johns
2023-08-28 13:21:48 +10:00
parent b9f11607b1
commit ac6de5a3e9
2 changed files with 13 additions and 19 deletions

View File

@@ -1032,6 +1032,7 @@ rtems_rtl_obj_sections_locate (uint32_t mask,
{
base_offset = rtems_rtl_obj_align (base_offset, sect->alignment);
sect->base = base + base_offset;
base_offset += sect->size;
}
if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD_SECT))
@@ -1040,9 +1041,6 @@ rtems_rtl_obj_sections_locate (uint32_t mask,
order, sect->name, sect->base, sect->size,
sect->flags, sect->alignment, sect->link);
if (sect->base)
base_offset += sect->size;
++order;
node = rtems_chain_first (sections);
@@ -1064,23 +1062,18 @@ rtems_rtl_obj_set_sizes (rtems_rtl_obj* obj)
size_t data_size;
size_t bss_size;
text_size = rtems_rtl_obj_text_size (obj);
/*
* The allocator may not align memory to the required boundary. Add
* the alignment size to the size allocated.
*/
text_size = rtems_rtl_obj_text_size (obj) + rtems_rtl_obj_text_alignment (obj);
tramp_size = rtems_rtl_obj_tramp_size (obj);
if (tramp_size != 0)
{
text_size += rtems_rtl_obj_tramp_alignment (obj);
tramp_size += rtems_rtl_obj_const_alignment (obj);
}
else
{
text_size += rtems_rtl_obj_const_alignment (obj);
}
const_size = rtems_rtl_obj_const_size (obj) + rtems_rtl_obj_eh_alignment (obj);
eh_size = rtems_rtl_obj_eh_size (obj) + rtems_rtl_obj_data_alignment (obj);
data_size = rtems_rtl_obj_data_size (obj) + rtems_rtl_obj_bss_alignment (obj);
bss_size = rtems_rtl_obj_bss_size (obj);
tramp_size += rtems_rtl_obj_tramp_alignment (obj);
const_size = rtems_rtl_obj_const_size (obj) + rtems_rtl_obj_const_alignment (obj);
eh_size = rtems_rtl_obj_eh_size (obj) + rtems_rtl_obj_eh_alignment (obj);
data_size = rtems_rtl_obj_data_size (obj) + rtems_rtl_obj_data_alignment (obj);
bss_size = rtems_rtl_obj_bss_size (obj) + rtems_rtl_obj_bss_alignment (obj);
/*
* Set the sizes held in the object data. We need this for a fast reference.

View File

@@ -32,6 +32,7 @@
RTEMS_RTL_TRACE_WARNING | \
RTEMS_RTL_TRACE_LOAD | \
RTEMS_RTL_TRACE_UNLOAD | \
RTEMS_RTL_TRACE_LOAD_SECT | \
RTEMS_RTL_TRACE_SYMBOL | \
RTEMS_RTL_TRACE_RELOC | \
RTEMS_RTL_TRACE_ALLOCATOR | \