diff --git a/libs/libc/elf/elf_load.c b/libs/libc/elf/elf_load.c index 8536e8e5c68..13705a08c5e 100644 --- a/libs/libc/elf/elf_load.c +++ b/libs/libc/elf/elf_load.c @@ -869,9 +869,21 @@ int libelf_load(FAR struct mod_loadinfo_s *loadinfo) if (loadinfo->datasize > 0) { +# if defined(CONFIG_ARCH_USE_DATA_HEAP) && \ + defined(CONFIG_ARCH_USE_SEPARATED_SECTION) + loadinfo->datastart = + (uintptr_t)up_dataheap_memalign(".data", + loadinfo->dataalign, + loadinfo->datasize); +# elif defined(CONFIG_ARCH_USE_DATA_HEAP) + loadinfo->datastart = + (uintptr_t)up_dataheap_memalign(loadinfo->dataalign, + loadinfo->datasize); +# else loadinfo->datastart = (uintptr_t)lib_memalign(loadinfo->dataalign, loadinfo->datasize); +# endif if (!loadinfo->datastart) { berr("ERROR: Failed to allocate the module's data\n"); diff --git a/libs/libc/elf/elf_remove.c b/libs/libc/elf/elf_remove.c index 849d49a0998..8f7d54bed89 100644 --- a/libs/libc/elf/elf_remove.c +++ b/libs/libc/elf/elf_remove.c @@ -180,7 +180,11 @@ int libelf_uninit(FAR struct module_s *modp) #endif } +#ifdef CONFIG_ARCH_USE_DATA_HEAP + up_dataheap_free((FAR void *)modp->dataalloc); +#else lib_free((FAR void *)modp->dataalloc); +#endif } else { diff --git a/libs/libc/elf/elf_unload.c b/libs/libc/elf/elf_unload.c index 9754a4da00f..13168651ee3 100644 --- a/libs/libc/elf/elf_unload.c +++ b/libs/libc/elf/elf_unload.c @@ -96,7 +96,11 @@ int libelf_unload(FAR struct mod_loadinfo_s *loadinfo) if (loadinfo->datastart != 0) { +#ifdef CONFIG_ARCH_USE_DATA_HEAP + up_dataheap_free((FAR void *)loadinfo->datastart); +#else lib_free((FAR void *)loadinfo->datastart); +#endif loadinfo->datastart = 0; }