libc/modlib: free memory resource when rmmod elf

Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
dongjiuzhu1
2024-02-21 15:58:02 +08:00
committed by Xiang Xiao
parent 1f1d90de1c
commit fc1aefbeb3
5 changed files with 77 additions and 6 deletions
+33
View File
@@ -132,6 +132,34 @@ static inline int dlremove(FAR void *handle)
if (!modp->dynamic)
{
#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
int i;
for (i = 0; i < modp->nsect && modp->sectalloc[i] != NULL; i++)
{
# ifdef CONFIG_ARCH_USE_TEXT_HEAP
if (up_textheap_heapmember(modp->sectalloc[i]))
{
up_textheap_free(modp->sectalloc[i]);
continue;
}
# endif
# ifdef CONFIG_ARCH_USE_DATA_HEAP
if (up_dataheap_heapmember(modp->sectalloc[i]))
{
up_dataheap_free(modp->sectalloc[i]);
continue;
}
# endif
lib_free(modp->sectalloc[i]);
}
lib_free(modp->sectalloc);
modp->sectalloc = NULL;
modp->nsect = 0;
#else
if (modp->textalloc != NULL)
{
/* Free the module memory */
@@ -147,8 +175,13 @@ static inline int dlremove(FAR void *handle)
{
/* Free the module memory */
#if defined(CONFIG_ARCH_USE_DATA_HEAP)
up_dataheap_free((FAR void *)modp->dataalloc);
#else
lib_free((FAR void *)modp->dataalloc);
#endif
}
#endif
}
else
{
+5
View File
@@ -238,6 +238,11 @@ static inline FAR void *dlinsert(FAR const char *filename)
/* Save the load information */
#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
modp->sectalloc = (FAR void *)loadinfo.sectalloc;
modp->nsect = loadinfo.ehdr.e_shnum;
#endif
modp->textalloc = (FAR void *)loadinfo.textalloc;
modp->dataalloc = (FAR void *)loadinfo.datastart;
modp->dynamic = (loadinfo.ehdr.e_type == ET_DYN);
+1 -1
View File
@@ -87,7 +87,7 @@ int modlib_unload(FAR struct mod_loadinfo_s *loadinfo)
lib_free((FAR void *)loadinfo->sectalloc[i]);
}
lib_free(loadinfo->sectalloc);
lib_free(loadinfo->sectalloc);
#else
if (loadinfo->textalloc != 0)
{