mirror of
https://github.com/apache/nuttx.git
synced 2026-06-04 14:53:47 +08:00
libc/modlib: free memory resource when rmmod elf
Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user